code: func (c *CriticalPodAdmissionHandler) evictPodsToFreeRequests(admitPod *v1.Pod, insufficientResources admissionRequirementList) error {
  	podsToPreempt, err := getPodsToPreempt(admitPod, c.getPodsFunc(), insufficientResources)
  	if err != nil {
  		return fmt.Errorf("preemption: error finding a set of pods to preempt: %v", err)
  	}
  	klog.Infof("preemption: attempting to evict pods %v, in order to free up resources: %s", podsToPreempt, insufficientResources.toString())
  	for _, pod := range podsToPreempt {
  		status := v1.PodStatus{
  			Phase:   v1.PodFailed,
  			Message: message,
  			Reason:  events.PreemptContainer,
  		}
  		// record that we are evicting the pod
  		c.recorder.Eventf(pod, v1.EventTypeWarning, events.PreemptContainer, message)
  		// this is a blocking call and should only return when the pod and its containers are killed.
  		err := c.killPodFunc(pod, status, nil)
  		if err != nil {
  			return fmt.Errorf("preemption: pod %s failed to evict %v", format.Pod(pod), err)
  		}
  		klog.Infof("preemption: pod %s evicted successfully", format.Pod(pod))
  	}
  	return nil
  }
docs: // evictPodsToFreeRequests takes a list of insufficient resources, and attempts to free them by evicting pods
  // based on requests.  For example, if the only insufficient resource is 200Mb of memory, this function could
  // evict a pod with request=250Mb.