linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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, qemu-devel, linux-pci, linux-kernel

 
	- 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,
	qemu-devel, linux-pci, linux-kernel

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,
	qemu-devel, linux-pci, linux-kernel

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,
	qemu-devel, linux-pci, linux-kernel

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).