* [PATCH v2 2/3] VFIO-AER: Vfio-pci driver changes for supporting AER @ 2013-01-28 9:54 Pandarathil, Vijaymohan R 2013-01-28 19:31 ` Alex Williamson 0 siblings, 1 reply; 4+ messages in thread From: Pandarathil, Vijaymohan R @ 2013-01-28 9:54 UTC (permalink / raw) To: Alex Williamson, Gleb Natapov, Bjorn Helgaas, Blue Swirl, Ortiz, Lance E Cc: kvm@vger.kernel.org, qemu-devel@nongnu.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org - New VFIO_SET_IRQ ioctl option to pass the eventfd that is signalled when an error occurs in the vfio_pci_device - Register pci_error_handler for the vfio_pci driver - When the device encounters an error, the error handler registered by the vfio_pci driver gets invoked by the AER infrastructure - In the error handler, signal the eventfd registered for the device. - This results in the qemu eventfd handler getting invoked and appropriate action taken for the guest. Signed-off-by: Vijay Mohan Pandarathil <vijaymohan.pandarathil@hp.com> --- drivers/vfio/pci/vfio_pci.c | 44 ++++++++++++++++++++++++++++++++++++- drivers/vfio/pci/vfio_pci_intrs.c | 32 +++++++++++++++++++++++++++ drivers/vfio/pci/vfio_pci_private.h | 1 + include/uapi/linux/vfio.h | 3 +++ 4 files changed, 79 insertions(+), 1 deletion(-) diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index b28e66c..ff2a078 100644 --- a/drivers/vfio/pci/vfio_pci.c +++ b/drivers/vfio/pci/vfio_pci.c @@ -196,7 +196,9 @@ static int vfio_pci_get_irq_count(struct vfio_pci_device *vdev, int irq_type) return (flags & PCI_MSIX_FLAGS_QSIZE) + 1; } - } + } else if (irq_type == VFIO_PCI_ERR_IRQ_INDEX) + if (pci_is_pcie(vdev->pdev)) + return 1; return 0; } @@ -223,9 +225,18 @@ static long vfio_pci_ioctl(void *device_data, if (vdev->reset_works) info.flags |= VFIO_DEVICE_FLAGS_RESET; + if (pci_is_pcie(vdev->pdev)) { + info.flags |= VFIO_DEVICE_FLAGS_PCI_AER; + info.flags |= VFIO_DEVICE_FLAGS_PCI_AER_NOTIFY; + } + info.num_regions = VFIO_PCI_NUM_REGIONS; info.num_irqs = VFIO_PCI_NUM_IRQS; + /* Expose only implemented IRQs */ + if (!(info.flags & VFIO_DEVICE_FLAGS_PCI_AER_NOTIFY)) + info.num_irqs--; + return copy_to_user((void __user *)arg, &info, minsz); } else if (cmd == VFIO_DEVICE_GET_REGION_INFO) { @@ -302,6 +313,10 @@ static long vfio_pci_ioctl(void *device_data, if (info.argsz < minsz || info.index >= VFIO_PCI_NUM_IRQS) return -EINVAL; + if ((info.index == VFIO_PCI_ERR_IRQ_INDEX) && + !pci_is_pcie(vdev->pdev)) + return -EINVAL; + info.flags = VFIO_IRQ_INFO_EVENTFD; info.count = vfio_pci_get_irq_count(vdev, info.index); @@ -538,11 +553,38 @@ static void vfio_pci_remove(struct pci_dev *pdev) kfree(vdev); } +static pci_ers_result_t vfio_err_detected(struct pci_dev *pdev, + pci_channel_state_t state) +{ + struct vfio_pci_device *vpdev; + void *vdev; + + vdev = vfio_device_get_from_dev(&pdev->dev); + if (vdev == NULL) + return PCI_ERS_RESULT_DISCONNECT; + + vpdev = vfio_device_data(vdev); + if (vpdev == NULL) + return PCI_ERS_RESULT_DISCONNECT; + + if (vpdev->err_trigger) + eventfd_signal(vpdev->err_trigger, 1); + + vfio_device_put_vdev(vdev); + + return PCI_ERS_RESULT_CAN_RECOVER; +} + +static const struct pci_error_handlers vfio_err_handlers = { + .error_detected = vfio_err_detected, +}; + static struct pci_driver vfio_pci_driver = { .name = "vfio-pci", .id_table = NULL, /* only dynamic ids */ .probe = vfio_pci_probe, .remove = vfio_pci_remove, + .err_handler = &vfio_err_handlers, }; static void __exit vfio_pci_cleanup(void) diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c index 3639371..f003e08 100644 --- a/drivers/vfio/pci/vfio_pci_intrs.c +++ b/drivers/vfio/pci/vfio_pci_intrs.c @@ -745,6 +745,31 @@ static int vfio_pci_set_msi_trigger(struct vfio_pci_device *vdev, return 0; } +static int vfio_pci_set_err_eventfd(struct vfio_pci_device *vdev, + unsigned index, unsigned start, + unsigned count, uint32_t flags, void *data) +{ + if ((index == VFIO_PCI_ERR_IRQ_INDEX) && + (flags & VFIO_IRQ_SET_DATA_EVENTFD) && + pci_is_pcie(vdev->pdev)) { + + int32_t fd = *(int32_t *)data; + + if (fd == -1) { + if (vdev->err_trigger) + eventfd_ctx_put(vdev->err_trigger); + vdev->err_trigger = NULL; + return 0; + } else if (fd >= 0) { + vdev->err_trigger = eventfd_ctx_fdget(fd); + if (IS_ERR(vdev->err_trigger)) + return PTR_ERR(vdev->err_trigger); + return 0; + } else + return -EINVAL; + } + return -EINVAL; +} int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev, uint32_t flags, unsigned index, unsigned start, unsigned count, void *data) @@ -779,6 +804,13 @@ int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev, uint32_t flags, break; } break; + case VFIO_PCI_ERR_IRQ_INDEX: + switch (flags & VFIO_IRQ_SET_ACTION_TYPE_MASK) { + case VFIO_IRQ_SET_ACTION_TRIGGER: + if (pci_is_pcie(vdev->pdev)) + func = vfio_pci_set_err_eventfd; + break; + } } if (!func) diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfio_pci_private.h index 611827c..daee62f 100644 --- a/drivers/vfio/pci/vfio_pci_private.h +++ b/drivers/vfio/pci/vfio_pci_private.h @@ -55,6 +55,7 @@ struct vfio_pci_device { bool bardirty; struct pci_saved_state *pci_saved_state; atomic_t refcnt; + struct eventfd_ctx *err_trigger; }; #define is_intx(vdev) (vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX) diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 4758d1b..e81eb4d 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -147,6 +147,8 @@ struct vfio_device_info { __u32 flags; #define VFIO_DEVICE_FLAGS_RESET (1 << 0) /* Device supports reset */ #define VFIO_DEVICE_FLAGS_PCI (1 << 1) /* vfio-pci device */ +#define VFIO_DEVICE_FLAGS_PCI_AER (1 << 2) /* AER capable */ +#define VFIO_DEVICE_FLAGS_PCI_AER_NOTIFY (1 << 3) /* Supports aer notify */ __u32 num_regions; /* Max region index + 1 */ __u32 num_irqs; /* Max IRQ index + 1 */ }; @@ -310,6 +312,7 @@ enum { VFIO_PCI_INTX_IRQ_INDEX, VFIO_PCI_MSI_IRQ_INDEX, VFIO_PCI_MSIX_IRQ_INDEX, + VFIO_PCI_ERR_IRQ_INDEX, VFIO_PCI_NUM_IRQS }; -- 1.7.11.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 2/3] VFIO-AER: Vfio-pci driver changes for supporting AER 2013-01-28 9:54 [PATCH v2 2/3] VFIO-AER: Vfio-pci driver changes for supporting AER Pandarathil, Vijaymohan R @ 2013-01-28 19:31 ` Alex Williamson 2013-01-29 13:24 ` Alex Williamson 0 siblings, 1 reply; 4+ messages in thread From: Alex Williamson @ 2013-01-28 19:31 UTC (permalink / raw) To: Pandarathil, Vijaymohan R Cc: Gleb Natapov, Bjorn Helgaas, Blue Swirl, Ortiz, Lance E, kvm@vger.kernel.org, qemu-devel@nongnu.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org On Mon, 2013-01-28 at 09:54 +0000, Pandarathil, Vijaymohan R wrote: > - New VFIO_SET_IRQ ioctl option to pass the eventfd that is signalled when > an error occurs in the vfio_pci_device > > - Register pci_error_handler for the vfio_pci driver > > - When the device encounters an error, the error handler registered by > the vfio_pci driver gets invoked by the AER infrastructure > > - In the error handler, signal the eventfd registered for the device. > > - This results in the qemu eventfd handler getting invoked and > appropriate action taken for the guest. > > Signed-off-by: Vijay Mohan Pandarathil <vijaymohan.pandarathil@hp.com> > --- > drivers/vfio/pci/vfio_pci.c | 44 ++++++++++++++++++++++++++++++++++++- > drivers/vfio/pci/vfio_pci_intrs.c | 32 +++++++++++++++++++++++++++ > drivers/vfio/pci/vfio_pci_private.h | 1 + > include/uapi/linux/vfio.h | 3 +++ > 4 files changed, 79 insertions(+), 1 deletion(-) > > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > index b28e66c..ff2a078 100644 > --- a/drivers/vfio/pci/vfio_pci.c > +++ b/drivers/vfio/pci/vfio_pci.c > @@ -196,7 +196,9 @@ static int vfio_pci_get_irq_count(struct vfio_pci_device *vdev, int irq_type) > > return (flags & PCI_MSIX_FLAGS_QSIZE) + 1; > } > - } > + } else if (irq_type == VFIO_PCI_ERR_IRQ_INDEX) > + if (pci_is_pcie(vdev->pdev)) > + return 1; > > return 0; > } > @@ -223,9 +225,18 @@ static long vfio_pci_ioctl(void *device_data, > if (vdev->reset_works) > info.flags |= VFIO_DEVICE_FLAGS_RESET; > > + if (pci_is_pcie(vdev->pdev)) { > + info.flags |= VFIO_DEVICE_FLAGS_PCI_AER; > + info.flags |= VFIO_DEVICE_FLAGS_PCI_AER_NOTIFY; Not sure this second flag should be AER specific or if it's even needed, see below for more comments on this. > + } > + > info.num_regions = VFIO_PCI_NUM_REGIONS; > info.num_irqs = VFIO_PCI_NUM_IRQS; > > + /* Expose only implemented IRQs */ > + if (!(info.flags & VFIO_DEVICE_FLAGS_PCI_AER_NOTIFY)) > + info.num_irqs--; I'm having second thoughts on this, see further below. > + > return copy_to_user((void __user *)arg, &info, minsz); > > } else if (cmd == VFIO_DEVICE_GET_REGION_INFO) { > @@ -302,6 +313,10 @@ static long vfio_pci_ioctl(void *device_data, > if (info.argsz < minsz || info.index >= VFIO_PCI_NUM_IRQS) > return -EINVAL; > > + if ((info.index == VFIO_PCI_ERR_IRQ_INDEX) && > + !pci_is_pcie(vdev->pdev)) > + return -EINVAL; > + Perhaps we could incorporate the index test above this too? switch (info.index) { case VFIO_PCI_INTX_IRQ_INDEX: ... VFIO_PCI_MSIX_IRQ_INDEX: break; case VFIO_PCI_ERR_IRQ_INDEX: if (pci_is_pcie(vdev->pdev)) break; default: return -EINVAL; } This is more similar to how I've re-written the same for the proposed VGA/legacy I/O support. > info.flags = VFIO_IRQ_INFO_EVENTFD; > > info.count = vfio_pci_get_irq_count(vdev, info.index); > @@ -538,11 +553,38 @@ static void vfio_pci_remove(struct pci_dev *pdev) > kfree(vdev); > } > > +static pci_ers_result_t vfio_err_detected(struct pci_dev *pdev, > + pci_channel_state_t state) This is actually AER specific, right? So perhaps it should be vfio_pci_aer_err_detected? Also, please follow existing whitespace usage throughout, tabs followed by spaces to align function parameter wrap. > +{ > + struct vfio_pci_device *vpdev; > + void *vdev; struct vfio_device *vdev; > + > + vdev = vfio_device_get_from_dev(&pdev->dev); > + if (vdev == NULL) > + return PCI_ERS_RESULT_DISCONNECT; > + > + vpdev = vfio_device_data(vdev); > + if (vpdev == NULL) > + return PCI_ERS_RESULT_DISCONNECT; > + > + if (vpdev->err_trigger) > + eventfd_signal(vpdev->err_trigger, 1); > + > + vfio_device_put_vdev(vdev); > + > + return PCI_ERS_RESULT_CAN_RECOVER; > +} > + > +static const struct pci_error_handlers vfio_err_handlers = { > + .error_detected = vfio_err_detected, > +}; > + > static struct pci_driver vfio_pci_driver = { > .name = "vfio-pci", > .id_table = NULL, /* only dynamic ids */ > .probe = vfio_pci_probe, > .remove = vfio_pci_remove, > + .err_handler = &vfio_err_handlers, > }; > > static void __exit vfio_pci_cleanup(void) > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c > index 3639371..f003e08 100644 > --- a/drivers/vfio/pci/vfio_pci_intrs.c > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > @@ -745,6 +745,31 @@ static int vfio_pci_set_msi_trigger(struct vfio_pci_device *vdev, > return 0; > } > > +static int vfio_pci_set_err_eventfd(struct vfio_pci_device *vdev, > + unsigned index, unsigned start, > + unsigned count, uint32_t flags, void *data) Rename to vfio_pci_set_err_trigger? The other functions mostly only support eventfd too. > +{ > + if ((index == VFIO_PCI_ERR_IRQ_INDEX) && > + (flags & VFIO_IRQ_SET_DATA_EVENTFD) && > + pci_is_pcie(vdev->pdev)) { It would clean up the indentation to have this be: if (!supported stuff) return -EINVAL; do stuff Testing the index seems overly paranoid here given the caller. The caller is also already testing pci_is_pcie. Why not support DATA_NONE and DATA_BOOL? It would be useful loopback testing for userspace to be able to trigger an AER notification. > + > + int32_t fd = *(int32_t *)data; > + > + if (fd == -1) { > + if (vdev->err_trigger) > + eventfd_ctx_put(vdev->err_trigger); > + vdev->err_trigger = NULL; > + return 0; > + } else if (fd >= 0) { > + vdev->err_trigger = eventfd_ctx_fdget(fd); > + if (IS_ERR(vdev->err_trigger)) > + return PTR_ERR(vdev->err_trigger); > + return 0; > + } else > + return -EINVAL; > + } > + return -EINVAL; > +} > int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev, uint32_t flags, > unsigned index, unsigned start, unsigned count, > void *data) > @@ -779,6 +804,13 @@ int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev, uint32_t flags, > break; > } > break; > + case VFIO_PCI_ERR_IRQ_INDEX: > + switch (flags & VFIO_IRQ_SET_ACTION_TYPE_MASK) { > + case VFIO_IRQ_SET_ACTION_TRIGGER: > + if (pci_is_pcie(vdev->pdev)) > + func = vfio_pci_set_err_eventfd; > + break; > + } > } > > if (!func) > diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfio_pci_private.h > index 611827c..daee62f 100644 > --- a/drivers/vfio/pci/vfio_pci_private.h > +++ b/drivers/vfio/pci/vfio_pci_private.h > @@ -55,6 +55,7 @@ struct vfio_pci_device { > bool bardirty; > struct pci_saved_state *pci_saved_state; > atomic_t refcnt; > + struct eventfd_ctx *err_trigger; > }; > > #define is_intx(vdev) (vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX) > diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h > index 4758d1b..e81eb4d 100644 > --- a/include/uapi/linux/vfio.h > +++ b/include/uapi/linux/vfio.h > @@ -147,6 +147,8 @@ struct vfio_device_info { > __u32 flags; > #define VFIO_DEVICE_FLAGS_RESET (1 << 0) /* Device supports reset */ > #define VFIO_DEVICE_FLAGS_PCI (1 << 1) /* vfio-pci device */ > +#define VFIO_DEVICE_FLAGS_PCI_AER (1 << 2) /* AER capable */ > +#define VFIO_DEVICE_FLAGS_PCI_AER_NOTIFY (1 << 3) /* Supports aer notify */ > > __u32 num_regions; /* Max region index + 1 */ > __u32 num_irqs; /* Max IRQ index + 1 */ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ This part of the vfio spec has been causing me trouble. We discussed it a bit offline, but I'd appreciate any feedback from you or the broader community. num_foo indicates a count, however the comment clearly states this is a max index. With the VGA patches I've been playing with using them as a count where userspace would probe indexes until it finds num_foo implemented (ie. INFO_IRQ/REGION returns >=0). I guess the original intention was was to probe up to num_foo-1 and unavailable indexes return <0. Looking at it again, this seems like the more deterministic approach. For instance, if we add LEGACY_IOPORT and LEGACY_MMIO regions at index 8 & 9, then ERR region at index 10, it's easier for userspace to know to stop searching at index 10 instead of probing indexes it may not understand trying to find the full count. Does that sound right? So Vijay, please don't shot me for changing my mind, but I'm inclined to think you were probably right that DEVICE_INFO should just return num_irqs = VFIO_PCI_NUM_IRQS regardless of whether ERR_IRQ_INDEX is supported. However IRQ_INFO should still return <0 if the device is not pcie. It seems like this also means that we don't need flags indicating which indexes are present as that duplicates simply looking for them. Which flags do we actually need then? Should the AER flag be a device flag or is supporting AER error reporting a feature of VFIO_PCI_ERR_IRQ_INDEX and should therefore be reported as a flag there? So far REGION_INFO and IRQ_INFO flags only report capabilities of the item and not it's purpose, but so far all the regions and irqs have very fixed purposes. I'm inclined to think that a LEGACY_IOPORT region reporting that it supports VGA IOPORT space 3b0 and 3c0 makes more sense than a general device VGA flag and inferring 3b0 & 3c0 based on the existence of a LEGACY_IOPORT region. If we put flags on INFO_REGION and INFO_IRQ, where do they go? We've got a u32 on each for flags. We could split that and define bits >=16 are for type specific flags and <16 are generic. We could also define a generic flag indicating a type specific flag field is present. region_info already has a reserved u32 for alignment that could fill this roll, irq_info would need to add a field. Perhaps something like: --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -176,8 +176,9 @@ struct vfio_region_info { #define VFIO_REGION_INFO_FLAG_READ (1 << 0) /* Region supports read */ #define VFIO_REGION_INFO_FLAG_WRITE (1 << 1) /* Region supports write */ #define VFIO_REGION_INFO_FLAG_MMAP (1 << 2) /* Region supports mmap */ +#define VFIO_REGION_INFO_TYPE_FLAGS (1 << 3) __u32 index; /* Region index */ - __u32 resv; /* Reserved for alignment */ + __u32 type_flags; /* Type specific feature flags */ __u64 size; /* Region size (bytes) */ __u64 offset; /* Region offset from start of device fd */ }; @@ -222,8 +223,10 @@ struct vfio_irq_info { #define VFIO_IRQ_INFO_MASKABLE (1 << 1) #define VFIO_IRQ_INFO_AUTOMASKED (1 << 2) #define VFIO_IRQ_INFO_NORESIZE (1 << 3) +#define VFIO_IRQ_INFO_TYPE_FLAGS (1 << 4) __u32 index; /* IRQ index */ __u32 count; /* Number of IRQs within this index */ + __u32 type_flags; /* Type specific feature flags */ }; #define VFIO_DEVICE_GET_IRQ_INFO _IO(VFIO_TYPE, VFIO_BASE + 9) We'd then have something like #define VFIO_PCI_ERR_IRQ_TYPE_AER (1 << 0) and #define VFIO_PCI_LEGACY_IOPORT_REGION_TYPE_VGA_3b0 (1 << 0) #define VFIO_PCI_LEGACY_IOPORT_REGION_TYPE_VGA_3c0 (1 << 1) #define VFIO_PCI_LEGACY_MMIO_REGION_TYPE_VGA_a0000 (1 << 0) #define VFIO_PCI_ERR_REGION_TYPE_AER (1 << 0) What do you think? It would be useful to prototype these with both AER and VGA before committing. Thanks, Alex > }; > @@ -310,6 +312,7 @@ enum { > VFIO_PCI_INTX_IRQ_INDEX, > VFIO_PCI_MSI_IRQ_INDEX, > VFIO_PCI_MSIX_IRQ_INDEX, > + VFIO_PCI_ERR_IRQ_INDEX, > VFIO_PCI_NUM_IRQS > }; > ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 2/3] VFIO-AER: Vfio-pci driver changes for supporting AER 2013-01-28 19:31 ` Alex Williamson @ 2013-01-29 13:24 ` Alex Williamson 2013-02-01 10:43 ` Pandarathil, Vijaymohan R 0 siblings, 1 reply; 4+ messages in thread From: Alex Williamson @ 2013-01-29 13:24 UTC (permalink / raw) To: Pandarathil, Vijaymohan R Cc: Gleb Natapov, Bjorn Helgaas, Blue Swirl, Ortiz, Lance E, kvm@vger.kernel.org, qemu-devel@nongnu.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org On Mon, 2013-01-28 at 12:31 -0700, Alex Williamson wrote: > On Mon, 2013-01-28 at 09:54 +0000, Pandarathil, Vijaymohan R wrote: > > - New VFIO_SET_IRQ ioctl option to pass the eventfd that is signalled when > > an error occurs in the vfio_pci_device > > > > - Register pci_error_handler for the vfio_pci driver > > > > - When the device encounters an error, the error handler registered by > > the vfio_pci driver gets invoked by the AER infrastructure > > > > - In the error handler, signal the eventfd registered for the device. > > > > - This results in the qemu eventfd handler getting invoked and > > appropriate action taken for the guest. > > > > Signed-off-by: Vijay Mohan Pandarathil <vijaymohan.pandarathil@hp.com> > > --- > > drivers/vfio/pci/vfio_pci.c | 44 ++++++++++++++++++++++++++++++++++++- > > drivers/vfio/pci/vfio_pci_intrs.c | 32 +++++++++++++++++++++++++++ > > drivers/vfio/pci/vfio_pci_private.h | 1 + > > include/uapi/linux/vfio.h | 3 +++ > > 4 files changed, 79 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > > index b28e66c..ff2a078 100644 > > --- a/drivers/vfio/pci/vfio_pci.c > > +++ b/drivers/vfio/pci/vfio_pci.c > > @@ -196,7 +196,9 @@ static int vfio_pci_get_irq_count(struct vfio_pci_device *vdev, int irq_type) > > > > return (flags & PCI_MSIX_FLAGS_QSIZE) + 1; > > } > > - } > > + } else if (irq_type == VFIO_PCI_ERR_IRQ_INDEX) > > + if (pci_is_pcie(vdev->pdev)) > > + return 1; > > > > return 0; > > } > > @@ -223,9 +225,18 @@ static long vfio_pci_ioctl(void *device_data, > > if (vdev->reset_works) > > info.flags |= VFIO_DEVICE_FLAGS_RESET; > > > > + if (pci_is_pcie(vdev->pdev)) { > > + info.flags |= VFIO_DEVICE_FLAGS_PCI_AER; > > + info.flags |= VFIO_DEVICE_FLAGS_PCI_AER_NOTIFY; > > Not sure this second flag should be AER specific or if it's even needed, > see below for more comments on this. > > > + } > > + > > info.num_regions = VFIO_PCI_NUM_REGIONS; > > info.num_irqs = VFIO_PCI_NUM_IRQS; > > > > + /* Expose only implemented IRQs */ > > + if (!(info.flags & VFIO_DEVICE_FLAGS_PCI_AER_NOTIFY)) > > + info.num_irqs--; > > I'm having second thoughts on this, see further below. > > > + > > return copy_to_user((void __user *)arg, &info, minsz); > > > > } else if (cmd == VFIO_DEVICE_GET_REGION_INFO) { > > @@ -302,6 +313,10 @@ static long vfio_pci_ioctl(void *device_data, > > if (info.argsz < minsz || info.index >= VFIO_PCI_NUM_IRQS) > > return -EINVAL; > > > > + if ((info.index == VFIO_PCI_ERR_IRQ_INDEX) && > > + !pci_is_pcie(vdev->pdev)) > > + return -EINVAL; > > + > > Perhaps we could incorporate the index test above this too? > > switch (info.index) { > case VFIO_PCI_INTX_IRQ_INDEX: ... VFIO_PCI_MSIX_IRQ_INDEX: > break; > case VFIO_PCI_ERR_IRQ_INDEX: > if (pci_is_pcie(vdev->pdev)) > break; > default: > return -EINVAL; > } > > This is more similar to how I've re-written the same for the proposed > VGA/legacy I/O support. > > > info.flags = VFIO_IRQ_INFO_EVENTFD; > > > > info.count = vfio_pci_get_irq_count(vdev, info.index); > > @@ -538,11 +553,38 @@ static void vfio_pci_remove(struct pci_dev *pdev) > > kfree(vdev); > > } > > > > +static pci_ers_result_t vfio_err_detected(struct pci_dev *pdev, > > + pci_channel_state_t state) > > This is actually AER specific, right? So perhaps it should be > vfio_pci_aer_err_detected? > > Also, please follow existing whitespace usage throughout, tabs followed > by spaces to align function parameter wrap. > > > +{ > > + struct vfio_pci_device *vpdev; > > + void *vdev; > > struct vfio_device *vdev; > > > + > > + vdev = vfio_device_get_from_dev(&pdev->dev); > > + if (vdev == NULL) > > + return PCI_ERS_RESULT_DISCONNECT; > > + > > + vpdev = vfio_device_data(vdev); > > + if (vpdev == NULL) > > + return PCI_ERS_RESULT_DISCONNECT; > > + > > + if (vpdev->err_trigger) > > + eventfd_signal(vpdev->err_trigger, 1); > > + > > + vfio_device_put_vdev(vdev); > > + > > + return PCI_ERS_RESULT_CAN_RECOVER; > > +} > > + > > +static const struct pci_error_handlers vfio_err_handlers = { > > + .error_detected = vfio_err_detected, > > +}; > > + > > static struct pci_driver vfio_pci_driver = { > > .name = "vfio-pci", > > .id_table = NULL, /* only dynamic ids */ > > .probe = vfio_pci_probe, > > .remove = vfio_pci_remove, > > + .err_handler = &vfio_err_handlers, > > }; > > > > static void __exit vfio_pci_cleanup(void) > > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c > > index 3639371..f003e08 100644 > > --- a/drivers/vfio/pci/vfio_pci_intrs.c > > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > > @@ -745,6 +745,31 @@ static int vfio_pci_set_msi_trigger(struct vfio_pci_device *vdev, > > return 0; > > } > > > > +static int vfio_pci_set_err_eventfd(struct vfio_pci_device *vdev, > > + unsigned index, unsigned start, > > + unsigned count, uint32_t flags, void *data) > > > Rename to vfio_pci_set_err_trigger? The other functions mostly only > support eventfd too. > > > +{ > > + if ((index == VFIO_PCI_ERR_IRQ_INDEX) && > > + (flags & VFIO_IRQ_SET_DATA_EVENTFD) && > > + pci_is_pcie(vdev->pdev)) { > > It would clean up the indentation to have this be: > > if (!supported stuff) > return -EINVAL; > > do stuff > > Testing the index seems overly paranoid here given the caller. The > caller is also already testing pci_is_pcie. > > Why not support DATA_NONE and DATA_BOOL? It would be useful loopback > testing for userspace to be able to trigger an AER notification. > > > + > > + int32_t fd = *(int32_t *)data; > > + > > + if (fd == -1) { > > + if (vdev->err_trigger) > > + eventfd_ctx_put(vdev->err_trigger); > > + vdev->err_trigger = NULL; > > + return 0; > > + } else if (fd >= 0) { > > + vdev->err_trigger = eventfd_ctx_fdget(fd); > > + if (IS_ERR(vdev->err_trigger)) > > + return PTR_ERR(vdev->err_trigger); > > + return 0; > > + } else > > + return -EINVAL; > > + } > > + return -EINVAL; > > +} > > int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev, uint32_t flags, > > unsigned index, unsigned start, unsigned count, > > void *data) > > @@ -779,6 +804,13 @@ int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev, uint32_t flags, > > break; > > } > > break; > > + case VFIO_PCI_ERR_IRQ_INDEX: > > + switch (flags & VFIO_IRQ_SET_ACTION_TYPE_MASK) { > > + case VFIO_IRQ_SET_ACTION_TRIGGER: > > + if (pci_is_pcie(vdev->pdev)) > > + func = vfio_pci_set_err_eventfd; > > + break; > > + } > > } > > > > if (!func) > > diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfio_pci_private.h > > index 611827c..daee62f 100644 > > --- a/drivers/vfio/pci/vfio_pci_private.h > > +++ b/drivers/vfio/pci/vfio_pci_private.h > > @@ -55,6 +55,7 @@ struct vfio_pci_device { > > bool bardirty; > > struct pci_saved_state *pci_saved_state; > > atomic_t refcnt; > > + struct eventfd_ctx *err_trigger; > > }; > > > > #define is_intx(vdev) (vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX) > > diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h > > index 4758d1b..e81eb4d 100644 > > --- a/include/uapi/linux/vfio.h > > +++ b/include/uapi/linux/vfio.h > > @@ -147,6 +147,8 @@ struct vfio_device_info { > > __u32 flags; > > #define VFIO_DEVICE_FLAGS_RESET (1 << 0) /* Device supports reset */ > > #define VFIO_DEVICE_FLAGS_PCI (1 << 1) /* vfio-pci device */ > > +#define VFIO_DEVICE_FLAGS_PCI_AER (1 << 2) /* AER capable */ > > +#define VFIO_DEVICE_FLAGS_PCI_AER_NOTIFY (1 << 3) /* Supports aer notify */ > > > > __u32 num_regions; /* Max region index + 1 */ > > __u32 num_irqs; /* Max IRQ index + 1 */ > ^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > This part of the vfio spec has been causing me trouble. We discussed it > a bit offline, but I'd appreciate any feedback from you or the broader > community. num_foo indicates a count, however the comment clearly > states this is a max index. With the VGA patches I've been playing with > using them as a count where userspace would probe indexes until it finds > num_foo implemented (ie. INFO_IRQ/REGION returns >=0). I guess the > original intention was was to probe up to num_foo-1 and unavailable > indexes return <0. Looking at it again, this seems like the more > deterministic approach. For instance, if we add LEGACY_IOPORT and > LEGACY_MMIO regions at index 8 & 9, then ERR region at index 10, it's > easier for userspace to know to stop searching at index 10 instead of > probing indexes it may not understand trying to find the full count. > Does that sound right? > > So Vijay, please don't shot me for changing my mind, but I'm inclined to > think you were probably right that DEVICE_INFO should just return > num_irqs = VFIO_PCI_NUM_IRQS regardless of whether ERR_IRQ_INDEX is > supported. However IRQ_INFO should still return <0 if the device is not > pcie. It seems like this also means that we don't need flags indicating > which indexes are present as that duplicates simply looking for them. > > Which flags do we actually need then? Should the AER flag be a device > flag or is supporting AER error reporting a feature of > VFIO_PCI_ERR_IRQ_INDEX and should therefore be reported as a flag there? > So far REGION_INFO and IRQ_INFO flags only report capabilities of the > item and not it's purpose, but so far all the regions and irqs have very > fixed purposes. > > I'm inclined to think that a LEGACY_IOPORT region reporting that it > supports VGA IOPORT space 3b0 and 3c0 makes more sense than a general > device VGA flag and inferring 3b0 & 3c0 based on the existence of a > LEGACY_IOPORT region. > > If we put flags on INFO_REGION and INFO_IRQ, where do they go? We've > got a u32 on each for flags. We could split that and define bits >=16 > are for type specific flags and <16 are generic. We could also define a > generic flag indicating a type specific flag field is present. > region_info already has a reserved u32 for alignment that could fill > this roll, irq_info would need to add a field. Perhaps something like: > > --- a/include/uapi/linux/vfio.h > +++ b/include/uapi/linux/vfio.h > @@ -176,8 +176,9 @@ struct vfio_region_info { > #define VFIO_REGION_INFO_FLAG_READ (1 << 0) /* Region supports read */ > #define VFIO_REGION_INFO_FLAG_WRITE (1 << 1) /* Region supports write */ > #define VFIO_REGION_INFO_FLAG_MMAP (1 << 2) /* Region supports mmap */ > +#define VFIO_REGION_INFO_TYPE_FLAGS (1 << 3) > __u32 index; /* Region index */ > - __u32 resv; /* Reserved for alignment */ > + __u32 type_flags; /* Type specific feature flags */ > __u64 size; /* Region size (bytes) */ > __u64 offset; /* Region offset from start of device fd */ > }; > @@ -222,8 +223,10 @@ struct vfio_irq_info { > #define VFIO_IRQ_INFO_MASKABLE (1 << 1) > #define VFIO_IRQ_INFO_AUTOMASKED (1 << 2) > #define VFIO_IRQ_INFO_NORESIZE (1 << 3) > +#define VFIO_IRQ_INFO_TYPE_FLAGS (1 << 4) > __u32 index; /* IRQ index */ > __u32 count; /* Number of IRQs within this index */ > + __u32 type_flags; /* Type specific feature flags */ > }; > #define VFIO_DEVICE_GET_IRQ_INFO _IO(VFIO_TYPE, VFIO_BASE + 9) > > We'd then have something like > > #define VFIO_PCI_ERR_IRQ_TYPE_AER (1 << 0) > > and > > #define VFIO_PCI_LEGACY_IOPORT_REGION_TYPE_VGA_3b0 (1 << 0) > #define VFIO_PCI_LEGACY_IOPORT_REGION_TYPE_VGA_3c0 (1 << 1) > #define VFIO_PCI_LEGACY_MMIO_REGION_TYPE_VGA_a0000 (1 << 0) > > #define VFIO_PCI_ERR_REGION_TYPE_AER (1 << 0) Hmm, maybe IRQs don't need a type_flag. For VGA we're exposing a region and describing implemented sections within the region. For IRQs, we have practically a limitless space. Perhaps that means this IRQ should just be PCI_AER_EVENT_IRQ and if ever we need a different error reporting IRQ we'll add a new index. This way we don't have to add a new field to irq_info and try to unnecessarily generalize a single index. I'll need to think about VGA though, we have the same (practically) limitless index range there as well, but in the kernel side implementation we used fixed sized segments into the device fd to know which region is being accessed. This isn't visible to userspace, so we're free to change it. If we did that, we might expose the specific regions as separate indexes rather than try to generalize them into reusable "legacy" ranges. Again, comments welcome. Thanks, Alex > > What do you think? It would be useful to prototype these with both AER > and VGA before committing. Thanks, > > Alex > > > }; > > @@ -310,6 +312,7 @@ enum { > > VFIO_PCI_INTX_IRQ_INDEX, > > VFIO_PCI_MSI_IRQ_INDEX, > > VFIO_PCI_MSIX_IRQ_INDEX, > > + VFIO_PCI_ERR_IRQ_INDEX, > > VFIO_PCI_NUM_IRQS > > }; > > > > ^ permalink raw reply [flat|nested] 4+ messages in thread
* RE: [PATCH v2 2/3] VFIO-AER: Vfio-pci driver changes for supporting AER 2013-01-29 13:24 ` Alex Williamson @ 2013-02-01 10:43 ` Pandarathil, Vijaymohan R 0 siblings, 0 replies; 4+ messages in thread From: Pandarathil, Vijaymohan R @ 2013-02-01 10:43 UTC (permalink / raw) To: Alex Williamson Cc: Gleb Natapov, Bjorn Helgaas, Blue Swirl, Ortiz, Lance E, kvm@vger.kernel.org, qemu-devel@nongnu.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQWxleCBXaWxsaWFtc29u IFttYWlsdG86YWxleC53aWxsaWFtc29uQHJlZGhhdC5jb21dDQo+IFNlbnQ6IFR1ZXNkYXksIEph bnVhcnkgMjksIDIwMTMgNToyNSBBTQ0KPiBUbzogUGFuZGFyYXRoaWwsIFZpamF5bW9oYW4gUg0K PiBDYzogR2xlYiBOYXRhcG92OyBCam9ybiBIZWxnYWFzOyBCbHVlIFN3aXJsOyBPcnRpeiwgTGFu Y2UgRTsNCj4ga3ZtQHZnZXIua2VybmVsLm9yZzsgcWVtdS1kZXZlbEBub25nbnUub3JnOyBsaW51 eC1wY2lAdmdlci5rZXJuZWwub3JnOw0KPiBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnDQo+ IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjIgMi8zXSBWRklPLUFFUjogVmZpby1wY2kgZHJpdmVyIGNo YW5nZXMgZm9yDQo+IHN1cHBvcnRpbmcgQUVSDQo+IA0KPiBPbiBNb24sIDIwMTMtMDEtMjggYXQg MTI6MzEgLTA3MDAsIEFsZXggV2lsbGlhbXNvbiB3cm90ZToNCj4gPiBPbiBNb24sIDIwMTMtMDEt MjggYXQgMDk6NTQgKzAwMDAsIFBhbmRhcmF0aGlsLCBWaWpheW1vaGFuIFIgd3JvdGU6DQo+ID4g PiAgCS0gTmV3IFZGSU9fU0VUX0lSUSBpb2N0bCBvcHRpb24gdG8gcGFzcyB0aGUgZXZlbnRmZCB0 aGF0IGlzIHNpZ25hbGxlZA0KPiB3aGVuDQo+ID4gPiAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJz IGluIHRoZSB2ZmlvX3BjaV9kZXZpY2UNCj4gPiA+DQo+ID4gPiAJLSBSZWdpc3RlciBwY2lfZXJy b3JfaGFuZGxlciBmb3IgdGhlIHZmaW9fcGNpIGRyaXZlcg0KPiA+ID4NCj4gPiA+IAktIFdoZW4g dGhlIGRldmljZSBlbmNvdW50ZXJzIGFuIGVycm9yLCB0aGUgZXJyb3IgaGFuZGxlciByZWdpc3Rl cmVkDQo+IGJ5DQo+ID4gPiAgICAgICAgICAgdGhlIHZmaW9fcGNpIGRyaXZlciBnZXRzIGludm9r ZWQgYnkgdGhlIEFFUiBpbmZyYXN0cnVjdHVyZQ0KPiA+ID4NCj4gPiA+IAktIEluIHRoZSBlcnJv ciBoYW5kbGVyLCBzaWduYWwgdGhlIGV2ZW50ZmQgcmVnaXN0ZXJlZCBmb3IgdGhlIGRldmljZS4N Cj4gPiA+DQo+ID4gPiAJLSBUaGlzIHJlc3VsdHMgaW4gdGhlIHFlbXUgZXZlbnRmZCBoYW5kbGVy IGdldHRpbmcgaW52b2tlZCBhbmQNCj4gPiA+ICAgICAgICAgICBhcHByb3ByaWF0ZSBhY3Rpb24g dGFrZW4gZm9yIHRoZSBndWVzdC4NCj4gPiA+DQo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBWaWpheSBN b2hhbiBQYW5kYXJhdGhpbCA8dmlqYXltb2hhbi5wYW5kYXJhdGhpbEBocC5jb20+DQo+ID4gPiAt LS0NCj4gPiA+ICBkcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpLmMgICAgICAgICB8IDQ0DQo+ICsr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0NCj4gPiA+ICBkcml2ZXJzL3ZmaW8v cGNpL3ZmaW9fcGNpX2ludHJzLmMgICB8IDMyICsrKysrKysrKysrKysrKysrKysrKysrKysrKw0K PiA+ID4gIGRyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfcHJpdmF0ZS5oIHwgIDEgKw0KPiA+ID4g IGluY2x1ZGUvdWFwaS9saW51eC92ZmlvLmggICAgICAgICAgIHwgIDMgKysrDQo+ID4gPiAgNCBm aWxlcyBjaGFuZ2VkLCA3OSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pDQo+ID4gPg0KPiA+ ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2kuYyBiL2RyaXZlcnMvdmZp by9wY2kvdmZpb19wY2kuYw0KPiA+ID4gaW5kZXggYjI4ZTY2Yy4uZmYyYTA3OCAxMDA2NDQNCj4g PiA+IC0tLSBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2kuYw0KPiA+ID4gKysrIGIvZHJpdmVy cy92ZmlvL3BjaS92ZmlvX3BjaS5jDQo+ID4gPiBAQCAtMTk2LDcgKzE5Niw5IEBAIHN0YXRpYyBp bnQgdmZpb19wY2lfZ2V0X2lycV9jb3VudChzdHJ1Y3QNCj4gdmZpb19wY2lfZGV2aWNlICp2ZGV2 LCBpbnQgaXJxX3R5cGUpDQo+ID4gPg0KPiA+ID4gIAkJCXJldHVybiAoZmxhZ3MgJiBQQ0lfTVNJ WF9GTEFHU19RU0laRSkgKyAxOw0KPiA+ID4gIAkJfQ0KPiA+ID4gLQl9DQo+ID4gPiArCX0gZWxz ZSBpZiAoaXJxX3R5cGUgPT0gVkZJT19QQ0lfRVJSX0lSUV9JTkRFWCkNCj4gPiA+ICsJCWlmIChw Y2lfaXNfcGNpZSh2ZGV2LT5wZGV2KSkNCj4gPiA+ICsJCQlyZXR1cm4gMTsNCj4gPiA+DQo+ID4g PiAgCXJldHVybiAwOw0KPiA+ID4gIH0NCj4gPiA+IEBAIC0yMjMsOSArMjI1LDE4IEBAIHN0YXRp YyBsb25nIHZmaW9fcGNpX2lvY3RsKHZvaWQgKmRldmljZV9kYXRhLA0KPiA+ID4gIAkJaWYgKHZk ZXYtPnJlc2V0X3dvcmtzKQ0KPiA+ID4gIAkJCWluZm8uZmxhZ3MgfD0gVkZJT19ERVZJQ0VfRkxB R1NfUkVTRVQ7DQo+ID4gPg0KPiA+ID4gKwkJaWYgKHBjaV9pc19wY2llKHZkZXYtPnBkZXYpKSB7 DQo+ID4gPiArCQkJaW5mby5mbGFncyB8PSBWRklPX0RFVklDRV9GTEFHU19QQ0lfQUVSOw0KPiA+ ID4gKwkJCWluZm8uZmxhZ3MgfD0gVkZJT19ERVZJQ0VfRkxBR1NfUENJX0FFUl9OT1RJRlk7DQo+ ID4NCj4gPiBOb3Qgc3VyZSB0aGlzIHNlY29uZCBmbGFnIHNob3VsZCBiZSBBRVIgc3BlY2lmaWMg b3IgaWYgaXQncyBldmVuIG5lZWRlZCwNCj4gPiBzZWUgYmVsb3cgZm9yIG1vcmUgY29tbWVudHMg b24gdGhpcy4NCj4gPg0KPiA+ID4gKwkJfQ0KPiA+ID4gKw0KPiA+ID4gIAkJaW5mby5udW1fcmVn aW9ucyA9IFZGSU9fUENJX05VTV9SRUdJT05TOw0KPiA+ID4gIAkJaW5mby5udW1faXJxcyA9IFZG SU9fUENJX05VTV9JUlFTOw0KPiA+ID4NCj4gPiA+ICsJCS8qIEV4cG9zZSBvbmx5IGltcGxlbWVu dGVkIElSUXMgKi8NCj4gPiA+ICsJCWlmICghKGluZm8uZmxhZ3MgJiBWRklPX0RFVklDRV9GTEFH U19QQ0lfQUVSX05PVElGWSkpDQo+ID4gPiArCQkJaW5mby5udW1faXJxcy0tOw0KPiA+DQo+ID4g SSdtIGhhdmluZyBzZWNvbmQgdGhvdWdodHMgb24gdGhpcywgc2VlIGZ1cnRoZXIgYmVsb3cuDQo+ ID4NCj4gPiA+ICsNCj4gPiA+ICAJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICop YXJnLCAmaW5mbywgbWluc3opOw0KPiA+ID4NCj4gPiA+ICAJfSBlbHNlIGlmIChjbWQgPT0gVkZJ T19ERVZJQ0VfR0VUX1JFR0lPTl9JTkZPKSB7DQo+ID4gPiBAQCAtMzAyLDYgKzMxMywxMCBAQCBz dGF0aWMgbG9uZyB2ZmlvX3BjaV9pb2N0bCh2b2lkICpkZXZpY2VfZGF0YSwNCj4gPiA+ICAJCWlm IChpbmZvLmFyZ3N6IDwgbWluc3ogfHwgaW5mby5pbmRleCA+PSBWRklPX1BDSV9OVU1fSVJRUykN Cj4gPiA+ICAJCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiA+DQo+ID4gPiArCQlpZiAoKGluZm8uaW5k ZXggPT0gVkZJT19QQ0lfRVJSX0lSUV9JTkRFWCkgJiYNCj4gPiA+ICsJCSAgICAgIXBjaV9pc19w Y2llKHZkZXYtPnBkZXYpKQ0KPiA+ID4gKwkJCXJldHVybiAtRUlOVkFMOw0KPiA+ID4gKw0KPiA+ DQo+ID4gUGVyaGFwcyB3ZSBjb3VsZCBpbmNvcnBvcmF0ZSB0aGUgaW5kZXggdGVzdCBhYm92ZSB0 aGlzIHRvbz8NCj4gPg0KPiA+IHN3aXRjaCAoaW5mby5pbmRleCkgew0KPiA+IGNhc2UgVkZJT19Q Q0lfSU5UWF9JUlFfSU5ERVg6IC4uLiBWRklPX1BDSV9NU0lYX0lSUV9JTkRFWDoNCj4gPiAJYnJl YWs7DQo+ID4gY2FzZSBWRklPX1BDSV9FUlJfSVJRX0lOREVYOg0KPiA+IAlpZiAocGNpX2lzX3Bj aWUodmRldi0+cGRldikpDQo+ID4gCQlicmVhazsNCj4gPiBkZWZhdWx0Og0KPiA+IAlyZXR1cm4g LUVJTlZBTDsNCj4gPiB9DQo+ID4NCj4gPiBUaGlzIGlzIG1vcmUgc2ltaWxhciB0byBob3cgSSd2 ZSByZS13cml0dGVuIHRoZSBzYW1lIGZvciB0aGUgcHJvcG9zZWQNCj4gPiBWR0EvbGVnYWN5IEkv TyBzdXBwb3J0Lg0KPiA+DQo+ID4gPiAgCQlpbmZvLmZsYWdzID0gVkZJT19JUlFfSU5GT19FVkVO VEZEOw0KPiA+ID4NCj4gPiA+ICAJCWluZm8uY291bnQgPSB2ZmlvX3BjaV9nZXRfaXJxX2NvdW50 KHZkZXYsIGluZm8uaW5kZXgpOw0KPiA+ID4gQEAgLTUzOCwxMSArNTUzLDM4IEBAIHN0YXRpYyB2 b2lkIHZmaW9fcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikNCj4gPiA+ICAJa2ZyZWUo dmRldik7DQo+ID4gPiAgfQ0KPiA+ID4NCj4gPiA+ICtzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCB2 ZmlvX2Vycl9kZXRlY3RlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwNCj4gPiA+ICsJCQkJcGNpX2No YW5uZWxfc3RhdGVfdCBzdGF0ZSkNCj4gPg0KPiA+IFRoaXMgaXMgYWN0dWFsbHkgQUVSIHNwZWNp ZmljLCByaWdodD8gIFNvIHBlcmhhcHMgaXQgc2hvdWxkIGJlDQo+ID4gdmZpb19wY2lfYWVyX2Vy cl9kZXRlY3RlZD8NCj4gPg0KPiA+IEFsc28sIHBsZWFzZSBmb2xsb3cgZXhpc3Rpbmcgd2hpdGVz cGFjZSB1c2FnZSB0aHJvdWdob3V0LCB0YWJzIGZvbGxvd2VkDQo+ID4gYnkgc3BhY2VzIHRvIGFs aWduIGZ1bmN0aW9uIHBhcmFtZXRlciB3cmFwLg0KPiA+DQo+ID4gPiArew0KPiA+ID4gKwlzdHJ1 Y3QgdmZpb19wY2lfZGV2aWNlICp2cGRldjsNCj4gPiA+ICsJdm9pZCAqdmRldjsNCj4gPg0KPiA+ IHN0cnVjdCB2ZmlvX2RldmljZSAqdmRldjsNCj4gPg0KPiA+ID4gKw0KPiA+ID4gKwl2ZGV2ID0g dmZpb19kZXZpY2VfZ2V0X2Zyb21fZGV2KCZwZGV2LT5kZXYpOw0KPiA+ID4gKwlpZiAodmRldiA9 PSBOVUxMKQ0KPiA+ID4gKwkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7DQo+ID4g PiArDQo+ID4gPiArCXZwZGV2ID0gdmZpb19kZXZpY2VfZGF0YSh2ZGV2KTsNCj4gPiA+ICsJaWYg KHZwZGV2ID09IE5VTEwpDQo+ID4gPiArCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVD VDsNCj4gPiA+ICsNCj4gPiA+ICsJaWYgKHZwZGV2LT5lcnJfdHJpZ2dlcikNCj4gPiA+ICsJCWV2 ZW50ZmRfc2lnbmFsKHZwZGV2LT5lcnJfdHJpZ2dlciwgMSk7DQo+ID4gPiArDQo+ID4gPiArCXZm aW9fZGV2aWNlX3B1dF92ZGV2KHZkZXYpOw0KPiA+ID4gKw0KPiA+ID4gKwlyZXR1cm4gUENJX0VS U19SRVNVTFRfQ0FOX1JFQ09WRVI7DQo+ID4gPiArfQ0KPiA+ID4gKw0KPiA+ID4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgcGNpX2Vycm9yX2hhbmRsZXJzIHZmaW9fZXJyX2hhbmRsZXJzID0gew0KPiA+ ID4gKwkuZXJyb3JfZGV0ZWN0ZWQgPSB2ZmlvX2Vycl9kZXRlY3RlZCwNCj4gPiA+ICt9Ow0KPiA+ ID4gKw0KPiA+ID4gIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2ZmlvX3BjaV9kcml2ZXIgPSB7 DQo+ID4gPiAgCS5uYW1lCQk9ICJ2ZmlvLXBjaSIsDQo+ID4gPiAgCS5pZF90YWJsZQk9IE5VTEws IC8qIG9ubHkgZHluYW1pYyBpZHMgKi8NCj4gPiA+ICAJLnByb2JlCQk9IHZmaW9fcGNpX3Byb2Jl LA0KPiA+ID4gIAkucmVtb3ZlCQk9IHZmaW9fcGNpX3JlbW92ZSwNCj4gPiA+ICsJLmVycl9oYW5k bGVyCT0gJnZmaW9fZXJyX2hhbmRsZXJzLA0KPiA+ID4gIH07DQo+ID4gPg0KPiA+ID4gIHN0YXRp YyB2b2lkIF9fZXhpdCB2ZmlvX3BjaV9jbGVhbnVwKHZvaWQpDQo+ID4gPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jDQo+IGIvZHJpdmVycy92ZmlvL3BjaS92 ZmlvX3BjaV9pbnRycy5jDQo+ID4gPiBpbmRleCAzNjM5MzcxLi5mMDAzZTA4IDEwMDY0NA0KPiA+ ID4gLS0tIGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jDQo+ID4gPiArKysgYi9k cml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX2ludHJzLmMNCj4gPiA+IEBAIC03NDUsNiArNzQ1LDMx IEBAIHN0YXRpYyBpbnQgdmZpb19wY2lfc2V0X21zaV90cmlnZ2VyKHN0cnVjdA0KPiB2ZmlvX3Bj aV9kZXZpY2UgKnZkZXYsDQo+ID4gPiAgCXJldHVybiAwOw0KPiA+ID4gIH0NCj4gPiA+DQo+ID4g PiArc3RhdGljIGludCB2ZmlvX3BjaV9zZXRfZXJyX2V2ZW50ZmQoc3RydWN0IHZmaW9fcGNpX2Rl dmljZSAqdmRldiwNCj4gPiA+ICsJCQkJICAgIHVuc2lnbmVkIGluZGV4LCB1bnNpZ25lZCBzdGFy dCwNCj4gPiA+ICsJCQkJICAgIHVuc2lnbmVkIGNvdW50LCB1aW50MzJfdCBmbGFncywgdm9pZCAq ZGF0YSkNCj4gPg0KPiA+DQo+ID4gUmVuYW1lIHRvIHZmaW9fcGNpX3NldF9lcnJfdHJpZ2dlcj8g IFRoZSBvdGhlciBmdW5jdGlvbnMgbW9zdGx5IG9ubHkNCj4gPiBzdXBwb3J0IGV2ZW50ZmQgdG9v Lg0KPiA+DQo+ID4gPiArew0KPiA+ID4gKwlpZiAoKGluZGV4ID09IFZGSU9fUENJX0VSUl9JUlFf SU5ERVgpICYmDQo+ID4gPiArCSAgICAoZmxhZ3MgJiBWRklPX0lSUV9TRVRfREFUQV9FVkVOVEZE KSAgICYmDQo+ID4gPiArCSAgICBwY2lfaXNfcGNpZSh2ZGV2LT5wZGV2KSkgew0KPiA+DQo+ID4g SXQgd291bGQgY2xlYW4gdXAgdGhlIGluZGVudGF0aW9uIHRvIGhhdmUgdGhpcyBiZToNCj4gPg0K PiA+ICAgICAgICAgaWYgKCFzdXBwb3J0ZWQgc3R1ZmYpDQo+ID4gICAgICAgICAJcmV0dXJuIC1F SU5WQUw7DQo+ID4NCj4gPiAgICAgICAgIGRvIHN0dWZmDQo+ID4NCj4gPiBUZXN0aW5nIHRoZSBp bmRleCBzZWVtcyBvdmVybHkgcGFyYW5vaWQgaGVyZSBnaXZlbiB0aGUgY2FsbGVyLiAgVGhlDQo+ ID4gY2FsbGVyIGlzIGFsc28gYWxyZWFkeSB0ZXN0aW5nIHBjaV9pc19wY2llLg0KPiA+DQo+ID4g V2h5IG5vdCBzdXBwb3J0IERBVEFfTk9ORSBhbmQgREFUQV9CT09MPyAgSXQgd291bGQgYmUgdXNl ZnVsIGxvb3BiYWNrDQo+ID4gdGVzdGluZyBmb3IgdXNlcnNwYWNlIHRvIGJlIGFibGUgdG8gdHJp Z2dlciBhbiBBRVIgbm90aWZpY2F0aW9uLg0KPiA+DQo+ID4gPiArDQo+ID4gPiArCQlpbnQzMl90 IGZkID0gKihpbnQzMl90ICopZGF0YTsNCj4gPiA+ICsNCj4gPiA+ICsJCWlmIChmZCA9PSAtMSkg ew0KPiA+ID4gKwkJCWlmICh2ZGV2LT5lcnJfdHJpZ2dlcikNCj4gPiA+ICsJCQkJZXZlbnRmZF9j dHhfcHV0KHZkZXYtPmVycl90cmlnZ2VyKTsNCj4gPiA+ICsJCQl2ZGV2LT5lcnJfdHJpZ2dlciA9 IE5VTEw7DQo+ID4gPiArCQkJcmV0dXJuIDA7DQo+ID4gPiArCQl9IGVsc2UgaWYgKGZkID49IDAp IHsNCj4gPiA+ICsJCQl2ZGV2LT5lcnJfdHJpZ2dlciA9IGV2ZW50ZmRfY3R4X2ZkZ2V0KGZkKTsN Cj4gPiA+ICsJCQlpZiAoSVNfRVJSKHZkZXYtPmVycl90cmlnZ2VyKSkNCj4gPiA+ICsJCQkJcmV0 dXJuIFBUUl9FUlIodmRldi0+ZXJyX3RyaWdnZXIpOw0KPiA+ID4gKwkJCXJldHVybiAwOw0KPiA+ ID4gKwkJfSBlbHNlDQo+ID4gPiArCQkJcmV0dXJuIC1FSU5WQUw7DQo+ID4gPiArCX0NCj4gPiA+ ICsJcmV0dXJuIC1FSU5WQUw7DQo+ID4gPiArfQ0KPiA+ID4gIGludCB2ZmlvX3BjaV9zZXRfaXJx c19pb2N0bChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2LCB1aW50MzJfdA0KPiBmbGFncywN Cj4gPiA+ICAJCQkgICAgdW5zaWduZWQgaW5kZXgsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBj b3VudCwNCj4gPiA+ICAJCQkgICAgdm9pZCAqZGF0YSkNCj4gPiA+IEBAIC03NzksNiArODA0LDEz IEBAIGludCB2ZmlvX3BjaV9zZXRfaXJxc19pb2N0bChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlDQo+ ICp2ZGV2LCB1aW50MzJfdCBmbGFncywNCj4gPiA+ICAJCQlicmVhazsNCj4gPiA+ICAJCX0NCj4g PiA+ICAJCWJyZWFrOw0KPiA+ID4gKwljYXNlIFZGSU9fUENJX0VSUl9JUlFfSU5ERVg6DQo+ID4g PiArCQlzd2l0Y2ggKGZsYWdzICYgVkZJT19JUlFfU0VUX0FDVElPTl9UWVBFX01BU0spIHsNCj4g PiA+ICsJCWNhc2UgVkZJT19JUlFfU0VUX0FDVElPTl9UUklHR0VSOg0KPiA+ID4gKwkJCWlmIChw Y2lfaXNfcGNpZSh2ZGV2LT5wZGV2KSkNCj4gPiA+ICsJCQkJZnVuYyA9IHZmaW9fcGNpX3NldF9l cnJfZXZlbnRmZDsNCj4gPiA+ICsJCQlicmVhazsNCj4gPiA+ICsJCX0NCj4gPiA+ICAJfQ0KPiA+ ID4NCj4gPiA+ICAJaWYgKCFmdW5jKQ0KPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZpby9w Y2kvdmZpb19wY2lfcHJpdmF0ZS5oDQo+IGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9wcml2 YXRlLmgNCj4gPiA+IGluZGV4IDYxMTgyN2MuLmRhZWU2MmYgMTAwNjQ0DQo+ID4gPiAtLS0gYS9k cml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaA0KPiA+ID4gKysrIGIvZHJpdmVycy92 ZmlvL3BjaS92ZmlvX3BjaV9wcml2YXRlLmgNCj4gPiA+IEBAIC01NSw2ICs1NSw3IEBAIHN0cnVj dCB2ZmlvX3BjaV9kZXZpY2Ugew0KPiA+ID4gIAlib29sCQkJYmFyZGlydHk7DQo+ID4gPiAgCXN0 cnVjdCBwY2lfc2F2ZWRfc3RhdGUJKnBjaV9zYXZlZF9zdGF0ZTsNCj4gPiA+ICAJYXRvbWljX3QJ CXJlZmNudDsNCj4gPiA+ICsJc3RydWN0IGV2ZW50ZmRfY3R4CSplcnJfdHJpZ2dlcjsNCj4gPiA+ ICB9Ow0KPiA+ID4NCj4gPiA+ICAjZGVmaW5lIGlzX2ludHgodmRldikgKHZkZXYtPmlycV90eXBl ID09IFZGSU9fUENJX0lOVFhfSVJRX0lOREVYKQ0KPiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUv dWFwaS9saW51eC92ZmlvLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdmZpby5oDQo+ID4gPiBpbmRl eCA0NzU4ZDFiLi5lODFlYjRkIDEwMDY0NA0KPiA+ID4gLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4 L3ZmaW8uaA0KPiA+ID4gKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZmaW8uaA0KPiA+ID4gQEAg LTE0Nyw2ICsxNDcsOCBAQCBzdHJ1Y3QgdmZpb19kZXZpY2VfaW5mbyB7DQo+ID4gPiAgCV9fdTMy CWZsYWdzOw0KPiA+ID4gICNkZWZpbmUgVkZJT19ERVZJQ0VfRkxBR1NfUkVTRVQJKDEgPDwgMCkJ LyogRGV2aWNlIHN1cHBvcnRzDQo+IHJlc2V0ICovDQo+ID4gPiAgI2RlZmluZSBWRklPX0RFVklD RV9GTEFHU19QQ0kJKDEgPDwgMSkJLyogdmZpby1wY2kgZGV2aWNlICovDQo+ID4gPiArI2RlZmlu ZSBWRklPX0RFVklDRV9GTEFHU19QQ0lfQUVSCSgxIDw8IDIpIC8qIEFFUiBjYXBhYmxlICovDQo+ ID4gPiArI2RlZmluZSBWRklPX0RFVklDRV9GTEFHU19QQ0lfQUVSX05PVElGWSAoMSA8PCAzKSAv KiBTdXBwb3J0cyBhZXINCj4gbm90aWZ5ICovDQo+ID4gPg0KPiA+ID4gIAlfX3UzMgludW1fcmVn aW9uczsJLyogTWF4IHJlZ2lvbiBpbmRleCArIDEgKi8NCj4gPiA+ICAJX191MzIJbnVtX2lycXM7 CS8qIE1heCBJUlEgaW5kZXggKyAxICovDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4NCj4gPg0KPiA+IFRoaXMgcGFydCBvZiB0aGUg dmZpbyBzcGVjIGhhcyBiZWVuIGNhdXNpbmcgbWUgdHJvdWJsZS4gIFdlIGRpc2N1c3NlZCBpdA0K PiA+IGEgYml0IG9mZmxpbmUsIGJ1dCBJJ2QgYXBwcmVjaWF0ZSBhbnkgZmVlZGJhY2sgZnJvbSB5 b3Ugb3IgdGhlIGJyb2FkZXINCj4gPiBjb21tdW5pdHkuICBudW1fZm9vIGluZGljYXRlcyBhIGNv dW50LCBob3dldmVyIHRoZSBjb21tZW50IGNsZWFybHkNCj4gPiBzdGF0ZXMgdGhpcyBpcyBhIG1h eCBpbmRleC4gIFdpdGggdGhlIFZHQSBwYXRjaGVzIEkndmUgYmVlbiBwbGF5aW5nIHdpdGgNCj4g PiB1c2luZyB0aGVtIGFzIGEgY291bnQgd2hlcmUgdXNlcnNwYWNlIHdvdWxkIHByb2JlIGluZGV4 ZXMgdW50aWwgaXQgZmluZHMNCj4gPiBudW1fZm9vIGltcGxlbWVudGVkIChpZS4gSU5GT19JUlEv UkVHSU9OIHJldHVybnMgPj0wKS4gIEkgZ3Vlc3MgdGhlDQo+ID4gb3JpZ2luYWwgaW50ZW50aW9u IHdhcyB3YXMgdG8gcHJvYmUgdXAgdG8gbnVtX2Zvby0xIGFuZCB1bmF2YWlsYWJsZQ0KPiA+IGlu ZGV4ZXMgcmV0dXJuIDwwLiAgTG9va2luZyBhdCBpdCBhZ2FpbiwgdGhpcyBzZWVtcyBsaWtlIHRo ZSBtb3JlDQo+ID4gZGV0ZXJtaW5pc3RpYyBhcHByb2FjaC4gIEZvciBpbnN0YW5jZSwgaWYgd2Ug YWRkIExFR0FDWV9JT1BPUlQgYW5kDQo+ID4gTEVHQUNZX01NSU8gcmVnaW9ucyBhdCBpbmRleCA4 ICYgOSwgdGhlbiBFUlIgcmVnaW9uIGF0IGluZGV4IDEwLCBpdCdzDQo+ID4gZWFzaWVyIGZvciB1 c2Vyc3BhY2UgdG8ga25vdyB0byBzdG9wIHNlYXJjaGluZyBhdCBpbmRleCAxMCBpbnN0ZWFkIG9m DQo+ID4gcHJvYmluZyBpbmRleGVzIGl0IG1heSBub3QgdW5kZXJzdGFuZCB0cnlpbmcgdG8gZmlu ZCB0aGUgZnVsbCBjb3VudC4NCj4gPiBEb2VzIHRoYXQgc291bmQgcmlnaHQ/DQo+ID4NCj4gPiBT byBWaWpheSwgcGxlYXNlIGRvbid0IHNob3QgbWUgZm9yIGNoYW5naW5nIG15IG1pbmQsIGJ1dCBJ J20gaW5jbGluZWQgdG8NCj4gPiB0aGluayB5b3Ugd2VyZSBwcm9iYWJseSByaWdodCB0aGF0IERF VklDRV9JTkZPIHNob3VsZCBqdXN0IHJldHVybg0KPiA+IG51bV9pcnFzID0gVkZJT19QQ0lfTlVN X0lSUVMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIEVSUl9JUlFfSU5ERVggaXMNCj4gPiBzdXBwb3J0 ZWQuICBIb3dldmVyIElSUV9JTkZPIHNob3VsZCBzdGlsbCByZXR1cm4gPDAgaWYgdGhlIGRldmlj ZSBpcyBub3QNCj4gPiBwY2llLiAgSXQgc2VlbXMgbGlrZSB0aGlzIGFsc28gbWVhbnMgdGhhdCB3 ZSBkb24ndCBuZWVkIGZsYWdzIGluZGljYXRpbmcNCj4gPiB3aGljaCBpbmRleGVzIGFyZSBwcmVz ZW50IGFzIHRoYXQgZHVwbGljYXRlcyBzaW1wbHkgbG9va2luZyBmb3IgdGhlbS4NCj4gPg0KPiA+ IFdoaWNoIGZsYWdzIGRvIHdlIGFjdHVhbGx5IG5lZWQgdGhlbj8gIFNob3VsZCB0aGUgQUVSIGZs YWcgYmUgYSBkZXZpY2UNCj4gPiBmbGFnIG9yIGlzIHN1cHBvcnRpbmcgQUVSIGVycm9yIHJlcG9y dGluZyBhIGZlYXR1cmUgb2YNCj4gPiBWRklPX1BDSV9FUlJfSVJRX0lOREVYIGFuZCBzaG91bGQg dGhlcmVmb3JlIGJlIHJlcG9ydGVkIGFzIGEgZmxhZyB0aGVyZT8NCj4gPiBTbyBmYXIgUkVHSU9O X0lORk8gYW5kIElSUV9JTkZPIGZsYWdzIG9ubHkgcmVwb3J0IGNhcGFiaWxpdGllcyBvZiB0aGUN Cj4gPiBpdGVtIGFuZCBub3QgaXQncyBwdXJwb3NlLCBidXQgc28gZmFyIGFsbCB0aGUgcmVnaW9u cyBhbmQgaXJxcyBoYXZlIHZlcnkNCj4gPiBmaXhlZCBwdXJwb3Nlcy4NCj4gPg0KPiA+IEknbSBp bmNsaW5lZCB0byB0aGluayB0aGF0IGEgTEVHQUNZX0lPUE9SVCByZWdpb24gcmVwb3J0aW5nIHRo YXQgaXQNCj4gPiBzdXBwb3J0cyBWR0EgSU9QT1JUIHNwYWNlIDNiMCBhbmQgM2MwIG1ha2VzIG1v cmUgc2Vuc2UgdGhhbiBhIGdlbmVyYWwNCj4gPiBkZXZpY2UgVkdBIGZsYWcgYW5kIGluZmVycmlu ZyAzYjAgJiAzYzAgYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZiBhDQo+ID4gTEVHQUNZX0lPUE9S VCByZWdpb24uDQo+ID4NCj4gPiBJZiB3ZSBwdXQgZmxhZ3Mgb24gSU5GT19SRUdJT04gYW5kIElO Rk9fSVJRLCB3aGVyZSBkbyB0aGV5IGdvPyAgV2UndmUNCj4gPiBnb3QgYSB1MzIgb24gZWFjaCBm b3IgZmxhZ3MuICBXZSBjb3VsZCBzcGxpdCB0aGF0IGFuZCBkZWZpbmUgYml0cyA+PTE2DQo+ID4g YXJlIGZvciB0eXBlIHNwZWNpZmljIGZsYWdzIGFuZCA8MTYgYXJlIGdlbmVyaWMuICBXZSBjb3Vs ZCBhbHNvIGRlZmluZSBhDQo+ID4gZ2VuZXJpYyBmbGFnIGluZGljYXRpbmcgYSB0eXBlIHNwZWNp ZmljIGZsYWcgZmllbGQgaXMgcHJlc2VudC4NCj4gPiByZWdpb25faW5mbyBhbHJlYWR5IGhhcyBh IHJlc2VydmVkIHUzMiBmb3IgYWxpZ25tZW50IHRoYXQgY291bGQgZmlsbA0KPiA+IHRoaXMgcm9s bCwgaXJxX2luZm8gd291bGQgbmVlZCB0byBhZGQgYSBmaWVsZC4gIFBlcmhhcHMgc29tZXRoaW5n IGxpa2U6DQo+ID4NCj4gPiAtLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdmZpby5oDQo+ID4gKysr IGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZmaW8uaA0KPiA+IEBAIC0xNzYsOCArMTc2LDkgQEAgc3Ry dWN0IHZmaW9fcmVnaW9uX2luZm8gew0KPiA+ICAjZGVmaW5lIFZGSU9fUkVHSU9OX0lORk9fRkxB R19SRUFEICAgICAoMSA8PCAwKSAvKiBSZWdpb24gc3VwcG9ydHMgcmVhZA0KPiAqLw0KPiA+ICAj ZGVmaW5lIFZGSU9fUkVHSU9OX0lORk9fRkxBR19XUklURSAgICAoMSA8PCAxKSAvKiBSZWdpb24g c3VwcG9ydHMgd3JpdGUNCj4gKi8NCj4gPiAgI2RlZmluZSBWRklPX1JFR0lPTl9JTkZPX0ZMQUdf TU1BUCAgICAgKDEgPDwgMikgLyogUmVnaW9uIHN1cHBvcnRzIG1tYXANCj4gKi8NCj4gPiArI2Rl ZmluZSBWRklPX1JFR0lPTl9JTkZPX1RZUEVfRkxBR1MgICAgKDEgPDwgMykNCj4gPiAgICAgICAg IF9fdTMyICAgaW5kZXg7ICAgICAgICAgIC8qIFJlZ2lvbiBpbmRleCAqLw0KPiA+IC0gICAgICAg X191MzIgICByZXN2OyAgICAgICAgICAgLyogUmVzZXJ2ZWQgZm9yIGFsaWdubWVudCAqLw0KPiA+ ICsgICAgICAgX191MzIgICB0eXBlX2ZsYWdzOyAgICAgLyogVHlwZSBzcGVjaWZpYyBmZWF0dXJl IGZsYWdzICovDQo+ID4gICAgICAgICBfX3U2NCAgIHNpemU7ICAgICAgICAgICAvKiBSZWdpb24g c2l6ZSAoYnl0ZXMpICovDQo+ID4gICAgICAgICBfX3U2NCAgIG9mZnNldDsgICAgICAgICAvKiBS ZWdpb24gb2Zmc2V0IGZyb20gc3RhcnQgb2YgZGV2aWNlIGZkDQo+ICovDQo+ID4gIH07DQo+ID4g QEAgLTIyMiw4ICsyMjMsMTAgQEAgc3RydWN0IHZmaW9faXJxX2luZm8gew0KPiA+ICAjZGVmaW5l IFZGSU9fSVJRX0lORk9fTUFTS0FCTEUgICAgICAgICAoMSA8PCAxKQ0KPiA+ICAjZGVmaW5lIFZG SU9fSVJRX0lORk9fQVVUT01BU0tFRCAgICAgICAoMSA8PCAyKQ0KPiA+ICAjZGVmaW5lIFZGSU9f SVJRX0lORk9fTk9SRVNJWkUgICAgICAgICAoMSA8PCAzKQ0KPiA+ICsjZGVmaW5lIFZGSU9fSVJR X0lORk9fVFlQRV9GTEFHUyAgICAgICAoMSA8PCA0KQ0KPiA+ICAgICAgICAgX191MzIgICBpbmRl eDsgICAgICAgICAgLyogSVJRIGluZGV4ICovDQo+ID4gICAgICAgICBfX3UzMiAgIGNvdW50OyAg ICAgICAgICAvKiBOdW1iZXIgb2YgSVJRcyB3aXRoaW4gdGhpcyBpbmRleCAqLw0KPiA+ICsgICAg ICAgX191MzIgICB0eXBlX2ZsYWdzOyAgICAgLyogVHlwZSBzcGVjaWZpYyBmZWF0dXJlIGZsYWdz ICovDQo+ID4gIH07DQo+ID4gICNkZWZpbmUgVkZJT19ERVZJQ0VfR0VUX0lSUV9JTkZPICAgICAg IF9JTyhWRklPX1RZUEUsIFZGSU9fQkFTRSArIDkpDQo+ID4NCj4gPiBXZSdkIHRoZW4gaGF2ZSBz b21ldGhpbmcgbGlrZQ0KPiA+DQo+ID4gI2RlZmluZSBWRklPX1BDSV9FUlJfSVJRX1RZUEVfQUVS CSgxIDw8IDApDQo+ID4NCj4gPiBhbmQNCj4gPg0KPiA+ICNkZWZpbmUgVkZJT19QQ0lfTEVHQUNZ X0lPUE9SVF9SRUdJT05fVFlQRV9WR0FfM2IwCSgxIDw8IDApDQo+ID4gI2RlZmluZSBWRklPX1BD SV9MRUdBQ1lfSU9QT1JUX1JFR0lPTl9UWVBFX1ZHQV8zYzAJKDEgPDwgMSkNCj4gPiAjZGVmaW5l IFZGSU9fUENJX0xFR0FDWV9NTUlPX1JFR0lPTl9UWVBFX1ZHQV9hMDAwMAkoMSA8PCAwKQ0KPiA+ DQo+ID4gI2RlZmluZSBWRklPX1BDSV9FUlJfUkVHSU9OX1RZUEVfQUVSCSgxIDw8IDApDQo+IA0K PiBIbW0sIG1heWJlIElSUXMgZG9uJ3QgbmVlZCBhIHR5cGVfZmxhZy4gIEZvciBWR0Egd2UncmUg ZXhwb3NpbmcgYSByZWdpb24NCj4gYW5kIGRlc2NyaWJpbmcgaW1wbGVtZW50ZWQgc2VjdGlvbnMg d2l0aGluIHRoZSByZWdpb24uICBGb3IgSVJRcywgd2UNCj4gaGF2ZSBwcmFjdGljYWxseSBhIGxp bWl0bGVzcyBzcGFjZS4gIFBlcmhhcHMgdGhhdCBtZWFucyB0aGlzIElSUSBzaG91bGQNCj4ganVz dCBiZSBQQ0lfQUVSX0VWRU5UX0lSUSBhbmQgaWYgZXZlciB3ZSBuZWVkIGEgZGlmZmVyZW50IGVy cm9yDQo+IHJlcG9ydGluZyBJUlEgd2UnbGwgYWRkIGEgbmV3IGluZGV4LiAgVGhpcyB3YXkgd2Ug ZG9uJ3QgaGF2ZSB0byBhZGQgYQ0KPiBuZXcgZmllbGQgdG8gaXJxX2luZm8gYW5kIHRyeSB0byB1 bm5lY2Vzc2FyaWx5IGdlbmVyYWxpemUgYSBzaW5nbGUNCj4gaW5kZXguDQoNCk1ha2VzIHRoaW5n cyBzaW1wbGVyLiBJIHdpbGwgYmUgdGFraW5nIG91dCB0aGUgVkZJT19ERVZJQ0VfRkxBR1NfUENJ X0FFUiogZmxhZ3MgYWx0b2dldGhlciBhbmQganVzdCBoYXZlIHRoZSBWRklPX1BDSV9FUlJfSVJR X0lOREVYLiBXaGVuIHdlIHdhbnQgdG8gYWRkIGVycm9yIHJlcG9ydGluZyB3ZSBjYW4gYWRkIGEg VkZJT19QQ0lfRVJSX1JFR0lPTl9JTkRFWC4NCg0KVmlqYXkNCg0KPiANCj4gSSdsbCBuZWVkIHRv IHRoaW5rIGFib3V0IFZHQSB0aG91Z2gsIHdlIGhhdmUgdGhlIHNhbWUgKHByYWN0aWNhbGx5KQ0K PiBsaW1pdGxlc3MgaW5kZXggcmFuZ2UgdGhlcmUgYXMgd2VsbCwgYnV0IGluIHRoZSBrZXJuZWwg c2lkZQ0KPiBpbXBsZW1lbnRhdGlvbiB3ZSB1c2VkIGZpeGVkIHNpemVkIHNlZ21lbnRzIGludG8g dGhlIGRldmljZSBmZCB0byBrbm93DQo+IHdoaWNoIHJlZ2lvbiBpcyBiZWluZyBhY2Nlc3NlZC4g IFRoaXMgaXNuJ3QgdmlzaWJsZSB0byB1c2Vyc3BhY2UsIHNvDQo+IHdlJ3JlIGZyZWUgdG8gY2hh bmdlIGl0LiAgSWYgd2UgZGlkIHRoYXQsIHdlIG1pZ2h0IGV4cG9zZSB0aGUgc3BlY2lmaWMNCj4g cmVnaW9ucyBhcyBzZXBhcmF0ZSBpbmRleGVzIHJhdGhlciB0aGFuIHRyeSB0byBnZW5lcmFsaXpl IHRoZW0gaW50bw0KPiByZXVzYWJsZSAibGVnYWN5IiByYW5nZXMuICBBZ2FpbiwgY29tbWVudHMg d2VsY29tZS4gIFRoYW5rcywNCj4gDQo+IEFsZXgNCj4gDQo+ID4NCj4gPiBXaGF0IGRvIHlvdSB0 aGluaz8gIEl0IHdvdWxkIGJlIHVzZWZ1bCB0byBwcm90b3R5cGUgdGhlc2Ugd2l0aCBib3RoIEFF Ug0KPiA+IGFuZCBWR0EgYmVmb3JlIGNvbW1pdHRpbmcuICBUaGFua3MsDQo+ID4NCj4gPiBBbGV4 DQo+ID4NCj4gPiA+ICB9Ow0KPiA+ID4gQEAgLTMxMCw2ICszMTIsNyBAQCBlbnVtIHsNCj4gPiA+ ICAJVkZJT19QQ0lfSU5UWF9JUlFfSU5ERVgsDQo+ID4gPiAgCVZGSU9fUENJX01TSV9JUlFfSU5E RVgsDQo+ID4gPiAgCVZGSU9fUENJX01TSVhfSVJRX0lOREVYLA0KPiA+ID4gKwlWRklPX1BDSV9F UlJfSVJRX0lOREVYLA0KPiA+ID4gIAlWRklPX1BDSV9OVU1fSVJRUw0KPiA+ID4gIH07DQo+ID4g Pg0KPiA+DQo+ID4NCj4gDQo+IA0KDQo= ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-02-01 10:43 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-01-28 9:54 [PATCH v2 2/3] VFIO-AER: Vfio-pci driver changes for supporting AER Pandarathil, Vijaymohan R 2013-01-28 19:31 ` Alex Williamson 2013-01-29 13:24 ` Alex Williamson 2013-02-01 10:43 ` Pandarathil, Vijaymohan R
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).