Re: [PATCH v2 1/2] PCI: hv: Replace hv_vp_set with hv_vpset
On Mon, Jan 28, 2019 at 09:49:32PM -0800, Maya Nakamura wrote: > On Sun, Jan 27, 2019 at 05:11:48AM +, Michael Kelley wrote: > > From: Maya Nakamura Sent: Saturday, January > > 26, 2019 12:52 AM > > > > > > 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 > > > --- > > > Change in v2: > > > - None > > > > > > > Right -- there was no code change. But it's customary to note that > > you updated the commit message. > > > Thank you for your feedback. I will edit the change log in v3. > > > Reviewed-by: Michael Kelley I will add Michael's tag to v3 (unless Michael is not happy with that), it is missing there. Lorenzo
Re: [PATCH v2 1/2] PCI: hv: Replace hv_vp_set with hv_vpset
On Wed, Feb 13, 2019 at 02:20:29AM +, Michael Kelley wrote: > From: Lorenzo Pieralisi Sent: Tuesday, February > 12, 2019 8:35 AM > > > > On Mon, Jan 28, 2019 at 09:49:32PM -0800, Maya Nakamura wrote: > > > On Sun, Jan 27, 2019 at 05:11:48AM +, Michael Kelley wrote: > > > > From: Maya Nakamura Sent: Saturday, > > > > January 26, > > 2019 12:52 AM > > > > > > > > > > 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 > > > > > --- > > > > > Change in v2: > > > > > - None > > > > > > > > > > > > > Right -- there was no code change. But it's customary to note that > > > > you updated the commit message. > > > > > > > Thank you for your feedback. I will edit the change log in v3. > > > > > > > Reviewed-by: Michael Kelley > > > > Are you really sure there is no behavioural change ? What piece of > > code allocates hv_vpset.bank_contents[] memory with this patch applied ? > > > > I suspect the current code does not use hv_vpset for this specific > > reason, ie allocate struct hv_vp_set.masks array memory statically. > > > > There is indeed no behavior change. A full page of memory is > allocated in hv_pci_probe() so that we can be sure that the Hyper-V > hypercall arguments don't cross a page boundary. This page allows > more than enough space for the hv_vpset.bank_contents[] to grow > as needed (with one bit allocated in the masks for up to the limit > of 8192 CPUs allowed by Linux). A flexible array is used because > the hv_vpset structure is also used in some MMU hypercalls that > have two variable size arrays. I see, thanks for explaining. Lorenzo
Re: [PATCH v2 1/2] PCI: hv: Replace hv_vp_set with hv_vpset
On Mon, Jan 28, 2019 at 09:49:32PM -0800, Maya Nakamura wrote: > On Sun, Jan 27, 2019 at 05:11:48AM +, Michael Kelley wrote: > > From: Maya Nakamura Sent: Saturday, January > > 26, 2019 12:52 AM > > > > > > 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 > > > --- > > > Change in v2: > > > - None > > > > > > > Right -- there was no code change. But it's customary to note that > > you updated the commit message. > > > Thank you for your feedback. I will edit the change log in v3. > > > Reviewed-by: Michael Kelley Are you really sure there is no behavioural change ? What piece of code allocates hv_vpset.bank_contents[] memory with this patch applied ? I suspect the current code does not use hv_vpset for this specific reason, ie allocate struct hv_vp_set.masks array memory statically. Lorenzo
Re: [PATCH v2 1/2] PCI: hv: Replace hv_vp_set with hv_vpset
On Sun, Jan 27, 2019 at 05:11:48AM +, Michael Kelley wrote: > From: Maya Nakamura Sent: Saturday, January 26, > 2019 12:52 AM > > > > 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 > > --- > > Change in v2: > > - None > > > > Right -- there was no code change. But it's customary to note that > you updated the commit message. > Thank you for your feedback. I will edit the change log in v3. > Reviewed-by: Michael Kelley
[PATCH v2 1/2] PCI: hv: Replace hv_vp_set with hv_vpset
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 --- Change in v2: - None 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 9ba4d12c179c..da8b58d8630d 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