Message ID | 1547758038-5255-2-git-send-email-akaher@vmware.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | PCI: hv: Use vPCI protocol version 1.2 for v4.9 | expand |
On Fri, Jan 18, 2019 at 02:17:16AM +0530, Ajay Kaher wrote: > hv_do_hypercall() assumes that we pass a segment from a physically > contiguous buffer. A buffer allocated on the stack may not work if > CONFIG_VMAP_STACK=y is set. > > Use kmalloc() to allocate this buffer. > > Reported-by: Haiyang Zhang <haiyangz@microsoft.com> > Signed-off-by: Long Li <longli@microsoft.com> > Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> I did not sign off on this; please remove this. Signed-off-by should only be added by the person mentioned. > Acked-by: K. Y. Srinivasan <kys@microsoft.com> > Signed-off-by: Ajay Kaher <akaher@vmware.com> > --- > drivers/pci/host/pci-hyperv.c | 29 +++++++++++++++++++---------- > 1 file changed, 19 insertions(+), 10 deletions(-) > > diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c > index b4d8ccf..9e44adf 100644 > --- a/drivers/pci/host/pci-hyperv.c > +++ b/drivers/pci/host/pci-hyperv.c > @@ -383,6 +383,8 @@ struct hv_pcibus_device { > struct msi_domain_info msi_info; > struct msi_controller msi_chip; > struct irq_domain *irq_domain; > + struct retarget_msi_interrupt retarget_msi_interrupt_params; > + spinlock_t retarget_msi_interrupt_lock; > }; > > /* > @@ -780,34 +782,40 @@ void hv_irq_unmask(struct irq_data *data) > { > struct msi_desc *msi_desc = irq_data_get_msi_desc(data); > struct irq_cfg *cfg = irqd_cfg(data); > - struct retarget_msi_interrupt params; > + struct retarget_msi_interrupt *params; > struct hv_pcibus_device *hbus; > struct cpumask *dest; > struct pci_bus *pbus; > struct pci_dev *pdev; > int cpu; > + unsigned long flags; > > dest = irq_data_get_affinity_mask(data); > pdev = msi_desc_to_pci_dev(msi_desc); > pbus = pdev->bus; > hbus = container_of(pbus->sysdata, struct hv_pcibus_device, sysdata); > > - memset(¶ms, 0, sizeof(params)); > - params.partition_id = HV_PARTITION_ID_SELF; > - params.source = 1; /* MSI(-X) */ > - params.address = msi_desc->msg.address_lo; > - params.data = msi_desc->msg.data; > - params.device_id = (hbus->hdev->dev_instance.b[5] << 24) | > + spin_lock_irqsave(&hbus->retarget_msi_interrupt_lock, flags); > + > + params = &hbus->retarget_msi_interrupt_params; > + memset(params, 0, sizeof(*params)); > + params->partition_id = HV_PARTITION_ID_SELF; > + params->source = 1; /* MSI(-X) */ > + params->address = msi_desc->msg.address_lo; > + params->data = msi_desc->msg.data; > + params->device_id = (hbus->hdev->dev_instance.b[5] << 24) | > (hbus->hdev->dev_instance.b[4] << 16) | > (hbus->hdev->dev_instance.b[7] << 8) | > (hbus->hdev->dev_instance.b[6] & 0xf8) | > PCI_FUNC(pdev->devfn); > - params.vector = cfg->vector; > + params->vector = cfg->vector; > > for_each_cpu_and(cpu, dest, cpu_online_mask) > - params.vp_mask |= (1ULL << vmbus_cpu_number_to_vp_number(cpu)); > + params->vp_mask |= (1ULL << vmbus_cpu_number_to_vp_number(cpu)); > + > + hv_do_hypercall(HVCALL_RETARGET_INTERRUPT, params, NULL); > > - hv_do_hypercall(HVCALL_RETARGET_INTERRUPT, ¶ms, NULL); > + spin_unlock_irqrestore(&hbus->retarget_msi_interrupt_lock, flags); > > pci_msi_unmask_irq(data); > } > @@ -2212,6 +2220,7 @@ static int hv_pci_probe(struct hv_device *hdev, > INIT_LIST_HEAD(&hbus->resources_for_children); > spin_lock_init(&hbus->config_lock); > spin_lock_init(&hbus->device_list_lock); > + spin_lock_init(&hbus->retarget_msi_interrupt_lock); > sema_init(&hbus->enum_sem, 1); > init_completion(&hbus->remove_event); > > -- > 2.7.4 >
On Fri, Jan 18, 2019 at 02:17:16AM +0530, Ajay Kaher wrote: > hv_do_hypercall() assumes that we pass a segment from a physically > contiguous buffer. A buffer allocated on the stack may not work if > CONFIG_VMAP_STACK=y is set. > > Use kmalloc() to allocate this buffer. > Since you're going to need to resend this anyway, can you add in the commit message what this looks like from a user perspective? Presumably it's an occasional crash? regards, dan carpenter
On Mon, Jan 21, 2019 at 04:19:42PM +0300, Dan Carpenter wrote: > On Fri, Jan 18, 2019 at 02:17:16AM +0530, Ajay Kaher wrote: > > hv_do_hypercall() assumes that we pass a segment from a physically > > contiguous buffer. A buffer allocated on the stack may not work if > > CONFIG_VMAP_STACK=y is set. > > > > Use kmalloc() to allocate this buffer. > > > > Since you're going to need to resend this anyway, can you add in the > commit message what this looks like from a user perspective? Presumably > it's an occasional crash? > Never mind. I didn't realize this was a two year old patch. regards, dan carpenter
diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c index b4d8ccf..9e44adf 100644 --- a/drivers/pci/host/pci-hyperv.c +++ b/drivers/pci/host/pci-hyperv.c @@ -383,6 +383,8 @@ struct hv_pcibus_device { struct msi_domain_info msi_info; struct msi_controller msi_chip; struct irq_domain *irq_domain; + struct retarget_msi_interrupt retarget_msi_interrupt_params; + spinlock_t retarget_msi_interrupt_lock; }; /* @@ -780,34 +782,40 @@ void hv_irq_unmask(struct irq_data *data) { struct msi_desc *msi_desc = irq_data_get_msi_desc(data); struct irq_cfg *cfg = irqd_cfg(data); - struct retarget_msi_interrupt params; + struct retarget_msi_interrupt *params; struct hv_pcibus_device *hbus; struct cpumask *dest; struct pci_bus *pbus; struct pci_dev *pdev; int cpu; + unsigned long flags; dest = irq_data_get_affinity_mask(data); pdev = msi_desc_to_pci_dev(msi_desc); pbus = pdev->bus; hbus = container_of(pbus->sysdata, struct hv_pcibus_device, sysdata); - memset(¶ms, 0, sizeof(params)); - params.partition_id = HV_PARTITION_ID_SELF; - params.source = 1; /* MSI(-X) */ - params.address = msi_desc->msg.address_lo; - params.data = msi_desc->msg.data; - params.device_id = (hbus->hdev->dev_instance.b[5] << 24) | + spin_lock_irqsave(&hbus->retarget_msi_interrupt_lock, flags); + + params = &hbus->retarget_msi_interrupt_params; + memset(params, 0, sizeof(*params)); + params->partition_id = HV_PARTITION_ID_SELF; + params->source = 1; /* MSI(-X) */ + params->address = msi_desc->msg.address_lo; + params->data = msi_desc->msg.data; + params->device_id = (hbus->hdev->dev_instance.b[5] << 24) | (hbus->hdev->dev_instance.b[4] << 16) | (hbus->hdev->dev_instance.b[7] << 8) | (hbus->hdev->dev_instance.b[6] & 0xf8) | PCI_FUNC(pdev->devfn); - params.vector = cfg->vector; + params->vector = cfg->vector; for_each_cpu_and(cpu, dest, cpu_online_mask) - params.vp_mask |= (1ULL << vmbus_cpu_number_to_vp_number(cpu)); + params->vp_mask |= (1ULL << vmbus_cpu_number_to_vp_number(cpu)); + + hv_do_hypercall(HVCALL_RETARGET_INTERRUPT, params, NULL); - hv_do_hypercall(HVCALL_RETARGET_INTERRUPT, ¶ms, NULL); + spin_unlock_irqrestore(&hbus->retarget_msi_interrupt_lock, flags); pci_msi_unmask_irq(data); } @@ -2212,6 +2220,7 @@ static int hv_pci_probe(struct hv_device *hdev, INIT_LIST_HEAD(&hbus->resources_for_children); spin_lock_init(&hbus->config_lock); spin_lock_init(&hbus->device_list_lock); + spin_lock_init(&hbus->retarget_msi_interrupt_lock); sema_init(&hbus->enum_sem, 1); init_completion(&hbus->remove_event);