vmbus: add support for dynamic device id's
Subsystems (3)
PATCH v2 1/3 vmbus: add support for dynamic device id's
From: Stephen Hemminger <[email protected]>
This patch adds sysfs interface to dynamically bind new UUID values to existing VMBus device. This is useful for generic UIO driver to act similar to uio_pci_generic.
---
v2 - allow device driver to have empty id table, and fix bugs
drivers/hv/vmbus_drv.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++--- include/linux/hyperv.h | 6 ++ 2 files changed, 172 insertions(+), 8 deletions(-)
drivers/hv/vmbus_drv.c +166 -8
@@ -45,6 +45,11 @@#include <linux/random.h> #include "hyperv_vmbus.h" +struct vmbus_dynid { +struct list_head node; +struct hv_vmbus_device_id id; +}; +static struct acpi_device *hv_acpi_dev;static struct completion probe_event;
@@ -500,7 +505,7 @@ static ssize_t device_show(struct device *dev,static DEVICE_ATTR_RO (device);/* Set up per device attributes in /sys/bus/vmbus/devices/<bus device> */ -static struct attribute *vmbus_attrs[] = { +static struct attribute *vmbus_dev_attrs[] = { &dev_attr_id.attr, &dev_attr_state.attr, &dev_attr_monitor_id.attr,
@@ -528,7 +533,7 @@ static struct attribute *vmbus_attrs[] = { &dev_attr_device.attr,NULL , }; -ATTRIBUTE_GROUPS (vmbus); +ATTRIBUTE_GROUPS (vmbus_dev);/* * vmbus_uevent - add uevent for our device
@@ -565,10 +570,29 @@ static inline bool is_null_guid(const uuid_le *guid)* Return a matching hv_vmbus_device_id pointer. * If there is no match, return NULL. */ -static const struct hv_vmbus_device_id *hv_vmbus_get_id ( -const struct hv_vmbus_device_id *id, +static const struct hv_vmbus_device_id *hv_vmbus_get_id (struct hv_driver *drv,const uuid_le *guid) { +const struct hv_vmbus_device_id *id =NULL ; +struct vmbus_dynid *dynid; + +/* Look at the dynamic ids first, before the static ones */ +spin_lock (&drv->dynids.lock); +list_for_each_entry (dynid, &drv->dynids.list, node) { +if (!uuid_le_cmp (dynid->id.guid, *guid)) { + id = &dynid->id; +break ; + } + } +spin_unlock (&drv->dynids.lock); + +if (id) +return id; + + id = drv->id_table; +if (id ==NULL ) +return NULL ;/* empty device table */ +for (; !is_null_guid (&id->guid); id++)if (!uuid_le_cmp (id->guid, *guid))return id;
@@ -576,6 +600,134 @@ static const struct hv_vmbus_device_id *hv_vmbus_get_id(return NULL ; } +/* vmbus_add_dynid - add a new device ID to this driver and re-probe devices */ +static int vmbus_add_dynid (struct hv_driver *drv,uuid_le *guid) +{ +struct vmbus_dynid *dynid; + + dynid =kzalloc (sizeof (*dynid),GFP_KERNEL ); +if (!dynid) +return -ENOMEM ; + + dynid->id.guid = *guid; + +spin_lock (&drv->dynids.lock); +list_add_tail (&dynid->node, &drv->dynids.list); +spin_unlock (&drv->dynids.lock); + +return driver_attach (&drv->driver); +} + +static void vmbus_free_dynids (struct hv_driver *drv) +{ +struct vmbus_dynid *dynid, *n; + +spin_lock (&drv->dynids.lock); +list_for_each_entry_safe (dynid, n, &drv->dynids.list, node) { +list_del (&dynid->node); +kfree (dynid); + } +spin_unlock (&drv->dynids.lock); +} + +/* Parse string of form: 1b4e28ba-2fa1-11d2-883f-b9a761bde3f */ +static int get_uuid_le (const char *str,uuid_le *uu) +{ +unsigned int b[16 ]; +int i; + +if (strlen (str) <37 ) +return -1 ; + +for (i =0 ; i <36 ; i++) { +switch (i) { +case 8 :case 13 :case 18 :case 23 : +if (str[i] !='-' ) +return -1 ; +break ; +default : +if (!isxdigit (str[i])) +return -1 ; + } + } + +/* unparse little endian output byte order */ +if (sscanf (str, +"%2x%2x%2x%2x-%2x%2x-%2x%2x-%2x%2x-%2x%2x%2x%2x%2x%2x" , + &b[3 ], &b[2 ], &b[1 ], &b[0 ], + &b[5 ], &b[4 ], &b[7 ], &b[6 ], &b[8 ], &b[9 ], + &b[10 ], &b[11 ], &b[12 ], &b[13 ], &b[14 ], &b[15 ]) !=16 ) +return -1 ; + +for (i =0 ; i <16 ; i++) + uu->b[i] = b[i]; +return 0 ; +} + +/* +* store_new_id - sysfs frontend to vmbus_add_dynid() +* +* Allow GUIDs to be added to an existing driver via sysfs. +*/ +static ssize_t store_new_id (struct device_driver *driver,const char *buf, +size_t count) +{ +struct hv_driver *drv =drv_to_hv_drv (driver); +uuid_le guid =NULL_UUID_LE ; +ssize_t retval; + +if (get_uuid_le (buf, &guid) !=0 ) +return -EINVAL ; + +if (hv_vmbus_get_id (drv, &guid)) +return -EEXIST ; + + retval =vmbus_add_dynid (drv, &guid); +if (retval) +return retval; +return count; +} +static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id); + +/* +* store_remove_id - remove a PCI device ID from this driver +* +* Removes a dynamic pci device ID to this driver. +*/ +static ssize_t store_remove_id (struct device_driver *driver,const char *buf, +size_t count) +{ +struct hv_driver *drv =drv_to_hv_drv (driver); +struct vmbus_dynid *dynid, *n; +uuid_le guid =NULL_UUID_LE ; +size_t retval = -ENODEV ; + +if (get_uuid_le (buf, &guid)) +return -EINVAL ; + +spin_lock (&drv->dynids.lock); +list_for_each_entry_safe (dynid, n, &drv->dynids.list, node) { +struct hv_vmbus_device_id *id = &dynid->id; + +if (!uuid_le_cmp (id->guid, guid)) { +list_del (&dynid->node); +kfree (dynid); + retval = count; +break ; + } + } +spin_unlock (&drv->dynids.lock); + +return retval; +} +static DRIVER_ATTR(remove_id, S_IWUSR, NULL, store_remove_id); + +static struct attribute *vmbus_drv_attrs[] = { + &driver_attr_new_id.attr, + &driver_attr_remove_id.attr, +NULL , +}; +ATTRIBUTE_GROUPS (vmbus_drv);/*
@@ -590,7 +742,7 @@ static int vmbus_match(struct device *device, struct device_driver *driver)if (is_hvsock_channel (hv_dev->channel))return drv->hvsock; -if (hv_vmbus_get_id (drv->id_table, &hv_dev->dev_type)) +if (hv_vmbus_get_id (drv, &hv_dev->dev_type))return 1 ;return 0 ;
@@ -607,7 +759,7 @@ static int vmbus_probe(struct device *child_device)struct hv_device *dev =device_to_hv_device (child_device);const struct hv_vmbus_device_id *dev_id; - dev_id =hv_vmbus_get_id (drv->id_table, &dev->dev_type); + dev_id =hv_vmbus_get_id (drv, &dev->dev_type);if (drv->probe) { ret = drv->probe (dev, dev_id);if (ret !=0 )
@@ -684,7 +836,8 @@ static struct bus_type hv_bus = { .remove = vmbus_remove, .probe = vmbus_probe, .uevent = vmbus_uevent, - .dev_groups = vmbus_groups, + .dev_groups = vmbus_dev_groups, + .drv_groups = vmbus_drv_groups, };struct onmessage_work_context {
@@ -905,6 +1058,9 @@ int __vmbus_driver_register(struct hv_driver *hv_driver, struct module *owner, c hv_driver->driver.mod_name = mod_name; hv_driver->driver.bus = &hv_bus; +spin_lock_init (&hv_driver->dynids.lock); +INIT_LIST_HEAD (&hv_driver->dynids.list); + ret =driver_register (&hv_driver->driver);return ret;
@@ -923,8 +1079,10 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver) {pr_info ("unregistering driver %s\n" , hv_driver->name); -if (!vmbus_exists ()) +if (!vmbus_exists ()) {driver_unregister (&hv_driver->driver); +vmbus_free_dynids (hv_driver); + } }EXPORT_SYMBOL_GPL (vmbus_driver_unregister);
include/linux/hyperv.h +6 -0
@@ -1119,6 +1119,12 @@ struct hv_driver {struct device_driver driver; +/* dynamic device GUID's */ +struct { +spinlock_t lock; +struct list_head list; + } dynids; +int (*probe)(struct hv_device *,const struct hv_vmbus_device_id *);int (*remove)(struct hv_device *);void (*shutdown)(struct hv_device *);
Signature · 1 line
2.9.3
PATCH v2 2/3 uio-hv-generic: new userspace i/o driver for VMBus
From: Stephen Hemminger <[email protected]>
This is a new driver to enable userspace networking on VMBus. It is based largely on the similar driver that already exists for PCI, and earlier work done by Brocade to support DPDK.
---
v2 - put in UIO not staging
rename to uio-hv-generic (since it is like uio-pci-generic) add example to comment
drivers/hv/connection.c | 1 + drivers/uio/Kconfig | 9 ++ drivers/uio/Makefile | 1 + drivers/uio/uio_hv_generic.c | 216 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 227 insertions(+) create mode 100644 drivers/uio/uio_hv_generic.c
drivers/hv/connection.c +1 -0
@@ -39,6 +39,7 @@ struct vmbus_connection vmbus_connection = { .conn_state = DISCONNECTED, .next_gpadl_handle = ATOMIC_INIT(0xE1E10), }; +EXPORT_SYMBOL_GPL (vmbus_connection);/* * Negotiated protocol version with the host.
drivers/uio/Kconfig +9 -0
@@ -155,4 +155,13 @@ config UIO_MF624 If you compile this as a module, it will be called uio_mf624. +config UIO_HV_GENERIC + tristate "Generic driver for Hyper-V VMBus" + depends on HYPERV + help + Generic driver that you can bind, dynamically, to any + Hyper-V VMBus device. It is useful to provide direct access + to network and storage devices from userspace. + + If you compile this as a module, it will be called uio_hv_generic. endif
drivers/uio/Makefile +1 -0
@@ -9,3 +9,4 @@ obj-$(CONFIG_UIO_NETX) += uio_netx.o obj-$(CONFIG_UIO_PRUSS) += uio_pruss.o obj-$(CONFIG_UIO_MF624) += uio_mf624.o obj-$(CONFIG_UIO_FSL_ELBC_GPCM) += uio_fsl_elbc_gpcm.o +obj-$(CONFIG_UIO_HV_GENERIC) += uio_hv_generic.o
drivers/uio/uio_hv_generic.c new file +216 -0
216 lines not on this page · raw message
Signature · 1 line
2.9.3
PATCH v2 3/3 doc: add documentation for uio-hv-generic
In reply to Stephen HemmingerFrom: Stephen Hemminger <[email protected]>
Update UIO documentation to include basic information about uio_hv_generic.
--- Documentation/DocBook/uio-howto.tmpl | 62 ++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+)
Documentation/DocBook/uio-howto.tmpl +62 -0
@@ -46,6 +46,13 @@ GPL version 2. <revhistory> <revision> + <revnumber>0.10</revnumber> + <date>2016-10-17</date> + <authorinitials>sch</authorinitials> + <revremark>Added generic hyperv driver + </revremark> + </revision> + <revision> <revnumber>0.9</revnumber> <date>2009-07-16</date> <authorinitials>mst</authorinitials>
@@ -1033,6 +1040,61 @@ int main() </chapter> +<chapter id="uio_hv_generic" xreflabel="Using Generic driver for Hyper-V VMBUS"> +<?dbhtml filename="uio_hv_generic.html"?> +<title>Generic Hyper-V UIO driver</title> + <para> + The generic driver is a kernel module named uio_hv_generic. + It supports devices on the Hyper-V VMBus similar to uio_pci_generic + on PCI bus. + </para> + +<sect1 id="uio_hv_generic_binding"> +<title>Making the driver recognize the device</title> + <para> +Since the driver does not declare any device GUID's, it will not get loaded +automatically and will not automatically bind to any devices, you must load it +and allocate id to the driver yourself. For example, to use the network device +GUID: + <programlisting> + modprobe uio_hv_generic + echo "f8615163-df3e-46c5-913f-f2d2f965ed0e" > /sys/bus/vmbus/drivers/uio_hv_generic/new_id + </programlisting> + </para> + <para> +If there already is a hardware specific kernel driver for the device, the +generic driver still won't bind to it, in this case if you want to use the +generic driver (why would you?) you'll have to manually unbind the hardware +specific driver and bind the generic driver, like this: + <programlisting> + echo -n vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3 > /sys/bus/vmbus/drivers/hv_netvsc/unbind + echo -n vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3 > /sys/bus/vmbus/drivers/uio_hv_generic/bind + </programlisting> + </para> + <para> +You can verify that the device has been bound to the driver +by looking for it in sysfs, for example like the following: + <programlisting> + ls -l /sys/bus/vmbus/devices/vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3/driver + </programlisting> +Which if successful should print + <programlisting> + .../vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3/driver -> ../../../bus/vmbus/drivers/uio_hv_generic + </programlisting> + </para> +</sect1> + +<sect1 id="uio_hv_generic_internals"> +<title>Things to know about uio_hv_generic</title> + <para> +On each interrupt, uio_hv_generic sets the Interrupt Disable bit. +This prevents the device from generating further interrupts +until the bit is cleared. The userspace driver should clear this +bit before blocking and waiting for more interrupts. + </para> +</sect1> +</chapter> + <appendix id="app1"> <title>Further information</title> <itemizedlist>
Signature · 1 line
2.9.3
Re: [PATCH v2 3/3] doc: add documentation for uio-hv-generic
Quoted 4 lines · Stephen Hemminger
From: Stephen Hemminger <[email protected]>
Update UIO documentation to include basic information about
uio_hv_generic.
How about converting to Sphinx/reStructuredText first...? It's not a big file...
BR,
Jani.
Quoted 86 lines
Signed-off-by Stephen Hemminger <[email protected]>--- Documentation/DocBook/uio-howto.tmpl | 62 ++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+)Documentation/DocBook/uio-howto.tmpl +62
-0@@ -46,6 +46,13 @@ GPL version 2. <revhistory> <revision> + <revnumber>0.10</revnumber> + <date>2016-10-17</date> + <authorinitials>sch</authorinitials> + <revremark>Added generic hyperv driver + </revremark> + </revision> + <revision> <revnumber>0.9</revnumber> <date>2009-07-16</date> <authorinitials>mst</authorinitials>@@ -1033,6 +1040,61 @@ int main() </chapter> +<chapter id="uio_hv_generic" xreflabel="Using Generic driver for Hyper-V VMBUS"> +<?dbhtml filename="uio_hv_generic.html"?> +<title>Generic Hyper-V UIO driver</title> + <para> + The generic driver is a kernel module named uio_hv_generic. + It supports devices on the Hyper-V VMBus similar to uio_pci_generic + on PCI bus. + </para> + +<sect1 id="uio_hv_generic_binding"> +<title>Making the driver recognize the device</title> + <para> +Since the driver does not declare any device GUID's, it will not get loaded +automatically and will not automatically bind to any devices, you must load it +and allocate id to the driver yourself. For example, to use the network device +GUID: + <programlisting> + modprobe uio_hv_generic + echo "f8615163-df3e-46c5-913f-f2d2f965ed0e" > /sys/bus/vmbus/drivers/uio_hv_generic/new_id + </programlisting> + </para> + <para> +If there already is a hardware specific kernel driver for the device, the +generic driver still won't bind to it, in this case if you want to use the +generic driver (why would you?) you'll have to manually unbind the hardware +specific driver and bind the generic driver, like this: + <programlisting> + echo -n vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3 > /sys/bus/vmbus/drivers/hv_netvsc/unbind + echo -n vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3 > /sys/bus/vmbus/drivers/uio_hv_generic/bind + </programlisting> + </para> + <para> +You can verify that the device has been bound to the driver +by looking for it in sysfs, for example like the following: + <programlisting> + ls -l /sys/bus/vmbus/devices/vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3/driver + </programlisting> +Which if successful should print + <programlisting> + .../vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3/driver -> ../../../bus/vmbus/drivers/uio_hv_generic + </programlisting> + </para> +</sect1> + +<sect1 id="uio_hv_generic_internals"> +<title>Things to know about uio_hv_generic</title> + <para> +On each interrupt, uio_hv_generic sets the Interrupt Disable bit. +This prevents the device from generating further interrupts +until the bit is cleared. The userspace driver should clear this +bit before blocking and waiting for more interrupts. + </para> +</sect1> +</chapter> + <appendix id="app1"> <title>Further information</title> <itemizedlist>
Signature · 1 line
Jani Nikula, Intel Open Source Technology Center
Re: [PATCH v2 3/3] doc: add documentation for uio-hv-generic
Am 18.10.2016 um 12:54 schrieb Jani Nikula <[email protected]>:
Quoted 9 lines · Stephen Hemminger
Quoted 4 lines
From: Stephen Hemminger <[email protected]>
Update UIO documentation to include basic information about
uio_hv_generic.How about converting to Sphinx/reStructuredText first...? It's not a big file...
The files from :
https://github.com/return42/sphkerneldoc/tree/master/doc/Documentation/books_migrated/uio-howto
might be a good starting point for migration / if you use them, please drop the comments at the end of each file.
--M--
Quoted 98 lines
BR,
Jani.Quoted 86 lines
Signed-off-by Stephen Hemminger <[email protected]>---
Documentation/DocBook/uio-howto.tmpl| 62 ++++++++++++++++++++++++++++++++++++1 file changed, 62 insertions(+)Documentation/DocBook/uio-howto.tmpl +0
-0@@ -46,6 +46,13 @@ GPL version 2.<revhistory>
<revision>Documentation/DocBook/uio-howto.tmpl +7
-0+ <revnumber>0.10</revnumber> + <date>2016-10-17</date> + <authorinitials>sch</authorinitials> + <revremark>Added generic hyperv driver + </revremark> + </revision> + <revision><revnumber>0.9</revnumber> <date>2009-07-16</date> <authorinitials>mst</authorinitials>Documentation/DocBook/uio-howto.tmpl +0
-0@@ -1033,6 +1040,61 @@ int main()</chapter>
+<chapter id="uio_hv_generic" xreflabel="Using Generic driver for Hyper-V VMBUS"> +<?dbhtml filename="uio_hv_generic.html"?>
+<title>Generic Hyper-V UIO driver</title>Documentation/DocBook/uio-howto.tmpl +52
-0+ <para> + The generic driver is a kernel module named uio_hv_generic. + It supports devices on the Hyper-V VMBus similar to uio_pci_generic + on PCI bus. + </para> + +<sect1 id="uio_hv_generic_binding"> +<title>Making the driver recognize the device</title> + <para> +Since the driver does not declare any device GUID's, it will not get loaded +automatically and will not automatically bind to any devices, you must load it +and allocate id to the driver yourself. For example, to use the network device +GUID: + <programlisting> + modprobe uio_hv_generic + echo "f8615163-df3e-46c5-913f-f2d2f965ed0e" > /sys/bus/vmbus/drivers/uio_hv_generic/new_id + </programlisting> + </para> + <para> +If there already is a hardware specific kernel driver for the device, the +generic driver still won't bind to it, in this case if you want to use the +generic driver (why would you?) you'll have to manually unbind the hardware +specific driver and bind the generic driver, like this: + <programlisting> + echo -n vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3 > /sys/bus/vmbus/drivers/hv_netvsc/unbind + echo -n vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3 > /sys/bus/vmbus/drivers/uio_hv_generic/bind + </programlisting> + </para> + <para> +You can verify that the device has been bound to the driver +by looking for it in sysfs, for example like the following: + <programlisting> + ls -l /sys/bus/vmbus/devices/vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3/driver + </programlisting> +Which if successful should print + <programlisting> + .../vmbus-ed963694-e847-4b2a-85af-bc9cfc11d6f3/driver -> ../../../bus/vmbus/drivers/uio_hv_generic + </programlisting> + </para> +</sect1> + +<sect1 id="uio_hv_generic_internals"> +<title>Things to know about uio_hv_generic</title> + <para> +On each interrupt, uio_hv_generic sets the Interrupt Disable bit. +This prevents the device from generating further interrupts +until the bit is cleared. The userspace driver should clear this +bit before blocking and waiting for more interrupts. + </para> +</sect1> +</chapter> +<appendix id="app1">
<title>Further information</title>
<itemizedlist>Signature · 5 lines
Jani Nikula, Intel Open Source Technology Center -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 3/3] doc: add documentation for uio-hv-generic
Quoted 12 lines · On Tue, 18 Oct 2016 13:01:20 +0200 Markus Heiser <[email protected]>…
Am 18.10.2016 um 12:54 schrieb Jani Nikula <[email protected]>:
Quoted 9 lines · Stephen Hemminger
Quoted 4 lines
From: Stephen Hemminger <[email protected]>
Update UIO documentation to include basic information about
uio_hv_generic.How about converting to Sphinx/reStructuredText first...? It's not a big file...
Quoted 8 lines
The files from :
https://github.com/return42/sphkerneldoc/tree/master/doc/Documentation/books_migrated/uio-howto
might be a good starting point for migration / if you use them, please drop the comments at the end of each file.
--M--
Sure, you are welcome to do this. I just wanted to add to existing documentation in existing format.
Re: [PATCH v2 3/3] doc: add documentation for uio-hv-generic
Am 18.10.2016 um 15:59 schrieb Stephen Hemminger <[email protected]>:
Quoted 19 lines
Quoted 16 lines · On Tue, 18 Oct 2016 13:01:20 +0200 Markus Heiser <[email protected]>…
Am 18.10.2016 um 12:54 schrieb Jani Nikula <[email protected]>:
Quoted 9 lines · Stephen Hemminger
Quoted 4 lines
From: Stephen Hemminger <[email protected]>
Update UIO documentation to include basic information about
uio_hv_generic.How about converting to Sphinx/reStructuredText first...? It's not a big file...
The files from :
https://github.com/return42/sphkerneldoc/tree/master/doc/Documentation/books_migrated/uio-howto
Quoted 7 lines
Quoted 4 lines
might be a good starting point for migration / if you use them, please drop the comments at the end of each file.
--M--
Sure, you are welcome to do this. I just wanted to add to existing documentation in existing format.
OK, I will send a patch / hope Greck and you will give me your acked ;-)
--M--
Re: [PATCH v2 3/3] doc: add documentation for uio-hv-generic
In reply to Stephen HemmingerQuoted 4 lines · On Mon, 17 Oct 2016 12:33:19 -0700 Stephen Hemminger…
From: Stephen Hemminger <[email protected]>
Update UIO documentation to include basic information about
uio_hv_generic.
I've applied this to the docs tree, thanks.
jon
Quoted 6 lines · Stephen Hemminger
From: Stephen Hemminger <[email protected]>
This patch adds sysfs interface to dynamically bind new UUID values to existing VMBus device. This is useful for generic UIO driver to act similar to
uio_pci_generic.
Quoted 7 lines
Signed-off-by Stephen Hemminger <[email protected]>---
v2 - allow device driver to have empty id table, and fix bugsdrivers/hv/vmbus_drv.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++--- include/linux/hyperv.h | 6 ++ 2 files changed, 172 insertions(+), 8 deletions(-)
Can I get an ack from the hyperv maintainers before accepting this?
thanks,
greg k-h