Wei! On Fri, Sep 10 2021 at 18:57, Wei Liu wrote: > -static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector) > +static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector, > + bool exclude_self) > { > struct hv_send_ipi_ex **arg; > struct hv_send_ipi_ex *ipi_arg; > @@ -123,7 +124,10 @@ static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector) > > if (!cpumask_equal(mask, cpu_present_mask)) { Not part of that patch, but is checking cpu_present_mask correct here? If so then this really lacks a comment for the casual reader. > ipi_arg->vp_set.format = HV_GENERIC_SET_SPARSE_4K; > - nr_bank = cpumask_to_vpset(&(ipi_arg->vp_set), mask); > + if (exclude_self) > + nr_bank = cpumask_to_vpset_noself(&(ipi_arg->vp_set), mask); > + else > + nr_bank = cpumask_to_vpset(&(ipi_arg->vp_set), mask); > } But, what happens in the case that mask == cpu_present_mask and exclude_self == true? AFAICT it ends up sending the IPI to all CPUs including self: if (!nr_bank) ipi_arg->vp_set.format = HV_GENERIC_SET_ALL; Not entirely correct, right? Thanks, tglx