static int __init housekeeping_setup(char *str, enum hk_flags flags)
 {
-       cpumask_var_t non_housekeeping_mask;
-       cpumask_var_t tmp;
+       cpumask_var_t non_housekeeping_mask, housekeeping_staging;
 
        alloc_bootmem_cpumask_var(&non_housekeeping_mask);
        if (cpulist_parse(str, non_housekeeping_mask) < 0) {
                return 0;
        }
 
-       alloc_bootmem_cpumask_var(&tmp);
-       if (!housekeeping_flags) {
-               alloc_bootmem_cpumask_var(&housekeeping_mask);
-               cpumask_andnot(housekeeping_mask,
-                              cpu_possible_mask, non_housekeeping_mask);
+       alloc_bootmem_cpumask_var(&housekeeping_staging);
+       cpumask_andnot(housekeeping_staging,
+                      cpu_possible_mask, non_housekeeping_mask);
 
-               cpumask_andnot(tmp, cpu_present_mask, non_housekeeping_mask);
-               if (cpumask_empty(tmp)) {
+       if (!cpumask_intersects(cpu_present_mask, housekeeping_staging)) {
+               __cpumask_set_cpu(smp_processor_id(), housekeeping_staging);
+               __cpumask_clear_cpu(smp_processor_id(), non_housekeeping_mask);
+               if (!housekeeping_flags) {
                        pr_warn("Housekeeping: must include one present CPU, "
                                "using boot CPU:%d\n", smp_processor_id());
-                       __cpumask_set_cpu(smp_processor_id(), housekeeping_mask);
-                       __cpumask_clear_cpu(smp_processor_id(), non_housekeeping_mask);
                }
+       }
+
+       if (!housekeeping_flags) {
+               alloc_bootmem_cpumask_var(&housekeeping_mask);
+               cpumask_copy(housekeeping_mask, housekeeping_staging);
        } else {
-               cpumask_andnot(tmp, cpu_present_mask, non_housekeeping_mask);
-               if (cpumask_empty(tmp))
-                       __cpumask_clear_cpu(smp_processor_id(), non_housekeeping_mask);
-               cpumask_andnot(tmp, cpu_possible_mask, non_housekeeping_mask);
-               if (!cpumask_equal(tmp, housekeeping_mask)) {
+               if (!cpumask_equal(housekeeping_staging, housekeeping_mask)) {
                        pr_warn("Housekeeping: nohz_full= must match isolcpus=\n");
-                       free_bootmem_cpumask_var(tmp);
+                       free_bootmem_cpumask_var(housekeeping_staging);
                        free_bootmem_cpumask_var(non_housekeeping_mask);
                        return 0;
                }
        }
-       free_bootmem_cpumask_var(tmp);
+
+       free_bootmem_cpumask_var(housekeeping_staging);
 
        if ((flags & HK_FLAG_TICK) && !(housekeeping_flags & HK_FLAG_TICK)) {
                if (IS_ENABLED(CONFIG_NO_HZ_FULL)) {