Address Greg's VmBus audit comments: 1) Leverage driver_data field in struct hv_vmbus_device_id to simplify driver code. 2) Make the util driver conform to the Linux Driver Model. 3) Get rid of the ext field in struct hv_device by using the driver specific data functionality. 4) Other general cleanup. Regards, K. Y
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 01/25] Staging: hv: vmbus: Rename vmbus_child_device_create
The vmbus devices are NOT child devices; rename vmbus_child_device_create
to reflect this.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/channel_mgmt.c | 2 +-
drivers/staging/hv/hyperv_vmbus.h | 2 +-
drivers/staging/hv/vmbus_drv.c | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/hv/channel_mgmt.c
b/drivers/staging/hv/channel_mgmt.c
index 11beb41..f99b944 100644
--- a/drivers/staging/hv/channel_mgmt.c
+++ b/drivers/staging/hv/channel_mgmt.c
@@ -383,7 +383,7 @@ static void vmbus_process_offer(struct work_struct *work)
* We need to set the DeviceObject field before calling
* vmbus_child_dev_add()
*/
- newchannel->device_obj = vmbus_child_device_create(
+ newchannel->device_obj = vmbus_device_create(
&newchannel->offermsg.offer.if_type,
&newchannel->offermsg.offer.if_instance,
newchannel);
diff --git a/drivers/staging/hv/hyperv_vmbus.h
b/drivers/staging/hv/hyperv_vmbus.h
index 16ca90d..e97e2cf 100644
--- a/drivers/staging/hv/hyperv_vmbus.h
+++ b/drivers/staging/hv/hyperv_vmbus.h
@@ -601,7 +601,7 @@ extern struct vmbus_connection vmbus_connection;
/* General vmbus interface */
-struct hv_device *vmbus_child_device_create(uuid_le *type,
+struct hv_device *vmbus_device_create(uuid_le *type,
uuid_le *instance,
struct vmbus_channel *channel);
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index c0f3b7a..382baee 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -594,10 +594,10 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver)
EXPORT_SYMBOL_GPL(vmbus_driver_unregister);
/*
- * vmbus_child_device_create - Creates and registers a new child device
+ * vmbus_device_create - Creates and registers a new child device
* on the vmbus.
*/
-struct hv_device *vmbus_child_device_create(uuid_le *type,
+struct hv_device *vmbus_device_create(uuid_le *type,
uuid_le *instance,
struct vmbus_channel *channel)
{
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 03/25] Staging: hv: vmbus: Rename vmbus_child_device_unregister
The vmbus devices are NOT child devices; rename vmbus_child_device_unregister
to reflect this.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/channel_mgmt.c | 2 +-
drivers/staging/hv/hyperv_vmbus.h | 2 +-
drivers/staging/hv/vmbus_drv.c | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/hv/channel_mgmt.c
b/drivers/staging/hv/channel_mgmt.c
index a927046..60ce1d1 100644
--- a/drivers/staging/hv/channel_mgmt.c
+++ b/drivers/staging/hv/channel_mgmt.c
@@ -333,7 +333,7 @@ static void vmbus_process_rescind_offer(struct work_struct
*work)
struct vmbus_channel,
work);
- vmbus_child_device_unregister(channel->device_obj);
+ vmbus_device_unregister(channel->device_obj);
}
/*
diff --git a/drivers/staging/hv/hyperv_vmbus.h
b/drivers/staging/hv/hyperv_vmbus.h
index b2dfcd6..3d2d836 100644
--- a/drivers/staging/hv/hyperv_vmbus.h
+++ b/drivers/staging/hv/hyperv_vmbus.h
@@ -606,7 +606,7 @@ struct hv_device *vmbus_device_create(uuid_le *type,
struct vmbus_channel *channel);
int vmbus_device_register(struct hv_device *child_device_obj);
-void vmbus_child_device_unregister(struct hv_device *device_obj);
+void vmbus_device_unregister(struct hv_device *device_obj);
/* static void */
/* VmbusChildDeviceDestroy( */
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index 6d54ea1..375e451 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -650,10 +650,10 @@ int vmbus_device_register(struct hv_device
*child_device_obj)
}
/*
- * vmbus_child_device_unregister - Remove the specified child device
+ * vmbus_device_unregister - Remove the specified child device
* from the vmbus.
*/
-void vmbus_child_device_unregister(struct hv_device *device_obj)
+void vmbus_device_unregister(struct hv_device *device_obj)
{
/*
* Kick off the process of unregistering the device.
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 04/25] Staging: hv: vmbus: Cleanup dated comments in channel_mgmt.c
Cleanup dated comments in channel_mgmt.c.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/channel_mgmt.c | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/hv/channel_mgmt.c
b/drivers/staging/hv/channel_mgmt.c
index 60ce1d1..c68e5fa 100644
--- a/drivers/staging/hv/channel_mgmt.c
+++ b/drivers/staging/hv/channel_mgmt.c
@@ -433,9 +433,6 @@ static void vmbus_process_offer(struct work_struct *work)
/*
* vmbus_onoffer - Handler for channel offers from vmbus in parent partition.
*
- * We ignore all offers except network and storage offers. For each network and
- * storage offers, we create a channel object and queue a work item to the
- * channel object to process the offer synchronously
*/
static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
{
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 06/25] Staging: hv: storvsc: Use the driver_data to identify ide
Use the driver_data to identify ide devices in storvsc_probe().
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/storvsc_drv.c | 13 +++++--------
1 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index fff1e5b..e2c63e5 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -1366,10 +1366,12 @@ static struct scsi_host_template scsi_driver = {
static const struct hv_vmbus_device_id id_table[] = {
/* SCSI guid */
{ VMBUS_DEVICE(0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d,
- 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f) },
+ 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f)
+ .driver_data = 0 },
/* IDE guid */
{ VMBUS_DEVICE(0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44,
- 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5) },
+ 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5)
+ .driver_data = 1 },
{ },
};
@@ -1387,15 +1389,10 @@ static int storvsc_probe(struct hv_device *device,
struct Scsi_Host *host;
struct hv_host_device *host_dev;
struct storvsc_device_info device_info;
- bool dev_is_ide;
+ bool dev_is_ide = ((dev_id->driver_data == 1) ? true : false);
int path = 0;
int target = 0;
- if (!memcmp(&device->dev_type.b, id_table[1].guid, sizeof(uuid_le)))
- dev_is_ide = true;
- else
- dev_is_ide = false;
-
host = scsi_host_alloc(&scsi_driver,
sizeof(struct hv_host_device));
if (!host)
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 07/25] Staging: hv: vmbus: Change the signature of struct hv_driver remove() function
In preparation for leveraging the driver_data in struct
hv_vmbus_device_id, change the signature of struct hv_driver remove() function.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/hv_mouse.c | 3 ++-
drivers/staging/hv/hv_util.c | 3 ++-
drivers/staging/hv/hyperv.h | 2 +-
drivers/staging/hv/netvsc_drv.c | 3 ++-
drivers/staging/hv/storvsc_drv.c | 3 ++-
drivers/staging/hv/vmbus_drv.c | 9 ++++++++-
6 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c
index 5ff8a03..d60f287 100644
--- a/drivers/staging/hv/hv_mouse.c
+++ b/drivers/staging/hv/hv_mouse.c
@@ -847,7 +847,8 @@ static int mousevsc_probe(struct hv_device *dev,
return 0;
}
-static int mousevsc_remove(struct hv_device *dev)
+static int mousevsc_remove(struct hv_device *dev,
+ const struct hv_vmbus_device_id *dev_id)
{
struct input_device_context *input_dev_ctx;
int ret;
diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c
index d9460fdd..661631d 100644
--- a/drivers/staging/hv/hv_util.c
+++ b/drivers/staging/hv/hv_util.c
@@ -245,7 +245,8 @@ static int util_probe(struct hv_device *dev,
return 0;
}
-static int util_remove(struct hv_device *dev)
+static int util_remove(struct hv_device *dev,
+ const struct hv_vmbus_device_id *dev_id)
{
return 0;
}
diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h
index caa3a7b..cf02ae1 100644
--- a/drivers/staging/hv/hyperv.h
+++ b/drivers/staging/hv/hyperv.h
@@ -811,7 +811,7 @@ struct hv_driver {
struct device_driver driver;
int (*probe)(struct hv_device *, const struct hv_vmbus_device_id *);
- int (*remove)(struct hv_device *);
+ int (*remove)(struct hv_device *, const struct hv_vmbus_device_id *);
void (*shutdown)(struct hv_device *);
};
diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index d06cde2..d0189a3 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -384,7 +384,8 @@ out:
return ret;
}
-static int netvsc_remove(struct hv_device *dev)
+static int netvsc_remove(struct hv_device *dev,
+ const struct hv_vmbus_device_id *dev_id)
{
struct net_device *net = dev_get_drvdata(&dev->device);
struct net_device_context *ndev_ctx;
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index e2c63e5..e5da758 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -1021,7 +1021,8 @@ static unsigned int copy_to_bounce_buffer(struct
scatterlist *orig_sgl,
}
-static int storvsc_remove(struct hv_device *dev)
+static int storvsc_remove(struct hv_device *dev,
+ const struct hv_vmbus_device_id *dev_id)
{
struct Scsi_Host *host = dev_get_drvdata(&dev->device);
struct hv_host_device *host_dev diff --git a/drivers/staging/hv/vmbus_drv.c
b/drivers/staging/hv/vmbus_drv.c
index c7df7f4..b9aeb76 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -329,12 +329,19 @@ static int vmbus_remove(struct device *child_device)
struct hv_driver *drv;
struct hv_device *dev = device_to_hv_device(child_device);
+ const struct hv_vmbus_device_id *dev_id;
if (child_device->driver) {
drv = drv_to_hv_drv(child_device->driver);
+ dev_id = drv->id_table;
+
+ for (; !is_null_guid(dev_id->guid); dev_id++)
+ if (!memcmp(&dev_id->guid, &dev->dev_type.b,
+ sizeof(uuid_le)))
+ break;
if (drv->remove) {
- ret = drv->remove(dev);
+ ret = drv->remove(dev, dev_id);
} else {
pr_err("remove not set for driver %s\n",
dev_name(child_device));
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 08/25] Staging: hv: util: Perform some service specific initialization in util_probe()
In preparation for modifying the util driver to fully conform to the
Linux Driver Model, perform some service specific initialization in
util_probe() as opposed to in init_hyperv_utils() as is currently done.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/hv_util.c | 77 ++++++++++++++++++++++++++++-------------
1 files changed, 52 insertions(+), 25 deletions(-)
diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c
index 661631d..b86128a 100644
--- a/drivers/staging/hv/hv_util.c
+++ b/drivers/staging/hv/hv_util.c
@@ -34,6 +34,13 @@ static u8 *shut_txf_buf;
static u8 *time_txf_buf;
static u8 *hbeat_txf_buf;
+enum hv_util_services {
+ HV_SHUTDOWN,
+ HV_TIMESYNC,
+ HV_HEARTBEAT,
+ HV_KVP,
+};
+
static void shutdown_onchannelcallback(void *context)
{
struct vmbus_channel *channel = context;
@@ -242,7 +249,43 @@ static void heartbeat_onchannelcallback(void *context)
static int util_probe(struct hv_device *dev,
const struct hv_vmbus_device_id *dev_id)
{
+ void *buf = NULL;
+ int service = dev_id->driver_data;
+
+ switch (service) {
+ case HV_SHUTDOWN:
+ buf = shut_txf_buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (!shut_txf_buf)
+ goto error;
+ break;
+
+ case HV_TIMESYNC:
+ buf = time_txf_buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (!time_txf_buf)
+ goto error;
+ break;
+
+ case HV_HEARTBEAT:
+ buf = hbeat_txf_buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (!hbeat_txf_buf)
+ goto error;
+ break;
+
+ case HV_KVP:
+ if (hv_kvp_init())
+ return -ENODEV;
+ break;
+
+ default:
+ pr_err("unknown util service\n");
+ return -ENODEV;
+ }
+
return 0;
+
+error:
+ return -ENOMEM;
+
}
static int util_remove(struct hv_device *dev,
@@ -254,16 +297,20 @@ static int util_remove(struct hv_device *dev,
static const struct hv_vmbus_device_id id_table[] = {
/* Shutdown guid */
{ VMBUS_DEVICE(0x31, 0x60, 0x0B, 0X0E, 0x13, 0x52, 0x34, 0x49,
- 0x81, 0x8B, 0x38, 0XD9, 0x0C, 0xED, 0x39, 0xDB) },
+ 0x81, 0x8B, 0x38, 0XD9, 0x0C, 0xED, 0x39, 0xDB)
+ .driver_data = HV_SHUTDOWN },
/* Time synch guid */
{ VMBUS_DEVICE(0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49,
- 0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf) },
+ 0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf)
+ .driver_data = HV_TIMESYNC },
/* Heartbeat guid */
{ VMBUS_DEVICE(0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e,
- 0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d) },
+ 0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d)
+ .driver_data = HV_HEARTBEAT },
/* KVP guid */
{ VMBUS_DEVICE(0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d,
- 0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6) },
+ 0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6)
+ .driver_data = HV_KVP },
{ },
};
@@ -282,24 +329,10 @@ static int __init init_hyperv_utils(void)
int ret;
pr_info("Registering HyperV Utility Driver\n");
- if (hv_kvp_init())
- return -ENODEV;
-
-
- shut_txf_buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
- time_txf_buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
- hbeat_txf_buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
-
- if (!shut_txf_buf || !time_txf_buf || !hbeat_txf_buf) {
- pr_info("Unable to allocate memory for receive buffer\n");
- ret = -ENOMEM;
- goto err;
- }
-
ret = vmbus_driver_register(&util_drv);
if (ret != 0)
- goto err;
+ return ret;
hv_cb_utils[HV_SHUTDOWN_MSG].callback = &shutdown_onchannelcallback;
@@ -311,12 +344,6 @@ static int __init init_hyperv_utils(void)
return 0;
-err:
- kfree(shut_txf_buf);
- kfree(time_txf_buf);
- kfree(hbeat_txf_buf);
-
- return ret;
}
static void exit_hyperv_utils(void)
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 09/25] Staging: hv: util: Perform some service specific de-initialization in util_remove()
In preparation for modifying the util driver to fully conform to the
Linux Driver Model, perform some service specific de-initialization in
util_remove() as opposed to in exit_hyperv_utils() as is currently done.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/hv_util.c | 29 ++++++++++++++++++++++++-----
1 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c
index b86128a..2475ab2 100644
--- a/drivers/staging/hv/hv_util.c
+++ b/drivers/staging/hv/hv_util.c
@@ -291,6 +291,30 @@ error:
static int util_remove(struct hv_device *dev,
const struct hv_vmbus_device_id *dev_id)
{
+ int service = dev_id->driver_data;
+
+ switch (service) {
+ case HV_SHUTDOWN:
+ kfree(shut_txf_buf);
+ break;
+
+ case HV_TIMESYNC:
+ kfree(time_txf_buf);
+ break;
+
+ case HV_HEARTBEAT:
+ kfree(hbeat_txf_buf);
+ break;
+
+ case HV_KVP:
+ hv_kvp_deinit();
+ break;
+
+ default:
+ pr_err("unknown util service\n");
+ return -ENODEV;
+ }
+
return 0;
}
@@ -370,11 +394,6 @@ static void exit_hyperv_utils(void)
&chn_cb_negotiate;
hv_cb_utils[HV_KVP_MSG].callback = NULL;
- hv_kvp_deinit();
-
- kfree(shut_txf_buf);
- kfree(time_txf_buf);
- kfree(hbeat_txf_buf);
vmbus_driver_unregister(&util_drv);
}
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 10/25] Staging: hv: vmbus: Return proper error code in vmbus_remove()
Return proper error code in vmbus_remove().
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index b9aeb76..95d33a4 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -325,7 +325,7 @@ static int vmbus_probe(struct device *child_device)
*/
static int vmbus_remove(struct device *child_device)
{
- int ret;
+ int ret = 0;
struct hv_driver *drv;
struct hv_device *dev = device_to_hv_device(child_device);
@@ -349,7 +349,7 @@ static int vmbus_remove(struct device *child_device)
}
}
- return 0;
+ return ret;
}
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 12/25] Staging: hv: vmbus: Get rid of hv_cb_utils[] and other unneeded code
Now that the transformation of the util driver is complete,
get rid of hv_cb_utils[] and other unneeded code
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/channel_mgmt.c | 94 -------------------------------------
drivers/staging/hv/hyperv.h | 8 ---
2 files changed, 0 insertions(+), 102 deletions(-)
diff --git a/drivers/staging/hv/channel_mgmt.c
b/drivers/staging/hv/channel_mgmt.c
index 3c67e4c..f20cd84 100644
--- a/drivers/staging/hv/channel_mgmt.c
+++ b/drivers/staging/hv/channel_mgmt.c
@@ -158,100 +158,6 @@ void prep_negotiate_resp(struct icmsg_hdr *icmsghdrp,
}
EXPORT_SYMBOL(prep_negotiate_resp);
-/**
- * chn_cb_negotiate() - Default handler for non IDE/SCSI/NETWORK
- * Hyper-V requests
- * @context: Pointer to argument structure.
- *
- * Set up the default handler for non device driver specific requests
- * from Hyper-V. This stub responds to the default negotiate messages
- * that come in for every non IDE/SCSI/Network request.
- * This behavior is normally overwritten in the hv_utils driver. That
- * driver handles requests like graceful shutdown, heartbeats etc.
- *
- * Mainly used by Hyper-V drivers.
- */
-void chn_cb_negotiate(void *context)
-{
- struct vmbus_channel *channel = context;
- u8 *buf;
- u32 buflen, recvlen;
- u64 requestid;
-
- struct icmsg_hdr *icmsghdrp;
- struct icmsg_negotiate *negop = NULL;
-
- buflen = PAGE_SIZE;
- buf = kmalloc(buflen, GFP_ATOMIC);
-
- vmbus_recvpacket(channel, buf, buflen, &recvlen, &requestid);
-
- if (recvlen > 0) {
- icmsghdrp = (struct icmsg_hdr *)&buf[
- sizeof(struct vmbuspipe_hdr)];
-
- prep_negotiate_resp(icmsghdrp, negop, buf);
-
- icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION
- | ICMSGHDRFLAG_RESPONSE;
-
- vmbus_sendpacket(channel, buf,
- recvlen, requestid,
- VM_PKT_DATA_INBAND, 0);
- }
-
- kfree(buf);
-}
-EXPORT_SYMBOL(chn_cb_negotiate);
-
-/*
- * Function table used for message responses for non IDE/SCSI/Network type
- * messages. (Such as KVP/Shutdown etc)
- */
-struct hyperv_service_callback hv_cb_utils[MAX_MSG_TYPES] = {
- /* 0E0B6031-5213-4934-818B-38D90CED39DB */
- /* Shutdown */
- {
- .msg_type = HV_SHUTDOWN_MSG,
- .data.b = {
- 0x31, 0x60, 0x0B, 0X0E, 0x13, 0x52, 0x34, 0x49,
- 0x81, 0x8B, 0x38, 0XD9, 0x0C, 0xED, 0x39, 0xDB
- },
- .log_msg = "Shutdown channel functionality initialized"
- },
-
- /* {9527E630-D0AE-497b-ADCE-E80AB0175CAF} */
- /* TimeSync */
- {
- .msg_type = HV_TIMESYNC_MSG,
- .data.b = {
- 0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49,
- 0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf
- },
- .log_msg = "Timesync channel functionality initialized"
- },
- /* {57164f39-9115-4e78-ab55-382f3bd5422d} */
- /* Heartbeat */
- {
- .msg_type = HV_HEARTBEAT_MSG,
- .data.b = {
- 0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e,
- 0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d
- },
- .log_msg = "Heartbeat channel functionality initialized"
- },
- /* {A9A0F4E7-5A45-4d96-B827-8A841E8C03E6} */
- /* KVP */
- {
- .data.b = {
- 0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d,
- 0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6
- },
- .log_msg = "KVP channel functionality initialized"
- },
-};
-EXPORT_SYMBOL(hv_cb_utils);
-
/*
* alloc_channel - Allocate and initialize a vmbus channel object
*/
diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h
index cf02ae1..685a132 100644
--- a/drivers/staging/hv/hyperv.h
+++ b/drivers/staging/hv/hyperv.h
@@ -941,12 +941,6 @@ struct ictimesync_data {
u8 flags;
} __packed;
-/* Index for each IC struct in array hv_cb_utils[] */
-#define HV_SHUTDOWN_MSG 0
-#define HV_TIMESYNC_MSG 1
-#define HV_HEARTBEAT_MSG 2
-#define HV_KVP_MSG 3
-
struct hyperv_service_callback {
u8 msg_type;
char *log_msg;
@@ -957,7 +951,5 @@ struct hyperv_service_callback {
extern void prep_negotiate_resp(struct icmsg_hdr *,
struct icmsg_negotiate *, u8 *);
-extern void chn_cb_negotiate(void *);
-extern struct hyperv_service_callback hv_cb_utils[];
#endif /* _HYPERV_H */
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 13/25] Staging: hv: vmbus: Get rid of the module dependency
Hyper-V modules can be built as part of the kernel (not just as modules). Get rid of the module dependency in Kconfig. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/Kconfig | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/Kconfig b/drivers/staging/hv/Kconfig index 26b5064..815f8c2 100644 --- a/drivers/staging/hv/Kconfig +++ b/drivers/staging/hv/Kconfig @@ -1,6 +1,6 @@ config HYPERV tristate "Microsoft Hyper-V client drivers" - depends on X86 && ACPI && PCI && m + depends on X86 && ACPI && PCI default n help Select this option to run Linux as a Hyper-V client operating -- 1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 14/25] Staging: hv: vmbus: Introduce functions for setting and getting driver data
In preparation for getting rid of the ext field in the struct hv_device,
introduce vmbus specific wrapper functions to set/get driver specific data.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/hyperv.h | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h
index 685a132..2879750 100644
--- a/drivers/staging/hv/hyperv.h
+++ b/drivers/staging/hv/hyperv.h
@@ -843,6 +843,15 @@ static inline struct hv_driver *drv_to_hv_drv(struct
device_driver *d)
return container_of(d, struct hv_driver, driver);
}
+static inline void hv_set_drvdata(struct hv_device *dev, void *data)
+{
+ dev_set_drvdata(&dev->device, data);
+}
+
+static inline void *hv_get_drvdata(struct hv_device *dev)
+{
+ return dev_get_drvdata(&dev->device);
+}
/* Vmbus interface */
#define vmbus_driver_register(driver) \
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 15/25] Staging: hv: storvsc: Get rid of storvsc_dev_add() by inlining the code
Get rid of storvsc_dev_add() by inlining the code.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/storvsc_drv.c | 58 +++++++++----------------------------
1 files changed, 14 insertions(+), 44 deletions(-)
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index e5da758..ef93205 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -651,41 +651,6 @@ static int storvsc_connect_to_vsp(struct hv_device *device,
u32 ring_size)
return ret;
}
-static int storvsc_dev_add(struct hv_device *device,
- void *additional_info)
-{
- struct storvsc_device *stor_device;
- struct storvsc_device_info *device_info;
- int ret = 0;
-
- device_info = (struct storvsc_device_info *)additional_info;
- stor_device = alloc_stor_device(device);
- if (!stor_device)
- return -ENOMEM;
-
- /* Save the channel properties to our storvsc channel */
-
- /*
- * If we support more than 1 scsi channel, we need to set the
- * port number here to the scsi channel but how do we get the
- * scsi channel prior to the bus scan.
- *
- * The host does not support this.
- */
-
- stor_device->port_number = device_info->port_number;
- /* Send it back up */
- ret = storvsc_connect_to_vsp(device, device_info->ring_buffer_size);
- if (ret) {
- kfree(stor_device);
- return ret;
- }
- device_info->path_id = stor_device->path_id;
- device_info->target_id = stor_device->target_id;
-
- return ret;
-}
-
static int storvsc_dev_remove(struct hv_device *device)
{
struct storvsc_device *stor_device;
@@ -1389,10 +1354,10 @@ static int storvsc_probe(struct hv_device *device,
int ret;
struct Scsi_Host *host;
struct hv_host_device *host_dev;
- struct storvsc_device_info device_info;
bool dev_is_ide = ((dev_id->driver_data == 1) ? true : false);
int path = 0;
int target = 0;
+ struct storvsc_device *stor_device;
host = scsi_host_alloc(&scsi_driver,
sizeof(struct hv_host_device));
@@ -1417,22 +1382,27 @@ static int storvsc_probe(struct hv_device *device,
return -ENOMEM;
}
- device_info.port_number = host->host_no;
- device_info.ring_buffer_size = storvsc_ringbuffer_size;
- /* Call to the vsc driver to add the device */
- ret = storvsc_dev_add(device, (void *)&device_info);
+ stor_device = alloc_stor_device(device);
+ if (!stor_device) {
+ kmem_cache_destroy(host_dev->request_pool);
+ scsi_host_put(host);
+ return -ENOMEM;
+ }
- if (ret != 0) {
+ stor_device->port_number = host->host_no;
+ ret = storvsc_connect_to_vsp(device, storvsc_ringbuffer_size);
+ if (ret) {
kmem_cache_destroy(host_dev->request_pool);
scsi_host_put(host);
- return -ENODEV;
+ kfree(stor_device);
+ return ret;
}
if (dev_is_ide)
storvsc_get_ide_info(device, &target, &path);
- host_dev->path = device_info.path_id;
- host_dev->target = device_info.target_id;
+ host_dev->path = stor_device->path_id;
+ host_dev->target = stor_device->target_id;
/* max # of devices per target */
host->max_lun = STORVSC_MAX_LUNS_PER_TARGET;
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 16/25] Staging: hv: storvsc: Get rid of alloc_stor_device() by inlining the code
Get rid of alloc_stor_device() by inlining the code.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/storvsc_drv.c | 24 ++++++------------------
1 files changed, 6 insertions(+), 18 deletions(-)
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index ef93205..e7d0f92 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -332,23 +332,6 @@ static inline void storvsc_wait_to_drain(struct
storvsc_device *dev)
dev->drain_notify = false;
}
-static inline struct storvsc_device *alloc_stor_device(struct hv_device
*device)
-{
- struct storvsc_device *stor_device;
-
- stor_device = kzalloc(sizeof(struct storvsc_device), GFP_KERNEL);
- if (!stor_device)
- return NULL;
-
- stor_device->destroy = false;
- init_waitqueue_head(&stor_device->waiting_to_drain);
- stor_device->device = device;
- device->ext = stor_device;
-
- return stor_device;
-}
-
-
static inline struct storvsc_device *get_in_stor_device(
struct hv_device *device)
{
@@ -1382,13 +1365,18 @@ static int storvsc_probe(struct hv_device *device,
return -ENOMEM;
}
- stor_device = alloc_stor_device(device);
+ stor_device = kzalloc(sizeof(struct storvsc_device), GFP_KERNEL);
if (!stor_device) {
kmem_cache_destroy(host_dev->request_pool);
scsi_host_put(host);
return -ENOMEM;
}
+ stor_device->destroy = false;
+ init_waitqueue_head(&stor_device->waiting_to_drain);
+ stor_device->device = device;
+ device->ext = stor_device;
+
stor_device->port_number = host->host_no;
ret = storvsc_connect_to_vsp(device, storvsc_ringbuffer_size);
if (ret) {
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 17/25] Staging: hv: storvsc: Get rid of some unnecessary state and definitions
Now, get rid of some unnecessary state and definitions.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/storvsc_drv.c | 9 ---------
1 files changed, 0 insertions(+), 9 deletions(-)
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index e7d0f92..57c1035 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -245,7 +245,6 @@ enum storvsc_request_type {
struct hv_storvsc_request {
- struct hv_storvsc_request *request;
struct hv_device *device;
/* Synchronize the request/response if needed */
@@ -260,14 +259,6 @@ struct hv_storvsc_request {
};
-struct storvsc_device_info {
- u32 ring_buffer_size;
- unsigned int port_number;
- unsigned char path_id;
- unsigned char target_id;
-};
-
-
/* A storvsc device is a device object that contains a vmbus channel */
struct storvsc_device {
struct hv_device *device;
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 18/25] Staging: hv: storvsc: Eliminate the usage of ext field in struct hv_device
Now, eliminate the usage of ext field in struct hv_device for storvsc driver.
We do this by registering pointer to struct storvsc_device as the driver
specific data and eliminating the current usage of driver specific data to
save and retrieve the pointer to struct Scsi_Host.
Additionally, all access to the driver specific data is through
the vmbus wrapper functions.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/storvsc_drv.c | 24 +++++++++++++++---------
1 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c
index 57c1035..98d47cd 100644
--- a/drivers/staging/hv/storvsc_drv.c
+++ b/drivers/staging/hv/storvsc_drv.c
@@ -266,6 +266,7 @@ struct storvsc_device {
bool destroy;
bool drain_notify;
atomic_t num_outstanding_req;
+ struct Scsi_Host *host;
wait_queue_head_t waiting_to_drain;
@@ -306,7 +307,8 @@ static inline struct storvsc_device *get_out_stor_device(
{
struct storvsc_device *stor_device;
- stor_device = (struct storvsc_device *)device->ext;
+ stor_device + (struct storvsc_device *)hv_get_drvdata(device);
if (stor_device && stor_device->destroy)
stor_device = NULL;
@@ -328,7 +330,8 @@ static inline struct storvsc_device *get_in_stor_device(
{
struct storvsc_device *stor_device;
- stor_device = (struct storvsc_device *)device->ext;
+ stor_device + (struct storvsc_device *)hv_get_drvdata(device);
if (!stor_device)
goto get_in_err;
@@ -480,7 +483,8 @@ static void storvsc_on_io_completion(struct hv_device
*device,
struct storvsc_device *stor_device;
struct vstor_packet *stor_pkt;
- stor_device = (struct storvsc_device *)device->ext;
+ stor_device + (struct storvsc_device *)hv_get_drvdata(device);
stor_pkt = &request->vstor_packet;
@@ -630,7 +634,8 @@ static int storvsc_dev_remove(struct hv_device *device)
struct storvsc_device *stor_device;
unsigned long flags;
- stor_device = (struct storvsc_device *)device->ext;
+ stor_device + (struct storvsc_device *)hv_get_drvdata(device);
spin_lock_irqsave(&device->channel->inbound_lock, flags);
stor_device->destroy = true;
@@ -652,7 +657,7 @@ static int storvsc_dev_remove(struct hv_device *device)
* allow incoming packets.
*/
spin_lock_irqsave(&device->channel->inbound_lock, flags);
- device->ext = NULL;
+ hv_set_drvdata(device, NULL);
spin_unlock_irqrestore(&device->channel->inbound_lock, flags);
/* Close the channel */
@@ -963,7 +968,9 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist
*orig_sgl,
static int storvsc_remove(struct hv_device *dev,
const struct hv_vmbus_device_id *dev_id)
{
- struct Scsi_Host *host = dev_get_drvdata(&dev->device);
+ struct storvsc_device *stor_device + (struct storvsc_device
*)hv_get_drvdata(dev);
+ struct Scsi_Host *host = stor_device->host;
struct hv_host_device *host_dev (struct hv_host_device
*)host->hostdata;
@@ -1338,8 +1345,6 @@ static int storvsc_probe(struct hv_device *device,
if (!host)
return -ENOMEM;
- dev_set_drvdata(&device->device, host);
-
host_dev = (struct hv_host_device *)host->hostdata;
memset(host_dev, 0, sizeof(struct hv_host_device));
@@ -1366,7 +1371,8 @@ static int storvsc_probe(struct hv_device *device,
stor_device->destroy = false;
init_waitqueue_head(&stor_device->waiting_to_drain);
stor_device->device = device;
- device->ext = stor_device;
+ stor_device->host = host;
+ hv_set_drvdata(device, stor_device);
stor_device->port_number = host->host_no;
ret = storvsc_connect_to_vsp(device, storvsc_ringbuffer_size);
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 19/25] Staging: hv: netvsc: Get rid of the usage of the ext field in struct hv_device
Now, eliminate the usage of ext field in struct hv_device for netvsc driver.
We do this by registering pointer to struct netvsc_device as the driver
specific data and eliminating the current usage of driver specific data
to save and retrieve the pointer to struct net_device.
Additionally, all access to the driver specific data is through
the vmbus wrapper functions. As part of this cleanup, we also get rid
of some unnecessary debug print statements.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/hyperv_net.h | 2 +
drivers/staging/hv/netvsc.c | 90 +++++++++++++++++++-----------------
drivers/staging/hv/netvsc_drv.c | 29 ++++++++++--
drivers/staging/hv/rndis_filter.c | 36 +++++++++++----
4 files changed, 100 insertions(+), 57 deletions(-)
diff --git a/drivers/staging/hv/hyperv_net.h b/drivers/staging/hv/hyperv_net.h
index af8a37f..366dd2b 100644
--- a/drivers/staging/hv/hyperv_net.h
+++ b/drivers/staging/hv/hyperv_net.h
@@ -392,6 +392,8 @@ struct netvsc_device {
struct nvsp_message revoke_packet;
/* unsigned char HwMacAddr[HW_MACADDR_LEN]; */
+ struct net_device *ndev;
+
/* Holds rndis device info */
void *extension;
};
diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c
index 115629f..b046873 100644
--- a/drivers/staging/hv/netvsc.c
+++ b/drivers/staging/hv/netvsc.c
@@ -35,6 +35,8 @@
static struct netvsc_device *alloc_net_device(struct hv_device *device)
{
struct netvsc_device *net_device;
+ struct net_device *ndev + (struct net_device *)hv_get_drvdata(device);
net_device = kzalloc(sizeof(struct netvsc_device), GFP_KERNEL);
if (!net_device)
@@ -43,8 +45,9 @@ static struct netvsc_device *alloc_net_device(struct hv_device
*device)
net_device->destroy = false;
net_device->dev = device;
- device->ext = net_device;
+ net_device->ndev = ndev;
+ hv_set_drvdata(device, net_device);
return net_device;
}
@@ -52,7 +55,8 @@ static struct netvsc_device *get_outbound_net_device(struct
hv_device *device)
{
struct netvsc_device *net_device;
- net_device = device->ext;
+ net_device + (struct netvsc_device *)hv_get_drvdata(device);
if (net_device && net_device->destroy)
net_device = NULL;
@@ -63,7 +67,8 @@ static struct netvsc_device *get_inbound_net_device(struct
hv_device *device)
{
struct netvsc_device *net_device;
- net_device = device->ext;
+ net_device + (struct netvsc_device *)hv_get_drvdata(device);
if (!net_device)
goto get_in_err;
@@ -81,7 +86,7 @@ static int netvsc_destroy_recv_buf(struct netvsc_device
*net_device)
{
struct nvsp_message *revoke_packet;
int ret = 0;
- struct net_device *ndev = dev_get_drvdata(&net_device->dev->device);
+ struct net_device *ndev = net_device->ndev;
/*
* If we got a section count, it means we received a
@@ -153,14 +158,12 @@ static int netvsc_init_recv_buf(struct hv_device *device)
int t;
struct netvsc_device *net_device;
struct nvsp_message *init_packet;
- struct net_device *ndev = dev_get_drvdata(&device->device);
+ struct net_device *ndev;
net_device = get_outbound_net_device(device);
- if (!net_device) {
- netdev_err(ndev, "unable to get net device..."
- "device being destroyed?\n");
+ if (!net_device)
return -ENODEV;
- }
+ ndev = net_device->ndev;
net_device->recv_buf (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
@@ -269,14 +272,12 @@ static int netvsc_connect_vsp(struct hv_device *device)
struct netvsc_device *net_device;
struct nvsp_message *init_packet;
int ndis_version;
- struct net_device *ndev = dev_get_drvdata(&device->device);
+ struct net_device *ndev;
net_device = get_outbound_net_device(device);
- if (!net_device) {
- netdev_err(ndev, "unable to get net device..."
- "device being destroyed?\n");
+ if (!net_device)
return -ENODEV;
- }
+ ndev = net_device->ndev;
init_packet = &net_device->channel_init_pkt;
@@ -357,7 +358,7 @@ int netvsc_device_remove(struct hv_device *device)
struct hv_netvsc_packet *netvsc_packet, *pos;
unsigned long flags;
- net_device = (struct netvsc_device *)device->ext;
+ net_device = (struct netvsc_device *)hv_get_drvdata(device);
spin_lock_irqsave(&device->channel->inbound_lock, flags);
net_device->destroy = true;
spin_unlock_irqrestore(&device->channel->inbound_lock, flags);
@@ -381,7 +382,7 @@ int netvsc_device_remove(struct hv_device *device)
*/
spin_lock_irqsave(&device->channel->inbound_lock, flags);
- device->ext = NULL;
+ hv_set_drvdata(device, NULL);
spin_unlock_irqrestore(&device->channel->inbound_lock, flags);
/* At this point, no one should be accessing netDevice except in here */
@@ -407,14 +408,12 @@ static void netvsc_send_completion(struct hv_device
*device,
struct netvsc_device *net_device;
struct nvsp_message *nvsp_packet;
struct hv_netvsc_packet *nvsc_packet;
- struct net_device *ndev = dev_get_drvdata(&device->device);
+ struct net_device *ndev;
net_device = get_inbound_net_device(device);
- if (!net_device) {
- netdev_err(ndev, "unable to get net device..."
- "device being destroyed?\n");
+ if (!net_device)
return;
- }
+ ndev = net_device->ndev;
nvsp_packet = (struct nvsp_message *)((unsigned long)packet +
(packet->offset8 << 3));
@@ -452,14 +451,12 @@ int netvsc_send(struct hv_device *device,
struct netvsc_device *net_device;
int ret = 0;
struct nvsp_message sendMessage;
- struct net_device *ndev = dev_get_drvdata(&device->device);
+ struct net_device *ndev;
net_device = get_outbound_net_device(device);
- if (!net_device) {
- netdev_err(ndev, "net device (%p) shutting down..."
- "ignoring outbound packets\n", net_device);
+ if (!net_device)
return -ENODEV;
- }
+ ndev = net_device->ndev;
sendMessage.hdr.msg_type = NVSP_MSG1_TYPE_SEND_RNDIS_PKT;
if (packet->is_data_pkt) {
@@ -506,7 +503,11 @@ static void netvsc_send_recv_completion(struct hv_device
*device,
struct nvsp_message recvcompMessage;
int retries = 0;
int ret;
- struct net_device *ndev = dev_get_drvdata(&device->device);
+ struct net_device *ndev;
+ struct netvsc_device *net_device + (struct netvsc_device
*)hv_get_drvdata(device);
+
+ ndev = net_device->ndev;
recvcompMessage.hdr.msg_type NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE;
@@ -552,7 +553,7 @@ static void netvsc_receive_completion(void *context)
u64 transaction_id = 0;
bool fsend_receive_comp = false;
unsigned long flags;
- struct net_device *ndev = dev_get_drvdata(&device->device);
+ struct net_device *ndev;
/*
* Even though it seems logical to do a GetOutboundNetDevice() here to
@@ -560,11 +561,9 @@ static void netvsc_receive_completion(void *context)
* since we may have disable outbound traffic already.
*/
net_device = get_inbound_net_device(device);
- if (!net_device) {
- netdev_err(ndev, "unable to get net device..."
- "device being destroyed?\n");
+ if (!net_device)
return;
- }
+ ndev = net_device->ndev;
/* Overloading use of the lock. */
spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);
@@ -607,16 +606,14 @@ static void netvsc_receive(struct hv_device *device,
int i, j;
int count = 0, bytes_remain = 0;
unsigned long flags;
- struct net_device *ndev = dev_get_drvdata(&device->device);
+ struct net_device *ndev;
LIST_HEAD(listHead);
net_device = get_inbound_net_device(device);
- if (!net_device) {
- netdev_err(ndev, "unable to get net device..."
- "device being destroyed?\n");
+ if (!net_device)
return;
- }
+ ndev = net_device->ndev;
/*
* All inbound packets other than send completion should be xfer page
@@ -784,7 +781,7 @@ static void netvsc_channel_cb(void *context)
struct vmpacket_descriptor *desc;
unsigned char *buffer;
int bufferlen = NETVSC_PACKET_SIZE;
- struct net_device *ndev = dev_get_drvdata(&device->device);
+ struct net_device *ndev;
packet = kzalloc(NETVSC_PACKET_SIZE * sizeof(unsigned char),
GFP_ATOMIC);
@@ -793,11 +790,9 @@ static void netvsc_channel_cb(void *context)
buffer = packet;
net_device = get_inbound_net_device(device);
- if (!net_device) {
- netdev_err(ndev, "net device (%p) shutting down..."
- "ignoring inbound packets\n", net_device);
+ if (!net_device)
goto out;
- }
+ ndev = net_device->ndev;
do {
ret = vmbus_recvpacket_raw(device->channel, buffer, bufferlen,
@@ -871,7 +866,7 @@ int netvsc_device_add(struct hv_device *device, void
*additional_info)
((struct netvsc_device_info *)additional_info)->ring_size;
struct netvsc_device *net_device;
struct hv_netvsc_packet *packet, *pos;
- struct net_device *ndev = dev_get_drvdata(&device->device);
+ struct net_device *ndev;
net_device = alloc_net_device(device);
if (!net_device) {
@@ -879,6 +874,15 @@ int netvsc_device_add(struct hv_device *device, void
*additional_info)
goto cleanup;
}
+ /*
+ * Coming into this function, struct net_device * is
+ * registered as the driver private data.
+ * In alloc_net_device(), we register struct netvsc_device *
+ * as the driver private data and stash away struct net_device *
+ * in struct netvsc_device *.
+ */
+ ndev = net_device->ndev;
+
/* Initialize the NetVSC channel extension */
net_device->recv_buf_size = NETVSC_RECEIVE_BUFFER_SIZE;
spin_lock_init(&net_device->recv_pkt_list_lock);
diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c
index d0189a3..917bae5 100644
--- a/drivers/staging/hv/netvsc_drv.c
+++ b/drivers/staging/hv/netvsc_drv.c
@@ -203,8 +203,13 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct
net_device *net)
void netvsc_linkstatus_callback(struct hv_device *device_obj,
unsigned int status)
{
- struct net_device *net = dev_get_drvdata(&device_obj->device);
+ struct net_device *net;
struct net_device_context *ndev_ctx;
+ struct netvsc_device *net_device;
+
+ net_device + (struct netvsc_device *)hv_get_drvdata(device_obj);
+ net = net_device->ndev;
if (!net) {
netdev_err(net, "got link status but net device "
@@ -236,6 +241,11 @@ int netvsc_recv_callback(struct hv_device *device_obj,
void *data;
int i;
unsigned long flags;
+ struct netvsc_device *net_device;
+
+ net_device + (struct netvsc_device *)hv_get_drvdata(device_obj);
+ net = net_device->ndev;
if (!net) {
netdev_err(net, "got receive callback but net device"
@@ -322,9 +332,13 @@ static void netvsc_send_garp(struct work_struct *w)
{
struct net_device_context *ndev_ctx;
struct net_device *net;
+ struct netvsc_device *net_device;
ndev_ctx = container_of(w, struct net_device_context, dwork.work);
- net = dev_get_drvdata(&ndev_ctx->device_ctx->device);
+ net_device + (struct netvsc_device *)
+ hv_get_drvdata(ndev_ctx->device_ctx);
+ net = net_device->ndev;
netif_notify_peers(net);
}
@@ -347,7 +361,7 @@ static int netvsc_probe(struct hv_device *dev,
net_device_ctx = netdev_priv(net);
net_device_ctx->device_ctx = dev;
atomic_set(&net_device_ctx->avail, ring_size);
- dev_set_drvdata(&dev->device, net);
+ hv_set_drvdata(dev, net);
INIT_DELAYED_WORK(&net_device_ctx->dwork, netvsc_send_garp);
net->netdev_ops = &device_ops;
@@ -373,7 +387,7 @@ static int netvsc_probe(struct hv_device *dev,
netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
unregister_netdev(net);
free_netdev(net);
- dev_set_drvdata(&dev->device, NULL);
+ hv_set_drvdata(dev, NULL);
return ret;
}
memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN);
@@ -387,8 +401,13 @@ out:
static int netvsc_remove(struct hv_device *dev,
const struct hv_vmbus_device_id *dev_id)
{
- struct net_device *net = dev_get_drvdata(&dev->device);
+ struct net_device *net;
struct net_device_context *ndev_ctx;
+ struct netvsc_device *net_device;
+
+ net_device + (struct netvsc_device *)hv_get_drvdata(dev);
+ net = net_device->ndev;
if (net == NULL) {
dev_err(&dev->device, "No net device to remove\n");
diff --git a/drivers/staging/hv/rndis_filter.c
b/drivers/staging/hv/rndis_filter.c
index b325345..79948be 100644
--- a/drivers/staging/hv/rndis_filter.c
+++ b/drivers/staging/hv/rndis_filter.c
@@ -141,7 +141,12 @@ static void put_rndis_request(struct rndis_device *dev,
static void dump_rndis_message(struct hv_device *hv_dev,
struct rndis_message *rndis_msg)
{
- struct net_device *netdev = dev_get_drvdata(&hv_dev->device);
+ struct net_device *netdev;
+ struct netvsc_device *net_device;
+
+ net_device + (struct netvsc_device *)hv_get_drvdata(hv_dev);
+ netdev = net_device->ndev;
switch (rndis_msg->ndis_msg_type) {
case REMOTE_NDIS_PACKET_MSG:
@@ -249,7 +254,9 @@ static void rndis_filter_receive_response(struct
rndis_device *dev,
struct rndis_request *request = NULL;
bool found = false;
unsigned long flags;
- struct net_device *ndev =
dev_get_drvdata(&dev->net_dev->dev->device);
+ struct net_device *ndev;
+
+ ndev = dev->net_dev->ndev;
spin_lock_irqsave(&dev->request_lock, flags);
list_for_each_entry(request, &dev->req_list, list_ent) {
@@ -356,11 +363,17 @@ static void rndis_filter_receive_data(struct rndis_device
*dev,
int rndis_filter_receive(struct hv_device *dev,
struct hv_netvsc_packet *pkt)
{
- struct netvsc_device *net_dev = dev->ext;
+ struct netvsc_device *net_dev + (struct netvsc_device *)hv_get_drvdata(dev);
struct rndis_device *rndis_dev;
struct rndis_message rndis_msg;
struct rndis_message *rndis_hdr;
- struct net_device *ndev = dev_get_drvdata(&dev->device);
+ struct net_device *ndev;
+ struct netvsc_device *net_device;
+
+ net_device + (struct netvsc_device *)hv_get_drvdata(dev);
+ ndev = net_device->ndev;
if (!net_dev)
return -EINVAL;
@@ -517,7 +530,9 @@ static int rndis_filter_set_packet_filter(struct
rndis_device *dev,
struct rndis_set_complete *set_complete;
u32 status;
int ret, t;
- struct net_device *ndev =
dev_get_drvdata(&dev->net_dev->dev->device);
+ struct net_device *ndev;
+
+ ndev = dev->net_dev->ndev;
request = get_rndis_request(dev, REMOTE_NDIS_SET_MSG,
RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
@@ -700,7 +715,7 @@ int rndis_filter_device_add(struct hv_device *dev,
/* Initialize the rndis device */
- netDevice = dev->ext;
+ netDevice = (struct netvsc_device *)hv_get_drvdata(dev);
netDevice->extension = rndisDevice;
rndisDevice->net_dev = netDevice;
@@ -737,7 +752,8 @@ int rndis_filter_device_add(struct hv_device *dev,
void rndis_filter_device_remove(struct hv_device *dev)
{
- struct netvsc_device *net_dev = dev->ext;
+ struct netvsc_device *net_dev + (struct netvsc_device *)hv_get_drvdata(dev);
struct rndis_device *rndis_dev = net_dev->extension;
/* Halt and release the rndis device */
@@ -752,7 +768,8 @@ void rndis_filter_device_remove(struct hv_device *dev)
int rndis_filter_open(struct hv_device *dev)
{
- struct netvsc_device *netDevice = dev->ext;
+ struct netvsc_device *netDevice + (struct netvsc_device
*)hv_get_drvdata(dev);
if (!netDevice)
return -EINVAL;
@@ -762,7 +779,8 @@ int rndis_filter_open(struct hv_device *dev)
int rndis_filter_close(struct hv_device *dev)
{
- struct netvsc_device *netDevice = dev->ext;
+ struct netvsc_device *netDevice + (struct netvsc_device
*)hv_get_drvdata(dev);
if (!netDevice)
return -EINVAL;
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 20/25] Staging: hv: mousevsc: Get rid of the usage of the ext field in struct hv_device
Get rid of the usage of the ext field in struct hv_device for the mouse driver.
We do this by using the newly introduced functions to set and and get driver
specific data.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/hv_mouse.c | 18 +++++++++---------
1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c
index d60f287..c6c4024 100644
--- a/drivers/staging/hv/hv_mouse.c
+++ b/drivers/staging/hv/hv_mouse.c
@@ -196,7 +196,7 @@ static struct mousevsc_dev *alloc_input_device(struct
hv_device *device)
atomic_cmpxchg(&input_dev->ref_count, 0, 2);
input_dev->device = device;
- device->ext = input_dev;
+ hv_set_drvdata(device, input_dev);
return input_dev;
}
@@ -214,7 +214,7 @@ static struct mousevsc_dev *get_input_device(struct
hv_device *device)
{
struct mousevsc_dev *input_dev;
- input_dev = (struct mousevsc_dev *)device->ext;
+ input_dev = (struct mousevsc_dev *)hv_get_drvdata(device);
/*
* FIXME
@@ -240,7 +240,7 @@ static struct mousevsc_dev *must_get_input_device(struct
hv_device *device)
{
struct mousevsc_dev *input_dev;
- input_dev = (struct mousevsc_dev *)device->ext;
+ input_dev = (struct mousevsc_dev *)hv_get_drvdata(device);
if (input_dev && atomic_read(&input_dev->ref_count))
atomic_inc(&input_dev->ref_count);
@@ -254,7 +254,7 @@ static void put_input_device(struct hv_device *device)
{
struct mousevsc_dev *input_dev;
- input_dev = (struct mousevsc_dev *)device->ext;
+ input_dev = (struct mousevsc_dev *)hv_get_drvdata(device);
atomic_dec(&input_dev->ref_count);
}
@@ -266,7 +266,7 @@ static struct mousevsc_dev *release_input_device(struct
hv_device *device)
{
struct mousevsc_dev *input_dev;
- input_dev = (struct mousevsc_dev *)device->ext;
+ input_dev = (struct mousevsc_dev *)hv_get_drvdata(device);
/* Busy wait until the ref drop to 2, then set it to 1 */
while (atomic_cmpxchg(&input_dev->ref_count, 2, 1) != 2)
@@ -282,13 +282,13 @@ static struct mousevsc_dev
*final_release_input_device(struct hv_device *device)
{
struct mousevsc_dev *input_dev;
- input_dev = (struct mousevsc_dev *)device->ext;
+ input_dev = (struct mousevsc_dev *)hv_get_drvdata(device);
/* Busy wait until the ref drop to 1, then set it to 0 */
while (atomic_cmpxchg(&input_dev->ref_count, 1, 0) != 1)
udelay(100);
- device->ext = NULL;
+ hv_set_drvdata(device, NULL);
return input_dev;
}
@@ -790,7 +790,7 @@ static int mousevsc_on_device_remove(struct hv_device
*device)
int ret = 0;
pr_info("disabling input device (%p)...",
- device->ext);
+ hv_get_drvdata(device));
input_dev = release_input_device(device);
@@ -808,7 +808,7 @@ static int mousevsc_on_device_remove(struct hv_device
*device)
udelay(100);
}
- pr_info("removing input device (%p)...", device->ext);
+ pr_info("removing input device (%p)...", hv_get_drvdata(device));
input_dev = final_release_input_device(device);
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 21/25] Staging: hv: vmbus: Get rid of the ext field in struct hv_device
Now that we have eliminated all uses of the ext field in struct hv_device,
get rid of the ext field.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/hyperv.h | 3 ---
1 files changed, 0 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h
index 2879750..7ba274f 100644
--- a/drivers/staging/hv/hyperv.h
+++ b/drivers/staging/hv/hyperv.h
@@ -827,9 +827,6 @@ struct hv_device {
struct device device;
struct vmbus_channel *channel;
-
- /* Device extension; */
- void *ext;
};
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 22/25] Staging: hv: vmbus: Do not allocate struct hv_device_info on the stack
struct hv_device_info is about 101 bytes in size. Do not allocate this structure
on the stack.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/vmbus_drv.c | 134 ++++++++++++++++++++-------------------
1 files changed, 69 insertions(+), 65 deletions(-)
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c
index 95d33a4..e39c92d 100644
--- a/drivers/staging/hv/vmbus_drv.c
+++ b/drivers/staging/hv/vmbus_drv.c
@@ -112,101 +112,105 @@ static ssize_t vmbus_show_device_attr(struct device
*dev,
char *buf)
{
struct hv_device *hv_dev = device_to_hv_device(dev);
- struct hv_device_info device_info;
+ struct hv_device_info *device_info;
char alias_name[VMBUS_ALIAS_LEN + 1];
+ int ret = 0;
- memset(&device_info, 0, sizeof(struct hv_device_info));
+ device_info = kzalloc(sizeof(struct hv_device_info), GFP_KERNEL);
+ if (!device_info)
+ return ret;
- get_channel_info(hv_dev, &device_info);
+ get_channel_info(hv_dev, device_info);
if (!strcmp(dev_attr->attr.name, "class_id")) {
- return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-"
+ ret = sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-"
"%02x%02x%02x%02x%02x%02x%02x%02x}\n",
- device_info.chn_type.b[3],
- device_info.chn_type.b[2],
- device_info.chn_type.b[1],
- device_info.chn_type.b[0],
- device_info.chn_type.b[5],
- device_info.chn_type.b[4],
- device_info.chn_type.b[7],
- device_info.chn_type.b[6],
- device_info.chn_type.b[8],
- device_info.chn_type.b[9],
- device_info.chn_type.b[10],
- device_info.chn_type.b[11],
- device_info.chn_type.b[12],
- device_info.chn_type.b[13],
- device_info.chn_type.b[14],
- device_info.chn_type.b[15]);
+ device_info->chn_type.b[3],
+ device_info->chn_type.b[2],
+ device_info->chn_type.b[1],
+ device_info->chn_type.b[0],
+ device_info->chn_type.b[5],
+ device_info->chn_type.b[4],
+ device_info->chn_type.b[7],
+ device_info->chn_type.b[6],
+ device_info->chn_type.b[8],
+ device_info->chn_type.b[9],
+ device_info->chn_type.b[10],
+ device_info->chn_type.b[11],
+ device_info->chn_type.b[12],
+ device_info->chn_type.b[13],
+ device_info->chn_type.b[14],
+ device_info->chn_type.b[15]);
} else if (!strcmp(dev_attr->attr.name, "device_id")) {
- return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-"
+ ret = sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-"
"%02x%02x%02x%02x%02x%02x%02x%02x}\n",
- device_info.chn_instance.b[3],
- device_info.chn_instance.b[2],
- device_info.chn_instance.b[1],
- device_info.chn_instance.b[0],
- device_info.chn_instance.b[5],
- device_info.chn_instance.b[4],
- device_info.chn_instance.b[7],
- device_info.chn_instance.b[6],
- device_info.chn_instance.b[8],
- device_info.chn_instance.b[9],
- device_info.chn_instance.b[10],
- device_info.chn_instance.b[11],
- device_info.chn_instance.b[12],
- device_info.chn_instance.b[13],
- device_info.chn_instance.b[14],
- device_info.chn_instance.b[15]);
+ device_info->chn_instance.b[3],
+ device_info->chn_instance.b[2],
+ device_info->chn_instance.b[1],
+ device_info->chn_instance.b[0],
+ device_info->chn_instance.b[5],
+ device_info->chn_instance.b[4],
+ device_info->chn_instance.b[7],
+ device_info->chn_instance.b[6],
+ device_info->chn_instance.b[8],
+ device_info->chn_instance.b[9],
+ device_info->chn_instance.b[10],
+ device_info->chn_instance.b[11],
+ device_info->chn_instance.b[12],
+ device_info->chn_instance.b[13],
+ device_info->chn_instance.b[14],
+ device_info->chn_instance.b[15]);
} else if (!strcmp(dev_attr->attr.name, "modalias")) {
print_alias_name(hv_dev, alias_name);
- return sprintf(buf, "vmbus:%s\n", alias_name);
+ ret = sprintf(buf, "vmbus:%s\n", alias_name);
} else if (!strcmp(dev_attr->attr.name, "state")) {
- return sprintf(buf, "%d\n", device_info.chn_state);
+ ret = sprintf(buf, "%d\n", device_info->chn_state);
} else if (!strcmp(dev_attr->attr.name, "id")) {
- return sprintf(buf, "%d\n", device_info.chn_id);
+ ret = sprintf(buf, "%d\n", device_info->chn_id);
} else if (!strcmp(dev_attr->attr.name, "out_intr_mask")) {
- return sprintf(buf, "%d\n", device_info.outbound.int_mask);
+ ret = sprintf(buf, "%d\n", device_info->outbound.int_mask);
} else if (!strcmp(dev_attr->attr.name, "out_read_index")) {
- return sprintf(buf, "%d\n", device_info.outbound.read_idx);
+ ret = sprintf(buf, "%d\n", device_info->outbound.read_idx);
} else if (!strcmp(dev_attr->attr.name, "out_write_index")) {
- return sprintf(buf, "%d\n", device_info.outbound.write_idx);
+ ret = sprintf(buf, "%d\n", device_info->outbound.write_idx);
} else if (!strcmp(dev_attr->attr.name, "out_read_bytes_avail"))
{
- return sprintf(buf, "%d\n",
- device_info.outbound.bytes_avail_toread);
+ ret = sprintf(buf, "%d\n",
+ device_info->outbound.bytes_avail_toread);
} else if (!strcmp(dev_attr->attr.name, "out_write_bytes_avail"))
{
- return sprintf(buf, "%d\n",
- device_info.outbound.bytes_avail_towrite);
+ ret = sprintf(buf, "%d\n",
+ device_info->outbound.bytes_avail_towrite);
} else if (!strcmp(dev_attr->attr.name, "in_intr_mask")) {
- return sprintf(buf, "%d\n", device_info.inbound.int_mask);
+ ret = sprintf(buf, "%d\n", device_info->inbound.int_mask);
} else if (!strcmp(dev_attr->attr.name, "in_read_index")) {
- return sprintf(buf, "%d\n", device_info.inbound.read_idx);
+ ret = sprintf(buf, "%d\n", device_info->inbound.read_idx);
} else if (!strcmp(dev_attr->attr.name, "in_write_index")) {
- return sprintf(buf, "%d\n", device_info.inbound.write_idx);
+ ret = sprintf(buf, "%d\n", device_info->inbound.write_idx);
} else if (!strcmp(dev_attr->attr.name, "in_read_bytes_avail")) {
- return sprintf(buf, "%d\n",
- device_info.inbound.bytes_avail_toread);
+ ret = sprintf(buf, "%d\n",
+ device_info->inbound.bytes_avail_toread);
} else if (!strcmp(dev_attr->attr.name, "in_write_bytes_avail"))
{
- return sprintf(buf, "%d\n",
- device_info.inbound.bytes_avail_towrite);
+ ret = sprintf(buf, "%d\n",
+ device_info->inbound.bytes_avail_towrite);
} else if (!strcmp(dev_attr->attr.name, "monitor_id")) {
- return sprintf(buf, "%d\n", device_info.monitor_id);
+ ret = sprintf(buf, "%d\n", device_info->monitor_id);
} else if (!strcmp(dev_attr->attr.name,
"server_monitor_pending")) {
- return sprintf(buf, "%d\n", device_info.server_monitor_pending);
+ ret = sprintf(buf, "%d\n", device_info->server_monitor_pending);
} else if (!strcmp(dev_attr->attr.name,
"server_monitor_latency")) {
- return sprintf(buf, "%d\n", device_info.server_monitor_latency);
+ ret = sprintf(buf, "%d\n", device_info->server_monitor_latency);
} else if (!strcmp(dev_attr->attr.name,
"server_monitor_conn_id")) {
- return sprintf(buf, "%d\n",
- device_info.server_monitor_conn_id);
+ ret = sprintf(buf, "%d\n",
+ device_info->server_monitor_conn_id);
} else if (!strcmp(dev_attr->attr.name,
"client_monitor_pending")) {
- return sprintf(buf, "%d\n", device_info.client_monitor_pending);
+ ret = sprintf(buf, "%d\n", device_info->client_monitor_pending);
} else if (!strcmp(dev_attr->attr.name,
"client_monitor_latency")) {
- return sprintf(buf, "%d\n", device_info.client_monitor_latency);
+ ret = sprintf(buf, "%d\n", device_info->client_monitor_latency);
} else if (!strcmp(dev_attr->attr.name,
"client_monitor_conn_id")) {
- return sprintf(buf, "%d\n",
- device_info.client_monitor_conn_id);
- } else {
- return 0;
+ ret = sprintf(buf, "%d\n",
+ device_info->client_monitor_conn_id);
}
+
+ kfree(device_info);
+ return ret;
}
/* Set up per device attributes in /sys/bus/vmbus/devices/<bus device> */
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 23/25] Staging: hv: netvsc: Rename netDevice as net_device
Rename netDevice as net_device.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/netvsc.c | 5 ++++-
drivers/staging/hv/rndis_filter.c | 20 ++++++++++----------
2 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c
index b046873..4564f13 100644
--- a/drivers/staging/hv/netvsc.c
+++ b/drivers/staging/hv/netvsc.c
@@ -385,7 +385,10 @@ int netvsc_device_remove(struct hv_device *device)
hv_set_drvdata(device, NULL);
spin_unlock_irqrestore(&device->channel->inbound_lock, flags);
- /* At this point, no one should be accessing netDevice except in here */
+ /*
+ * At this point, no one should be accessing net_device
+ * except in here
+ */
dev_notice(&device->device, "net device safe to remove\n");
/* Now, we can close the channel safely */
diff --git a/drivers/staging/hv/rndis_filter.c
b/drivers/staging/hv/rndis_filter.c
index 79948be..fb46a88 100644
--- a/drivers/staging/hv/rndis_filter.c
+++ b/drivers/staging/hv/rndis_filter.c
@@ -694,7 +694,7 @@ int rndis_filter_device_add(struct hv_device *dev,
void *additional_info)
{
int ret;
- struct netvsc_device *netDevice;
+ struct netvsc_device *net_device;
struct rndis_device *rndisDevice;
struct netvsc_device_info *deviceInfo = additional_info;
@@ -715,10 +715,10 @@ int rndis_filter_device_add(struct hv_device *dev,
/* Initialize the rndis device */
- netDevice = (struct netvsc_device *)hv_get_drvdata(dev);
+ net_device = (struct netvsc_device *)hv_get_drvdata(dev);
- netDevice->extension = rndisDevice;
- rndisDevice->net_dev = netDevice;
+ net_device->extension = rndisDevice;
+ rndisDevice->net_dev = net_device;
/* Send the rndis initialization message */
ret = rndis_filter_init_device(rndisDevice);
@@ -768,24 +768,24 @@ void rndis_filter_device_remove(struct hv_device *dev)
int rndis_filter_open(struct hv_device *dev)
{
- struct netvsc_device *netDevice + struct netvsc_device *net_device (struct
netvsc_device *)hv_get_drvdata(dev);
- if (!netDevice)
+ if (!net_device)
return -EINVAL;
- return rndis_filter_open_device(netDevice->extension);
+ return rndis_filter_open_device(net_device->extension);
}
int rndis_filter_close(struct hv_device *dev)
{
- struct netvsc_device *netDevice + struct netvsc_device *net_device (struct
netvsc_device *)hv_get_drvdata(dev);
- if (!netDevice)
+ if (!net_device)
return -EINVAL;
- return rndis_filter_close_device(netDevice->extension);
+ return rndis_filter_close_device(net_device->extension);
}
int rndis_filter_send(struct hv_device *dev,
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 24/25] Staging: hv: netvsc: Rename rndisDevice to rndis_device
Rename rndisDevice to rndis_device.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/rndis_filter.c | 24 ++++++++++++------------
1 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/staging/hv/rndis_filter.c
b/drivers/staging/hv/rndis_filter.c
index fb46a88..cb9d4f6 100644
--- a/drivers/staging/hv/rndis_filter.c
+++ b/drivers/staging/hv/rndis_filter.c
@@ -695,11 +695,11 @@ int rndis_filter_device_add(struct hv_device *dev,
{
int ret;
struct netvsc_device *net_device;
- struct rndis_device *rndisDevice;
+ struct rndis_device *rndis_device;
struct netvsc_device_info *deviceInfo = additional_info;
- rndisDevice = get_rndis_device();
- if (!rndisDevice)
+ rndis_device = get_rndis_device();
+ if (!rndis_device)
return -ENODEV;
/*
@@ -709,7 +709,7 @@ int rndis_filter_device_add(struct hv_device *dev,
*/
ret = netvsc_device_add(dev, additional_info);
if (ret != 0) {
- kfree(rndisDevice);
+ kfree(rndis_device);
return ret;
}
@@ -717,11 +717,11 @@ int rndis_filter_device_add(struct hv_device *dev,
/* Initialize the rndis device */
net_device = (struct netvsc_device *)hv_get_drvdata(dev);
- net_device->extension = rndisDevice;
- rndisDevice->net_dev = net_device;
+ net_device->extension = rndis_device;
+ rndis_device->net_dev = net_device;
/* Send the rndis initialization message */
- ret = rndis_filter_init_device(rndisDevice);
+ ret = rndis_filter_init_device(rndis_device);
if (ret != 0) {
/*
* TODO: If rndis init failed, we will need to shut down the
@@ -730,21 +730,21 @@ int rndis_filter_device_add(struct hv_device *dev,
}
/* Get the mac address */
- ret = rndis_filter_query_device_mac(rndisDevice);
+ ret = rndis_filter_query_device_mac(rndis_device);
if (ret != 0) {
/*
* TODO: shutdown rndis device and the channel
*/
}
- memcpy(deviceInfo->mac_adr, rndisDevice->hw_mac_adr, ETH_ALEN);
+ memcpy(deviceInfo->mac_adr, rndis_device->hw_mac_adr, ETH_ALEN);
- rndis_filter_query_device_link_status(rndisDevice);
+ rndis_filter_query_device_link_status(rndis_device);
- deviceInfo->link_state = rndisDevice->link_stat;
+ deviceInfo->link_state = rndis_device->link_stat;
dev_info(&dev->device, "Device MAC %pM link state %s",
- rndisDevice->hw_mac_adr,
+ rndis_device->hw_mac_adr,
((deviceInfo->link_state) ? ("down\n") : ("up\n")));
return ret;
--
1.7.4.1
K. Y. Srinivasan
2011-Sep-08 14:24 UTC
[PATCH 25/25] Staging: hv: netvsc: Rename deviceInfo as device_info
Rename deviceInfo as device_info.
Signed-off-by: K. Y. Srinivasan <kys at microsoft.com>
Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com>
---
drivers/staging/hv/rndis_filter.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/hv/rndis_filter.c
b/drivers/staging/hv/rndis_filter.c
index cb9d4f6..732dfe7 100644
--- a/drivers/staging/hv/rndis_filter.c
+++ b/drivers/staging/hv/rndis_filter.c
@@ -696,7 +696,7 @@ int rndis_filter_device_add(struct hv_device *dev,
int ret;
struct netvsc_device *net_device;
struct rndis_device *rndis_device;
- struct netvsc_device_info *deviceInfo = additional_info;
+ struct netvsc_device_info *device_info = additional_info;
rndis_device = get_rndis_device();
if (!rndis_device)
@@ -737,15 +737,15 @@ int rndis_filter_device_add(struct hv_device *dev,
*/
}
- memcpy(deviceInfo->mac_adr, rndis_device->hw_mac_adr, ETH_ALEN);
+ memcpy(device_info->mac_adr, rndis_device->hw_mac_adr, ETH_ALEN);
rndis_filter_query_device_link_status(rndis_device);
- deviceInfo->link_state = rndis_device->link_stat;
+ device_info->link_state = rndis_device->link_stat;
dev_info(&dev->device, "Device MAC %pM link state %s",
rndis_device->hw_mac_adr,
- ((deviceInfo->link_state) ? ("down\n") : ("up\n")));
+ ((device_info->link_state) ? ("down\n") : ("up\n")));
return ret;
}
--
1.7.4.1
Greg KH
2011-Sep-09 20:44 UTC
[PATCH 18/25] Staging: hv: storvsc: Eliminate the usage of ext field in struct hv_device
On Thu, Sep 08, 2011 at 07:24:29AM -0700, K. Y. Srinivasan wrote:> Now, eliminate the usage of ext field in struct hv_device for storvsc driver. > We do this by registering pointer to struct storvsc_device as the driver > specific data and eliminating the current usage of driver specific data to > save and retrieve the pointer to struct Scsi_Host. > Additionally, all access to the driver specific data is through > the vmbus wrapper functions. > > Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> > Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> > --- > drivers/staging/hv/storvsc_drv.c | 24 +++++++++++++++--------- > 1 files changed, 15 insertions(+), 9 deletions(-) > > diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c > index 57c1035..98d47cd 100644 > --- a/drivers/staging/hv/storvsc_drv.c > +++ b/drivers/staging/hv/storvsc_drv.c > @@ -266,6 +266,7 @@ struct storvsc_device { > bool destroy; > bool drain_notify; > atomic_t num_outstanding_req; > + struct Scsi_Host *host;You are properly reference counting this pointer, right?> @@ -306,7 +307,8 @@ static inline struct storvsc_device *get_out_stor_device( > { > struct storvsc_device *stor_device; > > - stor_device = (struct storvsc_device *)device->ext; > + stor_device > + (struct storvsc_device *)hv_get_drvdata(device);Casting is not needed at all.> @@ -1366,7 +1371,8 @@ static int storvsc_probe(struct hv_device *device, > stor_device->destroy = false; > init_waitqueue_head(&stor_device->waiting_to_drain); > stor_device->device = device; > - device->ext = stor_device; > + stor_device->host = host; > + hv_set_drvdata(device, stor_device);Lookie there, no reference count incremented, right? Or did I miss it somewhere else? gotta love dynamic pointer lifetime rules... greg k-h
KY Srinivasan
2011-Sep-10 14:16 UTC
[PATCH 18/25] Staging: hv: storvsc: Eliminate the usage of ext field in struct hv_device
> -----Original Message----- > From: Greg KH [mailto:greg at kroah.com] > Sent: Friday, September 09, 2011 4:45 PM > To: KY Srinivasan > Cc: gregkh at suse.de; linux-kernel at vger.kernel.org; > devel at linuxdriverproject.org; virtualization at lists.osdl.org; Haiyang Zhang > Subject: Re: [PATCH 18/25] Staging: hv: storvsc: Eliminate the usage of ext field in > struct hv_device > > On Thu, Sep 08, 2011 at 07:24:29AM -0700, K. Y. Srinivasan wrote: > > Now, eliminate the usage of ext field in struct hv_device for storvsc driver. > > We do this by registering pointer to struct storvsc_device as the driver > > specific data and eliminating the current usage of driver specific data to > > save and retrieve the pointer to struct Scsi_Host. > > Additionally, all access to the driver specific data is through > > the vmbus wrapper functions. > > > > Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> > > Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> > > --- > > drivers/staging/hv/storvsc_drv.c | 24 +++++++++++++++--------- > > 1 files changed, 15 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c > > index 57c1035..98d47cd 100644 > > --- a/drivers/staging/hv/storvsc_drv.c > > +++ b/drivers/staging/hv/storvsc_drv.c > > @@ -266,6 +266,7 @@ struct storvsc_device { > > bool destroy; > > bool drain_notify; > > atomic_t num_outstanding_req; > > + struct Scsi_Host *host; > > You are properly reference counting this pointer, right?The scsi_host_alloc() which we use to allocate the host structure, gives us the needed reference.> > > @@ -306,7 +307,8 @@ static inline struct storvsc_device > *get_out_stor_device( > > { > > struct storvsc_device *stor_device; > > > > - stor_device = (struct storvsc_device *)device->ext; > > + stor_device > > + (struct storvsc_device *)hv_get_drvdata(device); > > Casting is not needed at all. > > > @@ -1366,7 +1371,8 @@ static int storvsc_probe(struct hv_device *device, > > stor_device->destroy = false; > > init_waitqueue_head(&stor_device->waiting_to_drain); > > stor_device->device = device; > > - device->ext = stor_device; > > + stor_device->host = host; > > + hv_set_drvdata(device, stor_device); > > Lookie there, no reference count incremented, right? Or did I miss it > somewhere else?We are stashing the pointer to a structure on which we already have a reference (that was established at the point of allocating the host). Regards, K. Y
Greg KH
2011-Sep-10 18:28 UTC
[PATCH 18/25] Staging: hv: storvsc: Eliminate the usage of ext field in struct hv_device
On Sat, Sep 10, 2011 at 02:16:14PM +0000, KY Srinivasan wrote:> > > > -----Original Message----- > > From: Greg KH [mailto:greg at kroah.com] > > Sent: Friday, September 09, 2011 4:45 PM > > To: KY Srinivasan > > Cc: gregkh at suse.de; linux-kernel at vger.kernel.org; > > devel at linuxdriverproject.org; virtualization at lists.osdl.org; Haiyang Zhang > > Subject: Re: [PATCH 18/25] Staging: hv: storvsc: Eliminate the usage of ext field in > > struct hv_device > > > > On Thu, Sep 08, 2011 at 07:24:29AM -0700, K. Y. Srinivasan wrote: > > > Now, eliminate the usage of ext field in struct hv_device for storvsc driver. > > > We do this by registering pointer to struct storvsc_device as the driver > > > specific data and eliminating the current usage of driver specific data to > > > save and retrieve the pointer to struct Scsi_Host. > > > Additionally, all access to the driver specific data is through > > > the vmbus wrapper functions. > > > > > > Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> > > > Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> > > > --- > > > drivers/staging/hv/storvsc_drv.c | 24 +++++++++++++++--------- > > > 1 files changed, 15 insertions(+), 9 deletions(-) > > > > > > diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c > > > index 57c1035..98d47cd 100644 > > > --- a/drivers/staging/hv/storvsc_drv.c > > > +++ b/drivers/staging/hv/storvsc_drv.c > > > @@ -266,6 +266,7 @@ struct storvsc_device { > > > bool destroy; > > > bool drain_notify; > > > atomic_t num_outstanding_req; > > > + struct Scsi_Host *host; > > > > You are properly reference counting this pointer, right? > > The scsi_host_alloc() which we use to allocate the host structure, gives us > the needed reference.Ok, thanks, I missed that. The casting though should be taken out, otherwise the janitor project will just come along and clean it up again... greg k-h