code: func (g *genericScheduler) processPreemptionWithExtenders(
  	pod *v1.Pod,
  	nodeToVictims map[*v1.Node]*schedulerapi.Victims,
  ) (map[*v1.Node]*schedulerapi.Victims, error) {
  	if len(nodeToVictims) > 0 {
  		for _, extender := range g.extenders {
  			if extender.SupportsPreemption() && extender.IsInterested(pod) {
  				newNodeToVictims, err := extender.ProcessPreemption(
  					pod,
  					nodeToVictims,
  					g.nodeInfoSnapshot.NodeInfoMap,
  				)
  				if err != nil {
  					if extender.IsIgnorable() {
  						klog.Warningf("Skipping extender %v as it returned error %v and has ignorable flag set",
  							extender, err)
  						continue
  					}
  					return nil, err
  				}
  
  				// Replace nodeToVictims with new result after preemption. So the
  				// rest of extenders can continue use it as parameter.
  				nodeToVictims = newNodeToVictims
  
  				// If node list becomes empty, no preemption can happen regardless of other extenders.
  				if len(nodeToVictims) == 0 {
  					break
  				}
  			}
  		}
  	}
  
  	return nodeToVictims, nil
  }
docs: // processPreemptionWithExtenders processes preemption with extenders