[PATCH] hv: fix msi affinity when device requests all possible CPU's

Bjorn Helgaas helgaas at kernel.org
Sun Jul 2 21:38:19 UTC 2017


On Wed, Jun 28, 2017 at 04:22:04PM -0700, Stephen Hemminger wrote:
> When Intel 10G (ixgbevf) is passed to a Hyper-V guest with SR-IOV,
> the driver requests affinity with all possible CPU's (0-239) even
> those CPU's are not online (and will never be). Because of this the device
> is unable to correctly get MSI interrupt's setup.
> 
> This was caused by the change in 4.12 that converted this affinity
> into all possible CPU's (0-31) but then host reports
> an error since this is larger than the number of online cpu's.
> 
> Previously, this worked (up to 4.12-rc1) because only online cpu's
> would be put in mask passed to the host.
> 
> This patch applies only to 4.12.
> The driver in linux-next needs a a different fix because of the changes
> to PCI host protocol version.

If Linus decides to postpone v4.12 a week, I can ask him to pull this.  But
I suspect he will release v4.12 today.  In that case, I don't know what to
do with this other than maybe send it to Greg for a -stable release.

> Fixes: 433fcf6b7b31 ("PCI: hv: Specify CPU_AFFINITY_ALL for MSI affinity when >= 32 CPUs")
> Signed-off-by: Stephen Hemminger <sthemmin at microsoft.com>
> ---
>  drivers/pci/host/pci-hyperv.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c
> index 84936383e269..3cadfcca3ae9 100644
> --- a/drivers/pci/host/pci-hyperv.c
> +++ b/drivers/pci/host/pci-hyperv.c
> @@ -900,10 +900,12 @@ static void hv_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
>  	 * processors because Hyper-V only supports 64 in a guest.
>  	 */
>  	affinity = irq_data_get_affinity_mask(data);
> +	cpumask_and(affinity, affinity, cpu_online_mask);
> +
>  	if (cpumask_weight(affinity) >= 32) {
>  		int_pkt->int_desc.cpu_mask = CPU_AFFINITY_ALL;
>  	} else {
> -		for_each_cpu_and(cpu, affinity, cpu_online_mask) {
> +		for_each_cpu(cpu, affinity) {
>  			int_pkt->int_desc.cpu_mask |=
>  				(1ULL << vmbus_cpu_number_to_vp_number(cpu));
>  		}
> -- 
> 2.11.0
> 


More information about the devel mailing list