提交 7c9954d0 编写于 作者: M Maya Nakamura 提交者: Xie XiuQi

PCI: hv: Refactor hv_irq_unmask() to use cpumask_to_vpset()

mainline inclusion
from mainline-5.0
commit 9bc1174280dd
category: bugfix
bugzilla: 12122
CVE: NA

-------------------------------------------------

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: NMaya Nakamura <m.maya.nakamura@gmail.com>
Signed-off-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: NMichael Kelley <mikelley@microsoft.com>
Reviewed-by: NVitaly Kuznetsov <vkuznets@redhat.com>
Tested-by: NVitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: NXiongfeng Wang <wangxiongfeng2@huawei.com>
Reviewed-by: NYao Hongbo <yaohongbo@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 8dddc3bd
...@@ -95,6 +95,7 @@ void __percpu **hyperv_pcpu_input_arg; ...@@ -95,6 +95,7 @@ void __percpu **hyperv_pcpu_input_arg;
EXPORT_SYMBOL_GPL(hyperv_pcpu_input_arg); EXPORT_SYMBOL_GPL(hyperv_pcpu_input_arg);
u32 hv_max_vp_index; u32 hv_max_vp_index;
EXPORT_SYMBOL_GPL(hv_max_vp_index);
static int hv_cpu_init(unsigned int cpu) static int hv_cpu_init(unsigned int cpu)
{ {
......
...@@ -391,8 +391,6 @@ struct hv_interrupt_entry { ...@@ -391,8 +391,6 @@ struct hv_interrupt_entry {
u32 data; u32 data;
}; };
#define HV_VP_SET_BANK_COUNT_MAX 5 /* current implementation limit */
/* /*
* flags for hv_device_interrupt_target.flags * flags for hv_device_interrupt_target.flags
*/ */
...@@ -908,12 +906,12 @@ static void hv_irq_unmask(struct irq_data *data) ...@@ -908,12 +906,12 @@ static void hv_irq_unmask(struct irq_data *data)
struct retarget_msi_interrupt *params; struct retarget_msi_interrupt *params;
struct hv_pcibus_device *hbus; struct hv_pcibus_device *hbus;
struct cpumask *dest; struct cpumask *dest;
cpumask_var_t tmp;
struct pci_bus *pbus; struct pci_bus *pbus;
struct pci_dev *pdev; struct pci_dev *pdev;
unsigned long flags; unsigned long flags;
u32 var_size = 0; u32 var_size = 0;
int cpu_vmbus; int cpu, nr_bank;
int cpu;
u64 res; u64 res;
dest = irq_data_get_effective_affinity_mask(data); dest = irq_data_get_effective_affinity_mask(data);
...@@ -953,29 +951,27 @@ static void hv_irq_unmask(struct irq_data *data) ...@@ -953,29 +951,27 @@ static void hv_irq_unmask(struct irq_data *data)
*/ */
params->int_target.flags |= params->int_target.flags |=
HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET; HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET;
params->int_target.vp_set.valid_bank_mask =
(1ull << HV_VP_SET_BANK_COUNT_MAX) - 1; if (!alloc_cpumask_var(&tmp, GFP_ATOMIC)) {
res = 1;
goto exit_unlock;
}
cpumask_and(tmp, dest, cpu_online_mask);
nr_bank = cpumask_to_vpset(&params->int_target.vp_set, tmp);
free_cpumask_var(tmp);
if (nr_bank <= 0) {
res = 1;
goto exit_unlock;
}
/* /*
* var-sized hypercall, var-size starts after vp_mask (thus * var-sized hypercall, var-size starts after vp_mask (thus
* vp_set.format does not count, but vp_set.valid_bank_mask * vp_set.format does not count, but vp_set.valid_bank_mask
* does). * does).
*/ */
var_size = 1 + HV_VP_SET_BANK_COUNT_MAX; var_size = 1 + nr_bank;
for_each_cpu_and(cpu, dest, cpu_online_mask) {
cpu_vmbus = hv_cpu_number_to_vp_number(cpu);
if (cpu_vmbus >= HV_VP_SET_BANK_COUNT_MAX * 64) {
dev_err(&hbus->hdev->device,
"too high CPU %d", cpu_vmbus);
res = 1;
goto exit_unlock;
}
params->int_target.vp_set.bank_contents[cpu_vmbus / 64] |=
(1ULL << (cpu_vmbus & 63));
}
} else { } else {
for_each_cpu_and(cpu, dest, cpu_online_mask) { for_each_cpu_and(cpu, dest, cpu_online_mask) {
params->int_target.vp_mask |= params->int_target.vp_mask |=
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册