diff options
author | Maya Nakamura <m.maya.nakamura@gmail.com> | 2019-03-01 02:04:17 -0500 |
---|---|---|
committer | Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> | 2019-03-01 06:45:46 -0500 |
commit | c8ccf7599ddac5fa48e06104c44b24709e21eed5 (patch) | |
tree | ebedb7baa160a979a365023e8971bf9246e5e273 /drivers/pci/controller/pci-hyperv.c | |
parent | 9bc1174280ddf7693e8c29a8f1743809e987ac37 (diff) |
PCI: hv: Refactor hv_irq_unmask() to use cpumask_to_vpset()
Remove the duplicate implementation of cpumask_to_vpset() and use the
shared implementation. Export hv_max_vp_index, which is required by
cpumask_to_vpset().
Signed-off-by: Maya Nakamura <m.maya.nakamura@gmail.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Tested-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Diffstat (limited to 'drivers/pci/controller/pci-hyperv.c')
-rw-r--r-- | drivers/pci/controller/pci-hyperv.c | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c index d71695db1ba0..95441a35eceb 100644 --- a/drivers/pci/controller/pci-hyperv.c +++ b/drivers/pci/controller/pci-hyperv.c | |||
@@ -391,8 +391,6 @@ struct hv_interrupt_entry { | |||
391 | u32 data; | 391 | u32 data; |
392 | }; | 392 | }; |
393 | 393 | ||
394 | #define HV_VP_SET_BANK_COUNT_MAX 5 /* current implementation limit */ | ||
395 | |||
396 | /* | 394 | /* |
397 | * flags for hv_device_interrupt_target.flags | 395 | * flags for hv_device_interrupt_target.flags |
398 | */ | 396 | */ |
@@ -908,12 +906,12 @@ static void hv_irq_unmask(struct irq_data *data) | |||
908 | struct retarget_msi_interrupt *params; | 906 | struct retarget_msi_interrupt *params; |
909 | struct hv_pcibus_device *hbus; | 907 | struct hv_pcibus_device *hbus; |
910 | struct cpumask *dest; | 908 | struct cpumask *dest; |
909 | cpumask_var_t tmp; | ||
911 | struct pci_bus *pbus; | 910 | struct pci_bus *pbus; |
912 | struct pci_dev *pdev; | 911 | struct pci_dev *pdev; |
913 | unsigned long flags; | 912 | unsigned long flags; |
914 | u32 var_size = 0; | 913 | u32 var_size = 0; |
915 | int cpu_vmbus; | 914 | int cpu, nr_bank; |
916 | int cpu; | ||
917 | u64 res; | 915 | u64 res; |
918 | 916 | ||
919 | dest = irq_data_get_effective_affinity_mask(data); | 917 | dest = irq_data_get_effective_affinity_mask(data); |
@@ -953,29 +951,27 @@ static void hv_irq_unmask(struct irq_data *data) | |||
953 | */ | 951 | */ |
954 | params->int_target.flags |= | 952 | params->int_target.flags |= |
955 | HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET; | 953 | HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET; |
956 | params->int_target.vp_set.valid_bank_mask = | 954 | |
957 | (1ull << HV_VP_SET_BANK_COUNT_MAX) - 1; | 955 | if (!alloc_cpumask_var(&tmp, GFP_ATOMIC)) { |
956 | res = 1; | ||
957 | goto exit_unlock; | ||
958 | } | ||
959 | |||
960 | cpumask_and(tmp, dest, cpu_online_mask); | ||
961 | nr_bank = cpumask_to_vpset(¶ms->int_target.vp_set, tmp); | ||
962 | free_cpumask_var(tmp); | ||
963 | |||
964 | if (nr_bank <= 0) { | ||
965 | res = 1; | ||
966 | goto exit_unlock; | ||
967 | } | ||
958 | 968 | ||
959 | /* | 969 | /* |
960 | * var-sized hypercall, var-size starts after vp_mask (thus | 970 | * var-sized hypercall, var-size starts after vp_mask (thus |
961 | * vp_set.format does not count, but vp_set.valid_bank_mask | 971 | * vp_set.format does not count, but vp_set.valid_bank_mask |
962 | * does). | 972 | * does). |
963 | */ | 973 | */ |
964 | var_size = 1 + HV_VP_SET_BANK_COUNT_MAX; | 974 | var_size = 1 + nr_bank; |
965 | |||
966 | for_each_cpu_and(cpu, dest, cpu_online_mask) { | ||
967 | cpu_vmbus = hv_cpu_number_to_vp_number(cpu); | ||
968 | |||
969 | if (cpu_vmbus >= HV_VP_SET_BANK_COUNT_MAX * 64) { | ||
970 | dev_err(&hbus->hdev->device, | ||
971 | "too high CPU %d", cpu_vmbus); | ||
972 | res = 1; | ||
973 | goto exit_unlock; | ||
974 | } | ||
975 | |||
976 | params->int_target.vp_set.bank_contents[cpu_vmbus / 64] |= | ||
977 | (1ULL << (cpu_vmbus & 63)); | ||
978 | } | ||
979 | } else { | 975 | } else { |
980 | for_each_cpu_and(cpu, dest, cpu_online_mask) { | 976 | for_each_cpu_and(cpu, dest, cpu_online_mask) { |
981 | params->int_target.vp_mask |= | 977 | params->int_target.vp_mask |= |