| From d159457b84395927b5a52adb72f748dd089ad5e5 Mon Sep 17 00:00:00 2001 |
| From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Date: Thu, 11 Feb 2016 16:10:24 -0500 |
| Subject: xen/pciback: Save the number of MSI-X entries to be copied later. |
| |
| commit d159457b84395927b5a52adb72f748dd089ad5e5 upstream. |
| |
| Commit 8135cf8b092723dbfcc611fe6fdcb3a36c9951c5 (xen/pciback: Save |
| xen_pci_op commands before processing it) broke enabling MSI-X because |
| it would never copy the resulting vectors into the response. The |
| number of vectors requested was being overwritten by the return value |
| (typically zero for success). |
| |
| Save the number of vectors before processing the op, so the correct |
| number of vectors are copied afterwards. |
| |
| Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Reviewed-by: Jan Beulich <jbeulich@suse.com> |
| Signed-off-by: David Vrabel <david.vrabel@citrix.com> |
| Signed-off-by: Zefan Li <lizefan@huawei.com> |
| --- |
| drivers/xen/xen-pciback/pciback_ops.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/xen/xen-pciback/pciback_ops.c |
| +++ b/drivers/xen/xen-pciback/pciback_ops.c |
| @@ -331,6 +331,9 @@ void xen_pcibk_do_op(struct work_struct |
| struct xen_pcibk_dev_data *dev_data = NULL; |
| struct xen_pci_op *op = &pdev->op; |
| int test_intx = 0; |
| +#ifdef CONFIG_PCI_MSI |
| + unsigned int nr = 0; |
| +#endif |
| |
| *op = pdev->sh_info->op; |
| barrier(); |
| @@ -359,6 +362,7 @@ void xen_pcibk_do_op(struct work_struct |
| op->err = xen_pcibk_disable_msi(pdev, dev, op); |
| break; |
| case XEN_PCI_OP_enable_msix: |
| + nr = op->value; |
| op->err = xen_pcibk_enable_msix(pdev, dev, op); |
| break; |
| case XEN_PCI_OP_disable_msix: |
| @@ -381,7 +385,7 @@ void xen_pcibk_do_op(struct work_struct |
| if (op->cmd == XEN_PCI_OP_enable_msix && op->err == 0) { |
| unsigned int i; |
| |
| - for (i = 0; i < op->value; i++) |
| + for (i = 0; i < nr; i++) |
| pdev->sh_info->op.msix_entries[i].vector = |
| op->msix_entries[i].vector; |
| } |