* [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset()
@ 2019-03-01 6:54 Maya Nakamura
2019-03-01 6:56 ` [PATCH v5 1/3] PCI: hv: Add __aligned(8) to struct retarget_msi_interrupt Maya Nakamura
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Maya Nakamura @ 2019-03-01 6:54 UTC (permalink / raw)
To: lorenzo.pieralisi, bhelgaas, linux-pci, kys, sthemmin, olaf, apw,
jasowang, mikelley, Alexander.Levin
Cc: linux-kernel, linux-hyperv, haiyangz, vkuznets, marcelo.cerri
This patchset removes a duplicate definition of VP set (hv_vp_set) and
uses the common definition (hv_vpset) that is used in other places. It
changes the order of the members in struct hv_pcibus_device due to
flexible array in hv_vpset.
It also removes the duplicate implementation of cpumask_to_vpset(), uses
the shared implementation, and exports hv_max_vp_index, which is
required by cpumask_to_vpset().
It adds __aligned(8) to struct retarget_msi_interrupt because Hyper-V
requires that hypercall arguments be aligned on an 8 byte boundary. This
is now a new patch, separate from one of the previous patches.
Maya Nakamura (3):
PCI: hv: Add __aligned(8) to struct retarget_msi_interrupt
PCI: hv: Replace hv_vp_set with hv_vpset
PCI: hv: Refactor hv_irq_unmask() to use cpumask_to_vpset()
arch/x86/hyperv/hv_init.c | 1 +
drivers/pci/controller/pci-hyperv.c | 61 +++++++++++++----------------
2 files changed, 29 insertions(+), 33 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v5 1/3] PCI: hv: Add __aligned(8) to struct retarget_msi_interrupt
2019-03-01 6:54 [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset() Maya Nakamura
@ 2019-03-01 6:56 ` Maya Nakamura
2019-03-01 6:59 ` [PATCH v5 2/3] PCI: hv: Replace hv_vp_set with hv_vpset Maya Nakamura
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Maya Nakamura @ 2019-03-01 6:56 UTC (permalink / raw)
To: lorenzo.pieralisi, bhelgaas, linux-pci, kys, sthemmin, olaf, apw,
jasowang, mikelley, Alexander.Levin
Cc: linux-kernel, linux-hyperv, haiyangz, vkuznets, marcelo.cerri
Because Hyper-V requires that hypercall arguments be aligned on an 8
byte boundary, add __aligned(8) to struct retarget_msi_interrupt.
Link: https://lore.kernel.org/lkml/87k1hlqlby.fsf@vitty.brq.redhat.com/
Signed-off-by: Maya Nakamura <m.maya.nakamura@gmail.com>
---
drivers/pci/controller/pci-hyperv.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
index 9ba4d12c179c..73862eef09ec 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -420,7 +420,7 @@ struct retarget_msi_interrupt {
struct hv_interrupt_entry int_entry;
u64 reserved2;
struct hv_device_interrupt_target int_target;
-} __packed;
+} __packed __aligned(8);
/*
* Driver specific state.
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v5 2/3] PCI: hv: Replace hv_vp_set with hv_vpset
2019-03-01 6:54 [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset() Maya Nakamura
2019-03-01 6:56 ` [PATCH v5 1/3] PCI: hv: Add __aligned(8) to struct retarget_msi_interrupt Maya Nakamura
@ 2019-03-01 6:59 ` Maya Nakamura
2019-03-01 7:04 ` [PATCH v5 3/3] PCI: hv: Refactor hv_irq_unmask() to use cpumask_to_vpset() Maya Nakamura
2019-03-01 11:55 ` [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset() Lorenzo Pieralisi
3 siblings, 0 replies; 5+ messages in thread
From: Maya Nakamura @ 2019-03-01 6:59 UTC (permalink / raw)
To: lorenzo.pieralisi, bhelgaas, linux-pci, kys, sthemmin, olaf, apw,
jasowang, mikelley, Alexander.Levin
Cc: linux-kernel, linux-hyperv, haiyangz, vkuznets, marcelo.cerri
Remove a duplicate definition of VP set (hv_vp_set) and use the common
definition (hv_vpset) that is used in other places.
Change the order of the members in struct hv_pcibus_device so that the
declaration of retarget_msi_interrupt_params is the last member. Struct
hv_vpset, which contains a flexible array, is nested two levels deep in
struct hv_pcibus_device via retarget_msi_interrupt_params.
Add a comment that retarget_msi_interrupt_params should be the last
member of struct hv_pcibus_device.
Signed-off-by: Maya Nakamura <m.maya.nakamura@gmail.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Tested-by: Vitaly Kuznetsov <vkuznets@redhat.com>
---
Changes in v5:
- Remove the code added in v4.
- Delete the v4 code change related comment from the commit message.
- Add the Reviewed-by and Tested-by tags.
Changes in v4:
- Add __aligned(8) to struct retarget_msi_interrupt.
- Update the commit message.
Change in v3:
- Correct the v2 change log.
Change in v2:
- Update the commit message.
drivers/pci/controller/pci-hyperv.c | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
index 73862eef09ec..d71695db1ba0 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -393,12 +393,6 @@ struct hv_interrupt_entry {
#define HV_VP_SET_BANK_COUNT_MAX 5 /* current implementation limit */
-struct hv_vp_set {
- u64 format; /* 0 (HvGenericSetSparse4k) */
- u64 valid_banks;
- u64 masks[HV_VP_SET_BANK_COUNT_MAX];
-};
-
/*
* flags for hv_device_interrupt_target.flags
*/
@@ -410,7 +404,7 @@ struct hv_device_interrupt_target {
u32 flags;
union {
u64 vp_mask;
- struct hv_vp_set vp_set;
+ struct hv_vpset vp_set;
};
};
@@ -460,12 +454,16 @@ struct hv_pcibus_device {
struct msi_controller msi_chip;
struct irq_domain *irq_domain;
- /* hypercall arg, must not cross page boundary */
- struct retarget_msi_interrupt retarget_msi_interrupt_params;
-
spinlock_t retarget_msi_interrupt_lock;
struct workqueue_struct *wq;
+
+ /* hypercall arg, must not cross page boundary */
+ struct retarget_msi_interrupt retarget_msi_interrupt_params;
+
+ /*
+ * Don't put anything here: retarget_msi_interrupt_params must be last
+ */
};
/*
@@ -955,12 +953,13 @@ static void hv_irq_unmask(struct irq_data *data)
*/
params->int_target.flags |=
HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET;
- params->int_target.vp_set.valid_banks =
+ params->int_target.vp_set.valid_bank_mask =
(1ull << HV_VP_SET_BANK_COUNT_MAX) - 1;
/*
* var-sized hypercall, var-size starts after vp_mask (thus
- * vp_set.format does not count, but vp_set.valid_banks does).
+ * vp_set.format does not count, but vp_set.valid_bank_mask
+ * does).
*/
var_size = 1 + HV_VP_SET_BANK_COUNT_MAX;
@@ -974,7 +973,7 @@ static void hv_irq_unmask(struct irq_data *data)
goto exit_unlock;
}
- params->int_target.vp_set.masks[cpu_vmbus / 64] |=
+ params->int_target.vp_set.bank_contents[cpu_vmbus / 64] |=
(1ULL << (cpu_vmbus & 63));
}
} else {
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v5 3/3] PCI: hv: Refactor hv_irq_unmask() to use cpumask_to_vpset()
2019-03-01 6:54 [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset() Maya Nakamura
2019-03-01 6:56 ` [PATCH v5 1/3] PCI: hv: Add __aligned(8) to struct retarget_msi_interrupt Maya Nakamura
2019-03-01 6:59 ` [PATCH v5 2/3] PCI: hv: Replace hv_vp_set with hv_vpset Maya Nakamura
@ 2019-03-01 7:04 ` Maya Nakamura
2019-03-01 11:55 ` [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset() Lorenzo Pieralisi
3 siblings, 0 replies; 5+ messages in thread
From: Maya Nakamura @ 2019-03-01 7:04 UTC (permalink / raw)
To: lorenzo.pieralisi, bhelgaas, linux-pci, kys, sthemmin, olaf, apw,
jasowang, mikelley, Alexander.Levin
Cc: linux-kernel, linux-hyperv, haiyangz, vkuznets, marcelo.cerri
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>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Tested-by: Vitaly Kuznetsov <vkuznets@redhat.com>
---
Changes in v5:
- Revise the commit message to clarify the changes based on feedback.
- Add the Reviewed-by and Tested-by tags.
Changes in v4:
- Replace GFP_KERNEL with GFP_ATOMIC for alloc_cpumask_var().
- Update the commit message.
Changes in v3:
- Modify to catch all failures from cpumask_to_vpset().
- Correct the v2 change log about the commit message.
Changes in v2:
- Remove unnecessary nr_bank initialization.
- Delete two unnecessary dev_err()'s.
- Unlock before returning.
- Update the commit message.
arch/x86/hyperv/hv_init.c | 1 +
drivers/pci/controller/pci-hyperv.c | 38 +++++++++++++----------------
2 files changed, 18 insertions(+), 21 deletions(-)
diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 7abb09e2eeb8..7f2eed1fc81b 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -96,6 +96,7 @@ void __percpu **hyperv_pcpu_input_arg;
EXPORT_SYMBOL_GPL(hyperv_pcpu_input_arg);
u32 hv_max_vp_index;
+EXPORT_SYMBOL_GPL(hv_max_vp_index);
static int hv_cpu_init(unsigned int cpu)
{
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 {
u32 data;
};
-#define HV_VP_SET_BANK_COUNT_MAX 5 /* current implementation limit */
-
/*
* flags for hv_device_interrupt_target.flags
*/
@@ -908,12 +906,12 @@ static void hv_irq_unmask(struct irq_data *data)
struct retarget_msi_interrupt *params;
struct hv_pcibus_device *hbus;
struct cpumask *dest;
+ cpumask_var_t tmp;
struct pci_bus *pbus;
struct pci_dev *pdev;
unsigned long flags;
u32 var_size = 0;
- int cpu_vmbus;
- int cpu;
+ int cpu, nr_bank;
u64 res;
dest = irq_data_get_effective_affinity_mask(data);
@@ -953,29 +951,27 @@ static void hv_irq_unmask(struct irq_data *data)
*/
params->int_target.flags |=
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(¶ms->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
* vp_set.format does not count, but vp_set.valid_bank_mask
* does).
*/
- var_size = 1 + HV_VP_SET_BANK_COUNT_MAX;
-
- 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));
- }
+ var_size = 1 + nr_bank;
} else {
for_each_cpu_and(cpu, dest, cpu_online_mask) {
params->int_target.vp_mask |=
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset()
2019-03-01 6:54 [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset() Maya Nakamura
` (2 preceding siblings ...)
2019-03-01 7:04 ` [PATCH v5 3/3] PCI: hv: Refactor hv_irq_unmask() to use cpumask_to_vpset() Maya Nakamura
@ 2019-03-01 11:55 ` Lorenzo Pieralisi
3 siblings, 0 replies; 5+ messages in thread
From: Lorenzo Pieralisi @ 2019-03-01 11:55 UTC (permalink / raw)
To: Maya Nakamura
Cc: bhelgaas, linux-pci, kys, sthemmin, olaf, apw, jasowang,
mikelley, Alexander.Levin, linux-kernel, linux-hyperv, haiyangz,
vkuznets, marcelo.cerri
On Fri, Mar 01, 2019 at 06:54:45AM +0000, Maya Nakamura wrote:
> This patchset removes a duplicate definition of VP set (hv_vp_set) and
> uses the common definition (hv_vpset) that is used in other places. It
> changes the order of the members in struct hv_pcibus_device due to
> flexible array in hv_vpset.
>
> It also removes the duplicate implementation of cpumask_to_vpset(), uses
> the shared implementation, and exports hv_max_vp_index, which is
> required by cpumask_to_vpset().
>
> It adds __aligned(8) to struct retarget_msi_interrupt because Hyper-V
> requires that hypercall arguments be aligned on an 8 byte boundary. This
> is now a new patch, separate from one of the previous patches.
>
> Maya Nakamura (3):
> PCI: hv: Add __aligned(8) to struct retarget_msi_interrupt
> PCI: hv: Replace hv_vp_set with hv_vpset
> PCI: hv: Refactor hv_irq_unmask() to use cpumask_to_vpset()
>
> arch/x86/hyperv/hv_init.c | 1 +
> drivers/pci/controller/pci-hyperv.c | 61 +++++++++++++----------------
> 2 files changed, 29 insertions(+), 33 deletions(-)
It looks all good, applied to pci/hv for v5.1, pending kbot checks.
Thanks,
Lorenzo
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-03-01 11:55 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-01 6:54 [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset() Maya Nakamura
2019-03-01 6:56 ` [PATCH v5 1/3] PCI: hv: Add __aligned(8) to struct retarget_msi_interrupt Maya Nakamura
2019-03-01 6:59 ` [PATCH v5 2/3] PCI: hv: Replace hv_vp_set with hv_vpset Maya Nakamura
2019-03-01 7:04 ` [PATCH v5 3/3] PCI: hv: Refactor hv_irq_unmask() to use cpumask_to_vpset() Maya Nakamura
2019-03-01 11:55 ` [PATCH v5 0/3] PCI: hv: Refactor hv_irq_unmask() to use hv_vpset and cpumask_to_vpset() Lorenzo Pieralisi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).