bool force)
 {
        struct its_vpe *vpe = irq_data_get_irq_chip_data(d);
-       struct cpumask common, *table_mask;
+       unsigned int from, cpu = nr_cpu_ids;
+       struct cpumask *table_mask;
        unsigned long flags;
-       int from, cpu;
 
        /*
         * Changing affinity is mega expensive, so let's be as lazy as
         * If we are offered another CPU in the same GICv4.1 ITS
         * affinity, pick this one. Otherwise, any CPU will do.
         */
-       if (table_mask && cpumask_and(&common, mask_val, table_mask))
-               cpu = cpumask_test_cpu(from, &common) ? from : cpumask_first(&common);
-       else
+       if (table_mask)
+               cpu = cpumask_any_and(mask_val, table_mask);
+       if (cpu < nr_cpu_ids) {
+               if (cpumask_test_cpu(from, mask_val) &&
+                   cpumask_test_cpu(from, table_mask))
+                       cpu = from;
+       } else {
                cpu = cpumask_first(mask_val);
+       }
 
        if (from == cpu)
                goto out;