code: func (c *CriticalPodAdmissionHandler) HandleAdmissionFailure(admitPod *v1.Pod, failureReasons []predicates.PredicateFailureReason) (bool, []predicates.PredicateFailureReason, error) {
  	if !kubetypes.IsCriticalPod(admitPod) {
  		return false, failureReasons, nil
  	}
  	// InsufficientResourceError is not a reason to reject a critical pod.
  	// Instead of rejecting, we free up resources to admit it, if no other reasons for rejection exist.
  	nonResourceReasons := []predicates.PredicateFailureReason{}
  	resourceReasons := []*admissionRequirement{}
  	for _, reason := range failureReasons {
  		if r, ok := reason.(*predicates.InsufficientResourceError); ok {
  			resourceReasons = append(resourceReasons, &admissionRequirement{
  				resourceName: r.ResourceName,
  				quantity:     r.GetInsufficientAmount(),
  			})
  		} else {
  			nonResourceReasons = append(nonResourceReasons, reason)
  		}
  	}
  	if len(nonResourceReasons) > 0 {
  		// Return only reasons that are not resource related, since critical pods cannot fail admission for resource reasons.
  		return false, nonResourceReasons, nil
  	}
  	err := c.evictPodsToFreeRequests(admitPod, admissionRequirementList(resourceReasons))
  	// if no error is returned, preemption succeeded and the pod is safe to admit.
  	return err == nil, nil, err
  }
docs: // HandleAdmissionFailure gracefully handles admission rejection, and, in some cases,
  // to allow admission of the pod despite its previous failure.