K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 001/117] Staging: hv: vmbus: VMBUS is an ACPI enumerated device, get rid of the PCI signature
VMBUS is an ACPI enumerated device, get rid of the PCI signature. 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 | 13 ------------- 1 files changed, 0 insertions(+), 13 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 1c949f5..559353d 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -28,7 +28,6 @@ #include <linux/irq.h> #include <linux/interrupt.h> #include <linux/sysctl.h> -#include <linux/pci.h> #include <linux/dmi.h> #include <linux/slab.h> #include <linux/acpi.h> @@ -754,18 +753,6 @@ static struct acpi_driver vmbus_acpi_driver = { }, }; -/* - * We use a PCI table to determine if we should autoload this driver This is - * needed by distro tools to determine if the hyperv drivers should be - * installed and/or configured. We don't do anything else with the table, but - * it needs to be present. - */ -static const struct pci_device_id microsoft_hv_pci_table[] = { - { PCI_DEVICE(0x1414, 0x5353) }, /* VGA compatible controller */ - { 0 } -}; -MODULE_DEVICE_TABLE(pci, microsoft_hv_pci_table); - static int __init hv_acpi_init(void) { int ret; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 002/117] Staging: hv: Replace struct hv_guid with the uuid type already defined in Linux
Replace struct hv_guid with the uuid type already defined in Linux. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/blkvsc_drv.c | 18 +++--- drivers/staging/hv/channel.c | 4 +- drivers/staging/hv/channel_mgmt.c | 50 ++++++------- drivers/staging/hv/hv_mouse.c | 6 +- drivers/staging/hv/hyperv.h | 24 +++---- drivers/staging/hv/hyperv_vmbus.h | 8 +- drivers/staging/hv/netvsc.c | 6 +- drivers/staging/hv/storvsc_drv.c | 6 +- drivers/staging/hv/vmbus_drv.c | 142 ++++++++++++++++++------------------ 9 files changed, 129 insertions(+), 135 deletions(-) diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c index d286b22..018b293 100644 --- a/drivers/staging/hv/blkvsc_drv.c +++ b/drivers/staging/hv/blkvsc_drv.c @@ -112,8 +112,8 @@ struct block_device_context { static const char *drv_name = "blkvsc"; /* {32412632-86cb-44a2-9b5c-50d1417354f5} */ -static const struct hv_guid dev_type = { - .data = { +static const uuid_le dev_type = { + .b = { 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 } @@ -155,13 +155,13 @@ static int blkvsc_device_add(struct hv_device *device, * id. For IDE devices, the device instance id is formatted as * <bus id> * - <device id> - 8899 - 000000000000. */ - device_info->path_id = device->dev_instance.data[3] << 24 | - device->dev_instance.data[2] << 16 | - device->dev_instance.data[1] << 8 | - device->dev_instance.data[0]; + device_info->path_id = device->dev_instance.b[3] << 24 | + device->dev_instance.b[2] << 16 | + device->dev_instance.b[1] << 8 | + device->dev_instance.b[0]; - device_info->target_id = device->dev_instance.data[5] << 8 | - device->dev_instance.data[4]; + device_info->target_id = device->dev_instance.b[5] << 8 | + device->dev_instance.b[4]; return ret; } @@ -829,7 +829,7 @@ static int blkvsc_drv_init(void) BUILD_BUG_ON(sizeof(sector_t) != 8); - memcpy(&drv->dev_type, &dev_type, sizeof(struct hv_guid)); + memcpy(&drv->dev_type, &dev_type, sizeof(uuid_le)); drv->driver.name = drv_name; /* The driver belongs to vmbus */ diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c index 455f47a..222adcc 100644 --- a/drivers/staging/hv/channel.c +++ b/drivers/staging/hv/channel.c @@ -81,10 +81,10 @@ void vmbus_get_debug_info(struct vmbus_channel *channel, debuginfo->relid = channel->offermsg.child_relid; debuginfo->state = channel->state; memcpy(&debuginfo->interfacetype, - &channel->offermsg.offer.if_type, sizeof(struct hv_guid)); + &channel->offermsg.offer.if_type, sizeof(uuid_le)); memcpy(&debuginfo->interface_instance, &channel->offermsg.offer.if_instance, - sizeof(struct hv_guid)); + sizeof(uuid_le)); monitorpage = (struct hv_monitor_page *)vmbus_connection.monitor_pages; diff --git a/drivers/staging/hv/channel_mgmt.c b/drivers/staging/hv/channel_mgmt.c index bf011f3..11beb41 100644 --- a/drivers/staging/hv/channel_mgmt.c +++ b/drivers/staging/hv/channel_mgmt.c @@ -40,12 +40,12 @@ struct vmbus_channel_message_table_entry { #define MAX_MSG_TYPES 4 #define MAX_NUM_DEVICE_CLASSES_SUPPORTED 8 -static const struct hv_guid +static const uuid_le supported_device_classes[MAX_NUM_DEVICE_CLASSES_SUPPORTED] = { /* {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} */ /* Storage - SCSI */ { - .data = { + .b = { 0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f } @@ -54,7 +54,7 @@ static const struct hv_guid /* {F8615163-DF3E-46c5-913F-F2D2F965ED0E} */ /* Network */ { - .data = { + .b = { 0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E } @@ -63,7 +63,7 @@ static const struct hv_guid /* {CFA8B69E-5B4A-4cc0-B98B-8BA1A1F3F95A} */ /* Input */ { - .data = { + .b = { 0x9E, 0xB6, 0xA8, 0xCF, 0x4A, 0x5B, 0xc0, 0x4c, 0xB9, 0x8B, 0x8B, 0xA1, 0xA1, 0xF3, 0xF9, 0x5A } @@ -72,7 +72,7 @@ static const struct hv_guid /* {32412632-86cb-44a2-9b5c-50d1417354f5} */ /* IDE */ { - .data = { + .b = { 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 } @@ -80,7 +80,7 @@ static const struct hv_guid /* 0E0B6031-5213-4934-818B-38D90CED39DB */ /* Shutdown */ { - .data = { + .b = { 0x31, 0x60, 0x0B, 0X0E, 0x13, 0x52, 0x34, 0x49, 0x81, 0x8B, 0x38, 0XD9, 0x0C, 0xED, 0x39, 0xDB } @@ -88,7 +88,7 @@ static const struct hv_guid /* {9527E630-D0AE-497b-ADCE-E80AB0175CAF} */ /* TimeSync */ { - .data = { + .b = { 0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49, 0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf } @@ -96,7 +96,7 @@ static const struct hv_guid /* {57164f39-9115-4e78-ab55-382f3bd5422d} */ /* Heartbeat */ { - .data = { + .b = { 0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e, 0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d } @@ -104,7 +104,7 @@ static const struct hv_guid /* {A9A0F4E7-5A45-4d96-B827-8A841E8C03E6} */ /* KVP */ { - .data = { + .b = { 0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d, 0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6 } @@ -231,7 +231,7 @@ struct hyperv_service_callback hv_cb_utils[MAX_MSG_TYPES] = { /* Shutdown */ { .msg_type = HV_SHUTDOWN_MSG, - .data = { + .data.b = { 0x31, 0x60, 0x0B, 0X0E, 0x13, 0x52, 0x34, 0x49, 0x81, 0x8B, 0x38, 0XD9, 0x0C, 0xED, 0x39, 0xDB }, @@ -242,7 +242,7 @@ struct hyperv_service_callback hv_cb_utils[MAX_MSG_TYPES] = { /* TimeSync */ { .msg_type = HV_TIMESYNC_MSG, - .data = { + .data.b = { 0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49, 0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf }, @@ -252,7 +252,7 @@ struct hyperv_service_callback hv_cb_utils[MAX_MSG_TYPES] = { /* Heartbeat */ { .msg_type = HV_HEARTBEAT_MSG, - .data = { + .data.b = { 0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e, 0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d }, @@ -261,7 +261,7 @@ struct hyperv_service_callback hv_cb_utils[MAX_MSG_TYPES] = { /* {A9A0F4E7-5A45-4d96-B827-8A841E8C03E6} */ /* KVP */ { - .data = { + .data.b = { 0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d, 0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6 }, @@ -358,12 +358,10 @@ static void vmbus_process_offer(struct work_struct *work) spin_lock_irqsave(&vmbus_connection.channel_lock, flags); list_for_each_entry(channel, &vmbus_connection.chn_list, listentry) { - if (!memcmp(&channel->offermsg.offer.if_type, - &newchannel->offermsg.offer.if_type, - sizeof(struct hv_guid)) && - !memcmp(&channel->offermsg.offer.if_instance, - &newchannel->offermsg.offer.if_instance, - sizeof(struct hv_guid))) { + if (!uuid_le_cmp(channel->offermsg.offer.if_type, + newchannel->offermsg.offer.if_type) && + !uuid_le_cmp(channel->offermsg.offer.if_instance, + newchannel->offermsg.offer.if_instance)) { fnew = false; break; } @@ -416,9 +414,8 @@ static void vmbus_process_offer(struct work_struct *work) /* Open IC channels */ for (cnt = 0; cnt < MAX_MSG_TYPES; cnt++) { - if (memcmp(&newchannel->offermsg.offer.if_type, - &hv_cb_utils[cnt].data, - sizeof(struct hv_guid)) == 0 && + if (!uuid_le_cmp(newchannel->offermsg.offer.if_type, + hv_cb_utils[cnt].data) && vmbus_open(newchannel, 2 * PAGE_SIZE, 2 * PAGE_SIZE, NULL, 0, chn_cb_negotiate, @@ -444,16 +441,15 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr) { struct vmbus_channel_offer_channel *offer; struct vmbus_channel *newchannel; - struct hv_guid *guidtype; - struct hv_guid *guidinstance; + uuid_le *guidtype; + uuid_le *guidinstance; int i; int fsupported = 0; offer = (struct vmbus_channel_offer_channel *)hdr; for (i = 0; i < MAX_NUM_DEVICE_CLASSES_SUPPORTED; i++) { - if (memcmp(&offer->offer.if_type, - &supported_device_classes[i], - sizeof(struct hv_guid)) == 0) { + if (!uuid_le_cmp(offer->offer.if_type, + supported_device_classes[i])) { fsupported = 1; break; } diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index b191810..6f0992a 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -180,8 +180,8 @@ struct mousevsc_dev { static const char *driver_name = "mousevsc"; /* {CFA8B69E-5B4A-4cc0-B98B-8BA1A1F3F95A} */ -static const struct hv_guid mouse_guid = { - .data = {0x9E, 0xB6, 0xA8, 0xCF, 0x4A, 0x5B, 0xc0, 0x4c, +static const uuid_le mouse_guid = { + .b = {0x9E, 0xB6, 0xA8, 0xCF, 0x4A, 0x5B, 0xc0, 0x4c, 0xB9, 0x8B, 0x8B, 0xA1, 0xA1, 0xF3, 0xF9, 0x5A} }; @@ -933,7 +933,7 @@ static int __init mousevsc_init(void) DPRINT_INFO(INPUTVSC_DRV, "Hyper-V Mouse driver initializing."); memcpy(&drv->dev_type, &mouse_guid, - sizeof(struct hv_guid)); + sizeof(uuid_le)); drv->driver.name = driver_name; diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h index 1747a24..399d9fe 100644 --- a/drivers/staging/hv/hyperv.h +++ b/drivers/staging/hv/hyperv.h @@ -27,6 +27,7 @@ #include <linux/scatterlist.h> #include <linux/list.h> +#include <linux/uuid.h> #include <linux/timer.h> #include <linux/workqueue.h> #include <linux/completion.h> @@ -35,9 +36,6 @@ #include <asm/hyperv.h> -struct hv_guid { - unsigned char data[16]; -}; #define MAX_PAGE_BUFFER_COUNT 16 #define MAX_MULTIPAGE_BUFFER_COUNT 32 /* 128K */ @@ -156,8 +154,8 @@ struct hv_ring_buffer_debug_info { * struct contains the fundamental information about an offer. */ struct vmbus_channel_offer { - struct hv_guid if_type; - struct hv_guid if_instance; + uuid_le if_type; + uuid_le if_instance; u64 int_latency; /* in 100ns units */ u32 if_revision; u32 server_ctx_size; /* in bytes */ @@ -526,8 +524,8 @@ enum vmbus_channel_state { struct vmbus_channel_debug_info { u32 relid; enum vmbus_channel_state state; - struct hv_guid interfacetype; - struct hv_guid interface_instance; + uuid_le interfacetype; + uuid_le interface_instance; u32 monitorid; u32 servermonitor_pending; u32 servermonitor_latency; @@ -786,8 +784,8 @@ struct hv_dev_port_info { struct hv_device_info { u32 chn_id; u32 chn_state; - struct hv_guid chn_type; - struct hv_guid chn_instance; + uuid_le chn_type; + uuid_le chn_instance; u32 monitor_id; u32 server_monitor_pending; @@ -806,7 +804,7 @@ struct hv_driver { const char *name; /* the device type supported by this driver */ - struct hv_guid dev_type; + uuid_le dev_type; struct device_driver driver; @@ -819,10 +817,10 @@ struct hv_driver { /* Base device object */ struct hv_device { /* the device type id of this device */ - struct hv_guid dev_type; + uuid_le dev_type; /* the device instance id of this device */ - struct hv_guid dev_instance; + uuid_le dev_instance; struct device device; @@ -935,7 +933,7 @@ struct ictimesync_data { struct hyperv_service_callback { u8 msg_type; char *log_msg; - unsigned char data[16]; + uuid_le data; struct vmbus_channel *channel; void (*callback) (void *context); }; diff --git a/drivers/staging/hv/hyperv_vmbus.h b/drivers/staging/hv/hyperv_vmbus.h index 349ad80..16ca90d 100644 --- a/drivers/staging/hv/hyperv_vmbus.h +++ b/drivers/staging/hv/hyperv_vmbus.h @@ -451,8 +451,8 @@ enum { /* #define VMBUS_PORT_ID 11 */ /* 628180B8-308D-4c5e-B7DB-1BEB62E62EF4 */ -static const struct hv_guid VMBUS_SERVICE_ID = { - .data = { +static const uuid_le VMBUS_SERVICE_ID = { + .b = { 0xb8, 0x80, 0x81, 0x62, 0x8d, 0x30, 0x5e, 0x4c, 0xb7, 0xdb, 0x1b, 0xeb, 0x62, 0xe6, 0x2e, 0xf4 }, @@ -601,8 +601,8 @@ extern struct vmbus_connection vmbus_connection; /* General vmbus interface */ -struct hv_device *vmbus_child_device_create(struct hv_guid *type, - struct hv_guid *instance, +struct hv_device *vmbus_child_device_create(uuid_le *type, + uuid_le *instance, struct vmbus_channel *channel); int vmbus_child_device_register(struct hv_device *child_device_obj); diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index dc5e5c4..1506b53 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -36,8 +36,8 @@ static const char *driver_name = "netvsc"; /* {F8615163-DF3E-46c5-913F-F2D2F965ED0E} */ -static const struct hv_guid netvsc_device_type = { - .data = { +static const uuid_le netvsc_device_type = { + .b = { 0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E } @@ -1009,7 +1009,7 @@ int netvsc_initialize(struct hv_driver *drv) { drv->name = driver_name; - memcpy(&drv->dev_type, &netvsc_device_type, sizeof(struct hv_guid)); + memcpy(&drv->dev_type, &netvsc_device_type, sizeof(uuid_le)); return 0; } diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 7effaf3..e4cdbc5 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -45,8 +45,8 @@ MODULE_PARM_DESC(storvsc_ringbuffer_size, "Ring buffer size (bytes)"); static const char *driver_name = "storvsc"; /* {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} */ -static const struct hv_guid stor_vsci_device_type = { - .data = { +static const uuid_le stor_vsci_device_type = { + .b = { 0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f } @@ -765,7 +765,7 @@ static int __init storvsc_drv_init(void) sizeof(u64))); memcpy(&drv->dev_type, &stor_vsci_device_type, - sizeof(struct hv_guid)); + sizeof(uuid_le)); if (max_outstanding_req_per_channel < STORVSC_MAX_IO_REQUESTS) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 559353d..291b4e0 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -64,9 +64,9 @@ static void get_channel_info(struct hv_device *device, info->chn_id = debug_info.relid; info->chn_state = debug_info.state; memcpy(&info->chn_type, &debug_info.interfacetype, - sizeof(struct hv_guid)); + sizeof(uuid_le)); memcpy(&info->chn_instance, &debug_info.interface_instance, - sizeof(struct hv_guid)); + sizeof(uuid_le)); info->monitor_id = debug_info.monitorid; @@ -116,41 +116,41 @@ static ssize_t vmbus_show_device_attr(struct device *dev, if (!strcmp(dev_attr->attr.name, "class_id")) { return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-" "%02x%02x%02x%02x%02x%02x%02x%02x}\n", - device_info.chn_type.data[3], - device_info.chn_type.data[2], - device_info.chn_type.data[1], - device_info.chn_type.data[0], - device_info.chn_type.data[5], - device_info.chn_type.data[4], - device_info.chn_type.data[7], - device_info.chn_type.data[6], - device_info.chn_type.data[8], - device_info.chn_type.data[9], - device_info.chn_type.data[10], - device_info.chn_type.data[11], - device_info.chn_type.data[12], - device_info.chn_type.data[13], - device_info.chn_type.data[14], - device_info.chn_type.data[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-" "%02x%02x%02x%02x%02x%02x%02x%02x}\n", - device_info.chn_instance.data[3], - device_info.chn_instance.data[2], - device_info.chn_instance.data[1], - device_info.chn_instance.data[0], - device_info.chn_instance.data[5], - device_info.chn_instance.data[4], - device_info.chn_instance.data[7], - device_info.chn_instance.data[6], - device_info.chn_instance.data[8], - device_info.chn_instance.data[9], - device_info.chn_instance.data[10], - device_info.chn_instance.data[11], - device_info.chn_instance.data[12], - device_info.chn_instance.data[13], - device_info.chn_instance.data[14], - device_info.chn_instance.data[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, "state")) { return sprintf(buf, "%d\n", device_info.chn_state); } else if (!strcmp(dev_attr->attr.name, "id")) { @@ -246,22 +246,22 @@ static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) ret = add_uevent_var(env, "VMBUS_DEVICE_CLASS_GUID={" "%02x%02x%02x%02x-%02x%02x-%02x%02x-" "%02x%02x%02x%02x%02x%02x%02x%02x}", - dev->dev_type.data[3], - dev->dev_type.data[2], - dev->dev_type.data[1], - dev->dev_type.data[0], - dev->dev_type.data[5], - dev->dev_type.data[4], - dev->dev_type.data[7], - dev->dev_type.data[6], - dev->dev_type.data[8], - dev->dev_type.data[9], - dev->dev_type.data[10], - dev->dev_type.data[11], - dev->dev_type.data[12], - dev->dev_type.data[13], - dev->dev_type.data[14], - dev->dev_type.data[15]); + dev->dev_type.b[3], + dev->dev_type.b[2], + dev->dev_type.b[1], + dev->dev_type.b[0], + dev->dev_type.b[5], + dev->dev_type.b[4], + dev->dev_type.b[7], + dev->dev_type.b[6], + dev->dev_type.b[8], + dev->dev_type.b[9], + dev->dev_type.b[10], + dev->dev_type.b[11], + dev->dev_type.b[12], + dev->dev_type.b[13], + dev->dev_type.b[14], + dev->dev_type.b[15]); if (ret) return ret; @@ -269,22 +269,22 @@ static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) ret = add_uevent_var(env, "VMBUS_DEVICE_DEVICE_GUID={" "%02x%02x%02x%02x-%02x%02x-%02x%02x-" "%02x%02x%02x%02x%02x%02x%02x%02x}", - dev->dev_instance.data[3], - dev->dev_instance.data[2], - dev->dev_instance.data[1], - dev->dev_instance.data[0], - dev->dev_instance.data[5], - dev->dev_instance.data[4], - dev->dev_instance.data[7], - dev->dev_instance.data[6], - dev->dev_instance.data[8], - dev->dev_instance.data[9], - dev->dev_instance.data[10], - dev->dev_instance.data[11], - dev->dev_instance.data[12], - dev->dev_instance.data[13], - dev->dev_instance.data[14], - dev->dev_instance.data[15]); + dev->dev_instance.b[3], + dev->dev_instance.b[2], + dev->dev_instance.b[1], + dev->dev_instance.b[0], + dev->dev_instance.b[5], + dev->dev_instance.b[4], + dev->dev_instance.b[7], + dev->dev_instance.b[6], + dev->dev_instance.b[8], + dev->dev_instance.b[9], + dev->dev_instance.b[10], + dev->dev_instance.b[11], + dev->dev_instance.b[12], + dev->dev_instance.b[13], + dev->dev_instance.b[14], + dev->dev_instance.b[15]); if (ret) return ret; @@ -303,7 +303,7 @@ static int vmbus_match(struct device *device, struct device_driver *driver) /* We found our driver ? */ if (memcmp(&hv_dev->dev_type, &drv->dev_type, - sizeof(struct hv_guid)) == 0) + sizeof(uuid_le)) == 0) match = 1; return match; @@ -630,8 +630,8 @@ EXPORT_SYMBOL(vmbus_child_driver_unregister); * vmbus_child_device_create - Creates and registers a new child device * on the vmbus. */ -struct hv_device *vmbus_child_device_create(struct hv_guid *type, - struct hv_guid *instance, +struct hv_device *vmbus_child_device_create(uuid_le *type, + uuid_le *instance, struct vmbus_channel *channel) { struct hv_device *child_device_obj; @@ -644,9 +644,9 @@ struct hv_device *vmbus_child_device_create(struct hv_guid *type, } child_device_obj->channel = channel; - memcpy(&child_device_obj->dev_type, type, sizeof(struct hv_guid)); + memcpy(&child_device_obj->dev_type, type, sizeof(uuid_le)); memcpy(&child_device_obj->dev_instance, instance, - sizeof(struct hv_guid)); + sizeof(uuid_le)); return child_device_obj; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 003/117] Staging: hv: Add struct hv_vmbus_device_id to mod_devicetable.h
In preparation for implementing vmbus aliases for auto-loading Hyper-V drivers, define vmbus specific device ID. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- include/linux/mod_devicetable.h | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index ae28e93..5a12377 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -405,6 +405,13 @@ struct virtio_device_id { }; #define VIRTIO_DEV_ANY_ID 0xffffffff +/* + * For Hyper-V devices we use the device guid as the id. + */ +struct hv_vmbus_device_id { + __u8 guid[16]; +}; + /* i2c */ #define I2C_NAME_SIZE 20 -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 004/117] Staging: hv: Add code to parse struct hv_vmbus_device_id table
Add code to parse struct hv_vmbus_device_id table. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- scripts/mod/file2alias.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-) diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index e26e2fb..b74d21a 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -735,6 +735,27 @@ static int do_virtio_entry(const char *filename, struct virtio_device_id *id, return 1; } +/* + * Looks like: vmbus:guid + * Each byte of the guid will be represented by two hex characters + * in the name. + */ + +static int do_vmbus_entry(const char *filename, struct hv_vmbus_device_id *id, + char *alias) +{ + int i; + char guid_name[((sizeof(struct hv_vmbus_device_id) + 1)) * 2]; + + for (i = 0; i < (sizeof(struct hv_vmbus_device_id) * 2); i += 2) + sprintf(&guid_name[i], "%02x", id->guid[i/2]); + + strcpy(alias, "vmbus:"); + strcat(alias, guid_name); + + return 1; +} + /* Looks like: i2c:S */ static int do_i2c_entry(const char *filename, struct i2c_device_id *id, char *alias) @@ -994,6 +1015,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, do_table(symval, sym->st_size, sizeof(struct virtio_device_id), "virtio", do_virtio_entry, mod); + else if (sym_is(symname, "__mod_vmbus_device_table")) + do_table(symval, sym->st_size, + sizeof(struct hv_vmbus_device_id), "vmbus", + do_vmbus_entry, mod); else if (sym_is(symname, "__mod_i2c_device_table")) do_table(symval, sym->st_size, sizeof(struct i2c_device_id), "i2c", -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 005/117] Staging: hv: vmbus: Introduce vmbus ID space in struct hv_driver
In preparation for supporting auto-loading Hyper-V drivers using vmbus specific aliases, introduce vmbus ID space in struct hv_driver. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/hyperv.h | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h index 399d9fe..b8199f4 100644 --- a/drivers/staging/hv/hyperv.h +++ b/drivers/staging/hv/hyperv.h @@ -32,6 +32,7 @@ #include <linux/workqueue.h> #include <linux/completion.h> #include <linux/device.h> +#include <linux/mod_devicetable.h> #include <asm/hyperv.h> @@ -805,6 +806,7 @@ struct hv_driver { /* the device type supported by this driver */ uuid_le dev_type; + const struct hv_vmbus_device_id *id_table; struct device_driver driver; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 006/117] Staging: hv: blkvsc: Use the newly introduced vmbus ID in the blockvsc driver
Use the newly introduced vmbus ID in the blockvsc driver. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/blkvsc_drv.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c index 018b293..38117d96 100644 --- a/drivers/staging/hv/blkvsc_drv.c +++ b/drivers/staging/hv/blkvsc_drv.c @@ -802,10 +802,26 @@ static void blkvsc_request(struct request_queue *queue) } } +static const struct hv_vmbus_device_id id_table[] = { + { + /* IDE guid */ + .guid = { + 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, + 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 + } + }, + { + .guid = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + } + }, +}; /* The one and only one */ static struct hv_driver blkvsc_drv = { + .id_table = id_table, .probe = blkvsc_probe, .remove = blkvsc_remove, .shutdown = blkvsc_shutdown, -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 007/117] Staging: hv: storvsc: Use the newly introduced vmbus ID in storvsc driver
Use the newly introduced vmbus ID in storvsc driver. 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 | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index e4cdbc5..e30f11c 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -646,6 +646,21 @@ static struct scsi_host_template scsi_driver = { .dma_boundary = PAGE_SIZE-1, }; +static const struct hv_vmbus_device_id id_table[] = { + { + /* SCSI guid */ + .guid = { + 0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, + 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f + } + }, + { + .guid = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + } + }, +}; /* * storvsc_probe - Add a new device for this driver @@ -720,6 +735,7 @@ static int storvsc_probe(struct hv_device *device) /* The one and only one */ static struct hv_driver storvsc_drv = { + .id_table = id_table, .probe = storvsc_probe, .remove = storvsc_remove, }; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 008/117] Staging: hv: netvsc: Use the newly introduced vmbus ID in netvsc driver
Use the newly introduced vmbus ID in netvsc driver. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 61989f0..1f4b7b4 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -413,8 +413,25 @@ static int netvsc_remove(struct hv_device *dev) return 0; } +static const struct hv_vmbus_device_id id_table[] = { + { + /* Network guid */ + .guid = { + 0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, + 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E + } + }, + { + .guid = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + } + }, +}; + /* The one and only one */ static struct hv_driver netvsc_drv = { + .id_table = id_table, .probe = netvsc_probe, .remove = netvsc_remove, }; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 009/117] Staging: hv: mousevsc: Use the newly introduced vmbus ID in mouse driver
Use the newly introduced vmbus ID in mouse driver. 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 | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index 6f0992a..b8514fd 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -915,8 +915,24 @@ static void reportdesc_callback(struct hv_device *dev, void *packet, u32 len) kfree(hid_dev); } +static const struct hv_vmbus_device_id id_table[] = { + { + /* Mouse guid */ + .guid = { + 0x9E, 0xB6, 0xA8, 0xCF, 0x4A, 0x5B, 0xc0, 0x4c, + 0xB9, 0x8B, 0x8B, 0xA1, 0xA1, 0xF3, 0xF9, 0x5A + } + }, + { + .guid = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + } + }, +}; static struct hv_driver mousevsc_drv = { + .id_table = id_table, .probe = mousevsc_probe, .remove = mousevsc_remove, }; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:45 UTC
[PATCH 011/117] Staging: hv: util: Use the newly introduced vmbus ID in util driver
Use the newly introduced vmbus ID in util driver. 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 | 38 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 38 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c index e72bfe0..35540f5 100644 --- a/drivers/staging/hv/hv_util.c +++ b/drivers/staging/hv/hv_util.c @@ -226,9 +226,47 @@ static int util_remove(struct hv_device *dev) return 0; } +static const struct hv_vmbus_device_id id_table[] = { + { + /* Shutdown guid */ + .guid = { + 0x31, 0x60, 0x0B, 0X0E, 0x13, 0x52, 0x34, 0x49, + 0x81, 0x8B, 0x38, 0XD9, 0x0C, 0xED, 0x39, 0xDB + } + }, + { + /* Time synch guid */ + .guid = { + 0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49, + 0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf + } + }, + { + /* Heartbeat guid */ + .guid = { + 0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e, + 0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d + } + }, + { + /* KVP guid */ + .guid = { + 0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d, + 0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6 + } + }, + { + .guid = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + } + }, +}; + /* The one and only one */ static struct hv_driver util_drv = { + .id_table = id_table, .probe = util_probe, .remove = util_remove, }; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 012/117] Staging: hv: blkvsc: Add the MODULE_DEVICE_TABLE() line
Add the MODULE_DEVICE_TABLE() line in blkvsc_drv.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/blkvsc_drv.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c index 38117d96..8e4c206 100644 --- a/drivers/staging/hv/blkvsc_drv.c +++ b/drivers/staging/hv/blkvsc_drv.c @@ -818,6 +818,7 @@ static const struct hv_vmbus_device_id id_table[] = { }, }; +MODULE_DEVICE_TABLE(vmbus, id_table); /* The one and only one */ static struct hv_driver blkvsc_drv = { -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 013/117] Staging: hv: storvsc: Add MODULE_DEVICE_TABLE() line
Add MODULE_DEVICE_TABLE() line to storvsc_drv.c. 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 | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index e30f11c..65679a0 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -662,6 +662,7 @@ static const struct hv_vmbus_device_id id_table[] = { }, }; +MODULE_DEVICE_TABLE(vmbus, id_table); /* * storvsc_probe - Add a new device for this driver */ -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 014/117] Staging: hv: netvsc: Add the MODULE_DEVICE_TABLE() line
Add the MODULE_DEVICE_TABLE() line to netvsc_drv.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 1f4b7b4..5847662 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -429,6 +429,8 @@ static const struct hv_vmbus_device_id id_table[] = { }, }; +MODULE_DEVICE_TABLE(vmbus, id_table); + /* The one and only one */ static struct hv_driver netvsc_drv = { .id_table = id_table, -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 015/117] Staging: hv: util: Add the MODULE_DEVICE_TABLE() line
Add the MODULE_DEVICE_TABLE() line to hv_util.c. 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 | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c index 35540f5..8d327c5 100644 --- a/drivers/staging/hv/hv_util.c +++ b/drivers/staging/hv/hv_util.c @@ -263,6 +263,7 @@ static const struct hv_vmbus_device_id id_table[] = { }, }; +MODULE_DEVICE_TABLE(vmbus, id_table); /* The one and only one */ static struct hv_driver util_drv = { -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 016/117] Staging: hv: mouse: Add the MODULE_DEVICE_TABLE() line
Add the MODULE_DEVICE_TABLE() line to hv_mouse.c. 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 | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index b8514fd..d6441d6 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -931,6 +931,8 @@ static const struct hv_vmbus_device_id id_table[] = { }, }; +MODULE_DEVICE_TABLE(vmbus, id_table); + static struct hv_driver mousevsc_drv = { .id_table = id_table, .probe = mousevsc_probe, -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 017/117] Staging: hv: mouse: Do not auto-load the mouse driver
The mouse driver is not functional and so, prevent auto-loading of this driver. Earlier we added the MODULE_DEVICE_TABLE() line to verify that the appropriate module alias was generated. 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 | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index d6441d6..95986fb 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -931,7 +931,10 @@ static const struct hv_vmbus_device_id id_table[] = { }, }; -MODULE_DEVICE_TABLE(vmbus, id_table); +/* + * The mouse driver is not functional; do not auto-load it. + */ +/* MODULE_DEVICE_TABLE(vmbus, id_table); */ static struct hv_driver mousevsc_drv = { .id_table = id_table, -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 018/117] Staging: hv: vmbus: Cleanup vmbus_match()
Now that we are using the already defined type for guids, cleanup vmbus_match(). 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 | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 291b4e0..330cc43 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -302,8 +302,7 @@ static int vmbus_match(struct device *device, struct device_driver *driver) struct hv_device *hv_dev = device_to_hv_device(device); /* We found our driver ? */ - if (memcmp(&hv_dev->dev_type, &drv->dev_type, - sizeof(uuid_le)) == 0) + if (!uuid_le_cmp(hv_dev->dev_type, drv->dev_type)) match = 1; return match; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 019/117] Staging: hv: vmbus: Cleanup vmbus_uevent() code
Now generate appropriate uevent based on the modalias string. As part of this, cleanup the existing uevent code. 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 | 60 ++++++++-------------------------------- 1 files changed, 12 insertions(+), 48 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 330cc43..7baba62 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -237,58 +237,22 @@ static struct device_attribute vmbus_device_attrs[] = { * This routine is invoked when a device is added or removed on the vmbus to * generate a uevent to udev in the userspace. The udev will then look at its * rule and the uevent generated here to load the appropriate driver + * + * The alias string will be of the form vmbus:guid where guid is the string + * representation of the device guid (each byte of the guid will be + * represented with two hex characters. */ static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) { struct hv_device *dev = device_to_hv_device(device); - int ret; - - ret = add_uevent_var(env, "VMBUS_DEVICE_CLASS_GUID={" - "%02x%02x%02x%02x-%02x%02x-%02x%02x-" - "%02x%02x%02x%02x%02x%02x%02x%02x}", - dev->dev_type.b[3], - dev->dev_type.b[2], - dev->dev_type.b[1], - dev->dev_type.b[0], - dev->dev_type.b[5], - dev->dev_type.b[4], - dev->dev_type.b[7], - dev->dev_type.b[6], - dev->dev_type.b[8], - dev->dev_type.b[9], - dev->dev_type.b[10], - dev->dev_type.b[11], - dev->dev_type.b[12], - dev->dev_type.b[13], - dev->dev_type.b[14], - dev->dev_type.b[15]); - - if (ret) - return ret; + int i, ret; + char alias_name[((sizeof(struct hv_vmbus_device_id) + 1)) * 2]; - ret = add_uevent_var(env, "VMBUS_DEVICE_DEVICE_GUID={" - "%02x%02x%02x%02x-%02x%02x-%02x%02x-" - "%02x%02x%02x%02x%02x%02x%02x%02x}", - dev->dev_instance.b[3], - dev->dev_instance.b[2], - dev->dev_instance.b[1], - dev->dev_instance.b[0], - dev->dev_instance.b[5], - dev->dev_instance.b[4], - dev->dev_instance.b[7], - dev->dev_instance.b[6], - dev->dev_instance.b[8], - dev->dev_instance.b[9], - dev->dev_instance.b[10], - dev->dev_instance.b[11], - dev->dev_instance.b[12], - dev->dev_instance.b[13], - dev->dev_instance.b[14], - dev->dev_instance.b[15]); - if (ret) - return ret; + for (i = 0; i < (sizeof(struct hv_vmbus_device_id) * 2); i += 2) + sprintf(&alias_name[i], "%02x", dev->dev_type.b[i/2]); - return 0; + ret = add_uevent_var(env, "MODALIAS=vmbus:%s", alias_name); + return ret; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 020/117] Staging: hv: vmbus: Support the notion of id tables in vmbus_match()
Introduce code to handle driver specific id tables to the vmbus core (vmbus_match). This would allow us to handle more than one device type with a given driver. 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 | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 7baba62..3a8eb36 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -255,21 +255,32 @@ static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) return ret; } +static bool is_not_null_guid(const __u8 *guid) +{ + int i; + + for (i = 0; i < (sizeof(struct hv_vmbus_device_id)); i++) + if (guid[i] != 0) + return true; + return false; +} + /* * vmbus_match - Attempt to match the specified device to the specified driver */ static int vmbus_match(struct device *device, struct device_driver *driver) { - int match = 0; struct hv_driver *drv = drv_to_hv_drv(driver); struct hv_device *hv_dev = device_to_hv_device(device); + const struct hv_vmbus_device_id *id_array = drv->id_table; - /* We found our driver ? */ - if (!uuid_le_cmp(hv_dev->dev_type, drv->dev_type)) - match = 1; + for (; is_not_null_guid(id_array->guid); id_array++) + if (!memcmp(&id_array->guid, &hv_dev->dev_type.b, + sizeof(struct hv_vmbus_device_id))) + return 1; - return match; + return 0; } /* -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 021/117] Staging: hv: vmbus: Get rid of an unnecessary include line in vmbus_drv.c
Get rid of an unnecessary include line in vmbus_drv.c. 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 | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 3a8eb36..9a0df2c 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -28,7 +28,6 @@ #include <linux/irq.h> #include <linux/interrupt.h> #include <linux/sysctl.h> -#include <linux/dmi.h> #include <linux/slab.h> #include <linux/acpi.h> #include <acpi/acpi_bus.h> -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 023/117] Staging: hv: netvsc: Get rid of the PCI signature
Now that we have implemented a vmbus specific mechanism for auto-loading, get rid of the PCI signature. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 5847662..9352277 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -34,7 +34,6 @@ #include <linux/in.h> #include <linux/slab.h> #include <linux/dmi.h> -#include <linux/pci.h> #include <net/arp.h> #include <net/route.h> #include <net/sock.h> @@ -480,13 +479,6 @@ static int __init netvsc_drv_init(void) return ret; } -static const struct pci_device_id __initconst -hv_netvsc_pci_table[] __maybe_unused = { - { PCI_DEVICE(0x1414, 0x5353) }, /* VGA compatible controller */ - { 0 } -}; -MODULE_DEVICE_TABLE(pci, hv_netvsc_pci_table); - MODULE_LICENSE("GPL"); MODULE_VERSION(HV_DRV_VERSION); MODULE_DESCRIPTION("Microsoft Hyper-V network driver"); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 024/117] Staging: hv: netvsc: Get rid of the DMI signature in netvsc_drv.c
Now that we have implemented a vmbus specific mechanism for auto-loading, get rid of the DMI signature. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 19 ------------------- 1 files changed, 0 insertions(+), 19 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 9352277..43be9db 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -33,7 +33,6 @@ #include <linux/skbuff.h> #include <linux/in.h> #include <linux/slab.h> -#include <linux/dmi.h> #include <net/arp.h> #include <net/route.h> #include <net/sock.h> @@ -443,20 +442,6 @@ static void __exit netvsc_drv_exit(void) } -static const struct dmi_system_id __initconst -hv_netvsc_dmi_table[] __maybe_unused = { - { - .ident = "Hyper-V", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), - DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"), - DMI_MATCH(DMI_BOARD_NAME, "Virtual Machine"), - }, - }, - { }, -}; -MODULE_DEVICE_TABLE(dmi, hv_netvsc_dmi_table); - static int __init netvsc_drv_init(void) { struct hv_driver *drv = &netvsc_drv; @@ -464,10 +449,6 @@ static int __init netvsc_drv_init(void) pr_info("initializing...."); - if (!dmi_check_system(hv_netvsc_dmi_table)) - return -ENODEV; - - /* Callback to client driver to complete the initialization */ netvsc_initialize(drv); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 025/117] Staging: hv: util: Get rid of the DMI signature in hv_util.c
Now that we have implemented a vmbus specific mechanism for auto-loading, get rid of the DMI signature. 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 | 20 -------------------- 1 files changed, 0 insertions(+), 20 deletions(-) diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c index 8d327c5..6fabc99 100644 --- a/drivers/staging/hv/hv_util.c +++ b/drivers/staging/hv/hv_util.c @@ -26,7 +26,6 @@ #include <linux/slab.h> #include <linux/sysctl.h> #include <linux/reboot.h> -#include <linux/dmi.h> #include <linux/pci.h> #include "hyperv.h" @@ -279,22 +278,6 @@ hv_utils_pci_table[] __maybe_unused = { }; MODULE_DEVICE_TABLE(pci, hv_utils_pci_table); - -static const struct dmi_system_id __initconst -hv_utils_dmi_table[] __maybe_unused = { - { - .ident = "Hyper-V", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), - DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"), - DMI_MATCH(DMI_BOARD_NAME, "Virtual Machine"), - }, - }, - { }, -}; -MODULE_DEVICE_TABLE(dmi, hv_utils_dmi_table); - - static int __init init_hyperv_utils(void) { pr_info("Registering HyperV Utility Driver\n"); @@ -303,9 +286,6 @@ static int __init init_hyperv_utils(void) return -ENODEV; - if (!dmi_check_system(hv_utils_dmi_table)) - 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); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 026/117] Staging: hv: util: Get rid of the PCI signature in hv_util.c
Now that we have implemented a vmbus specific mechanism for auto-loading, get rid of the PCI signature. 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 | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c index 6fabc99..26693dd 100644 --- a/drivers/staging/hv/hv_util.c +++ b/drivers/staging/hv/hv_util.c @@ -26,7 +26,6 @@ #include <linux/slab.h> #include <linux/sysctl.h> #include <linux/reboot.h> -#include <linux/pci.h> #include "hyperv.h" #include "hv_kvp.h" @@ -271,13 +270,6 @@ static struct hv_driver util_drv = { .remove = util_remove, }; -static const struct pci_device_id __initconst -hv_utils_pci_table[] __maybe_unused = { - { PCI_DEVICE(0x1414, 0x5353) }, /* Hyper-V emulated VGA controller */ - { 0 } -}; -MODULE_DEVICE_TABLE(pci, hv_utils_pci_table); - static int __init init_hyperv_utils(void) { pr_info("Registering HyperV Utility Driver\n"); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 027/117] Staging: hv: blkvsc: Get rid of the dev_type guid from blkvsc_drv.c
Get rid of the dev_type guid from blkvsc_drv.c as it is no longer used. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/blkvsc_drv.c | 9 --------- 1 files changed, 0 insertions(+), 9 deletions(-) diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c index 8e4c206..cb61598 100644 --- a/drivers/staging/hv/blkvsc_drv.c +++ b/drivers/staging/hv/blkvsc_drv.c @@ -111,14 +111,6 @@ struct block_device_context { static const char *drv_name = "blkvsc"; -/* {32412632-86cb-44a2-9b5c-50d1417354f5} */ -static const uuid_le dev_type = { - .b = { - 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, - 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 - } -}; - /* * There is a circular dependency involving blkvsc_request_completion() * and blkvsc_do_request(). @@ -846,7 +838,6 @@ static int blkvsc_drv_init(void) BUILD_BUG_ON(sizeof(sector_t) != 8); - memcpy(&drv->dev_type, &dev_type, sizeof(uuid_le)); drv->driver.name = drv_name; /* The driver belongs to vmbus */ -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 028/117] Staging: hv: storvsc: Get rid of the device type guid from storvsc_drv.c
Get rid of the device type guid from storvsc_drv.c as it is no longer used. 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 | 11 ----------- 1 files changed, 0 insertions(+), 11 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index f594ca4..46cb81a 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -43,14 +43,6 @@ MODULE_PARM_DESC(storvsc_ringbuffer_size, "Ring buffer size (bytes)"); static const char *driver_name = "storvsc"; -/* {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} */ -static const uuid_le stor_vsci_device_type = { - .b = { - 0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, - 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f - } -}; - struct hv_host_device { struct hv_device *dev; struct kmem_cache *request_pool; @@ -759,9 +751,6 @@ static int __init storvsc_drv_init(void) sizeof(struct vstor_packet) + sizeof(u64), sizeof(u64))); - memcpy(&drv->dev_type, &stor_vsci_device_type, - sizeof(uuid_le)); - if (max_outstanding_req_per_channel < STORVSC_MAX_IO_REQUESTS) return -1; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 029/117] Staging: hv: netvsc: Get rid of the dev_type guid from netvsc.c
Get rid of the dev_type guid from netvsc.c, as it is no longer used. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc.c | 10 ---------- 1 files changed, 0 insertions(+), 10 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 1506b53..6f4541b 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -35,15 +35,6 @@ /* Globals */ static const char *driver_name = "netvsc"; -/* {F8615163-DF3E-46c5-913F-F2D2F965ED0E} */ -static const uuid_le netvsc_device_type = { - .b = { - 0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, - 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E - } -}; - - static struct netvsc_device *alloc_net_device(struct hv_device *device) { struct netvsc_device *net_device; @@ -1009,7 +1000,6 @@ int netvsc_initialize(struct hv_driver *drv) { drv->name = driver_name; - memcpy(&drv->dev_type, &netvsc_device_type, sizeof(uuid_le)); return 0; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 030/117] Staging: hv: netvsc: Initialize the driver name directly
Initialize the driver name directly in netvsc_drv.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 43be9db..dd66073 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -41,6 +41,8 @@ #include "hyperv.h" #include "hyperv_net.h" +static const char *driver_name = "netvsc"; + struct net_device_context { /* point back to our device context */ struct hv_device *device_ctx; @@ -452,7 +454,7 @@ static int __init netvsc_drv_init(void) /* Callback to client driver to complete the initialization */ netvsc_initialize(drv); - drv->driver.name = drv->name; + drv->driver.name = driver_name; /* The driver belongs to vmbus */ ret = vmbus_child_driver_register(&drv->driver); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 031/117] Staging: hv: netvsc: Get rid of the driver name initialization in netvsc.c
Now, get rid of the driver name initialization in int netvsc_initialize(). 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 ----- 1 files changed, 0 insertions(+), 5 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 6f4541b..d085018 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -32,9 +32,6 @@ #include "hyperv_net.h" -/* Globals */ -static const char *driver_name = "netvsc"; - static struct netvsc_device *alloc_net_device(struct hv_device *device) { struct netvsc_device *net_device; @@ -999,7 +996,5 @@ cleanup: int netvsc_initialize(struct hv_driver *drv) { - drv->name = driver_name; - return 0; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 032/117] Staging: hv: netvsc: Get rid of the empty function netvsc_initialize()
Now, get rid of the empty function netvsc_initialize(). 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 | 1 - drivers/staging/hv/netvsc.c | 9 --------- drivers/staging/hv/netvsc_drv.c | 3 --- 3 files changed, 0 insertions(+), 13 deletions(-) diff --git a/drivers/staging/hv/hyperv_net.h b/drivers/staging/hv/hyperv_net.h index 27f987b..5782fea 100644 --- a/drivers/staging/hv/hyperv_net.h +++ b/drivers/staging/hv/hyperv_net.h @@ -96,7 +96,6 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj, unsigned int status); int netvsc_recv_callback(struct hv_device *device_obj, struct hv_netvsc_packet *packet); -int netvsc_initialize(struct hv_driver *drv); int rndis_filter_open(struct hv_device *dev); int rndis_filter_close(struct hv_device *dev); int rndis_filter_device_add(struct hv_device *dev, diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index d085018..cb02eed 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -989,12 +989,3 @@ cleanup: return ret; } - -/* - * netvsc_initialize - Main entry point - */ -int netvsc_initialize(struct hv_driver *drv) -{ - - return 0; -} diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index dd66073..11c03ae 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -451,9 +451,6 @@ static int __init netvsc_drv_init(void) pr_info("initializing...."); - /* Callback to client driver to complete the initialization */ - netvsc_initialize(drv); - drv->driver.name = driver_name; /* The driver belongs to vmbus */ -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 033/117] Staging: hv: vmbus: Get rid of the unused name field in struct hv_driver
Get rid of the unused "name" field in struct hv_driver. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/hyperv.h | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h index b8199f4..60ead66 100644 --- a/drivers/staging/hv/hyperv.h +++ b/drivers/staging/hv/hyperv.h @@ -802,8 +802,6 @@ struct hv_device_info { /* Base driver object */ struct hv_driver { - const char *name; - /* the device type supported by this driver */ uuid_le dev_type; const struct hv_vmbus_device_id *id_table; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 034/117] Staging: hv: mouse: Get rid of the dev_type guid in hv_mouse.c
Get rid of the dev_type guid in hv_mouse.c, as it is not used. 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 | 9 --------- 1 files changed, 0 insertions(+), 9 deletions(-) diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index 95986fb..e0cede3 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -179,12 +179,6 @@ struct mousevsc_dev { static const char *driver_name = "mousevsc"; -/* {CFA8B69E-5B4A-4cc0-B98B-8BA1A1F3F95A} */ -static const uuid_le mouse_guid = { - .b = {0x9E, 0xB6, 0xA8, 0xCF, 0x4A, 0x5B, 0xc0, 0x4c, - 0xB9, 0x8B, 0x8B, 0xA1, 0xA1, 0xF3, 0xF9, 0x5A} -}; - static void deviceinfo_callback(struct hv_device *dev, struct hv_input_dev_info *info); static void inputreport_callback(struct hv_device *dev, void *packet, u32 len); static void reportdesc_callback(struct hv_device *dev, void *packet, u32 len); @@ -953,9 +947,6 @@ static int __init mousevsc_init(void) DPRINT_INFO(INPUTVSC_DRV, "Hyper-V Mouse driver initializing."); - memcpy(&drv->dev_type, &mouse_guid, - sizeof(uuid_le)); - drv->driver.name = driver_name; /* The driver belongs to vmbus */ -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 035/117] Staging: hv: vmbus: Introduce a function to map the dev_type guid to a name
To support "human readable" sysfs attribute, introduce a function to map the dev_type guid to a string. 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 | 36 ++++++++++++++++++++++++++++++++++++ drivers/staging/hv/hyperv.h | 2 +- 2 files changed, 37 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/channel_mgmt.c b/drivers/staging/hv/channel_mgmt.c index 11beb41..926bc87 100644 --- a/drivers/staging/hv/channel_mgmt.c +++ b/drivers/staging/hv/channel_mgmt.c @@ -112,6 +112,42 @@ static const uuid_le }; +static const char *blk_dev_type = "hv_block"; +static const char *net_dev_type = "hv_net"; +static const char *scsi_dev_type = "hv_scsi"; +static const char *mouse_dev_type = "hv_mouse"; +static const char *util_dev_type = "hv_util"; + +/* + * Map the dev_type guid to a human readable string. + * The indices used in this function are based on + * the table defined earlier - supported_device_classes[] + */ +const char *hv_get_devtype_name(const uuid_le *type) +{ + int i; + + for (i = 0; i < MAX_NUM_DEVICE_CLASSES_SUPPORTED; i++) { + if (!memcmp(type, supported_device_classes[i].b, + sizeof(uuid_le))) { + switch (i) { + case 0: + return scsi_dev_type; + case 1: + return net_dev_type; + case 2: + return mouse_dev_type; + case 3: + return blk_dev_type; + } + } + } + /* + * Currently the util driver is used + * to handle all these devices. + */ + return util_dev_type; +} /** * prep_negotiate_resp() - Create default response for Hyper-V Negotiate message diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h index 60ead66..c4a9f38 100644 --- a/drivers/staging/hv/hyperv.h +++ b/drivers/staging/hv/hyperv.h @@ -942,5 +942,5 @@ 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[]; - +const char *hv_get_devtype_name(const uuid_le *type); #endif /* _HYPERV_H */ -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 036/117] Staging: hv: vmbus: Make class_id attribute a human readable string
Now that we have a human readable device_type, use that and get rid of the guid based device type. 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 | 20 ++------------------ 1 files changed, 2 insertions(+), 18 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 9a0df2c..67415ab 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -113,24 +113,8 @@ static ssize_t vmbus_show_device_attr(struct device *dev, 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-" - "%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]); + return sprintf(buf, "%s\n", + hv_get_devtype_name(&device_info.chn_type)); } else if (!strcmp(dev_attr->attr.name, "device_id")) { return sprintf(buf, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-" "%02x%02x%02x%02x%02x%02x%02x%02x}\n", -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 037/117] Staging: hv: vmbus: Get rid of the device_id attribute
The guid based instance data is not very useful. There is enough information to identify the device. Get rid of this attribute. 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 | 20 -------------------- 1 files changed, 0 insertions(+), 20 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 67415ab..1d161ba 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -115,25 +115,6 @@ static ssize_t vmbus_show_device_attr(struct device *dev, if (!strcmp(dev_attr->attr.name, "class_id")) { return sprintf(buf, "%s\n", hv_get_devtype_name(&device_info.chn_type)); - } else if (!strcmp(dev_attr->attr.name, "device_id")) { - return 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]); } else if (!strcmp(dev_attr->attr.name, "state")) { return sprintf(buf, "%d\n", device_info.chn_state); } else if (!strcmp(dev_attr->attr.name, "id")) { @@ -188,7 +169,6 @@ static struct device_attribute vmbus_device_attrs[] = { __ATTR(id, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(state, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(class_id, S_IRUGO, vmbus_show_device_attr, NULL), - __ATTR(device_id, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(monitor_id, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(server_monitor_pending, S_IRUGO, vmbus_show_device_attr, NULL), -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 038/117] Staging: hv: vmbus: Get rid of some unnecessary comments
Get rid of some unnecessary comments. 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 | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 1d161ba..ffd6066 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -44,8 +44,6 @@ static struct tasklet_struct event_dpc; unsigned int vmbus_loglevel = (ALL_MODULES << 16 | INFO_LVL); EXPORT_SYMBOL(vmbus_loglevel); - /* (ALL_MODULES << 16 | DEBUG_LVL_ENTEREXIT); */ - /* (((VMBUS | VMBUS_DRV)<<16) | DEBUG_LVL_ENTEREXIT); */ static struct completion probe_event; static int irq; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 039/117] Staging: hv: vmbus: Cleanup unnecessary comments in hv.c
Cleanup unnecessary comments in hv.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/hv.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/drivers/staging/hv/hv.c b/drivers/staging/hv/hv.c index 824f816..2f94880 100644 --- a/drivers/staging/hv/hv.c +++ b/drivers/staging/hv/hv.c @@ -164,11 +164,7 @@ int hv_init(void) goto cleanup; max_leaf = query_hypervisor_info(); - /* HvQueryHypervisorFeatures(maxLeaf); */ - /* - * We only support running on top of Hyper-V - */ rdmsrl(HV_X64_MSR_GUEST_OS_ID, hv_context.guestid); if (hv_context.guestid != 0) @@ -181,10 +177,6 @@ int hv_init(void) /* See if the hypercall page is already set */ rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); - /* - * Allocate the hypercall page memory - * virtaddr = osd_page_alloc(1); - */ virtaddr = __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL_EXEC); if (!virtaddr) -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 040/117] Staging: hv: vmbus: Cleanup error handling in hv_init()
Use standard Linux error codes. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/hv.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/hv.c b/drivers/staging/hv/hv.c index 2f94880..e733173 100644 --- a/drivers/staging/hv/hv.c +++ b/drivers/staging/hv/hv.c @@ -225,8 +225,8 @@ cleanup: vfree(virtaddr); } - ret = -1; - return ret; + + return -ENOTSUPP; } /* -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 041/117] Staging: hv: vmbus: Get rid of unnecessay comments in connection.c
Get rid of unnecessay comments in connection.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/connection.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/connection.c b/drivers/staging/hv/connection.c index e6b4039..0e7efce 100644 --- a/drivers/staging/hv/connection.c +++ b/drivers/staging/hv/connection.c @@ -215,8 +215,6 @@ static void process_chn_event(u32 relid) { struct vmbus_channel *channel; - /* ASSERT(relId > 0); */ - /* * Find the channel based on this relid and invokes the * channel callback to process the event -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 042/117] Staging: hv: vmbus: Get rid of the function dump_gpadl_body()
Get rid of the function dump_gpadl_body() since it adds no value and actually is in the data path. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/channel.c | 20 -------------------- 1 files changed, 0 insertions(+), 20 deletions(-) diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c index 222adcc..2d5bfac 100644 --- a/drivers/staging/hv/channel.c +++ b/drivers/staging/hv/channel.c @@ -239,24 +239,6 @@ errorout: } EXPORT_SYMBOL_GPL(vmbus_open); -/* - * dump_gpadl_body - Dump the gpadl body message to the console for - * debugging purposes. - */ -static void dump_gpadl_body(struct vmbus_channel_gpadl_body *gpadl, u32 len) -{ - int i; - int pfncount; - - pfncount = (len - sizeof(struct vmbus_channel_gpadl_body)) / - sizeof(u64); - - DPRINT_DBG(VMBUS, "gpadl body - len %d pfn count %d", len, pfncount); - - for (i = 0; i < pfncount; i++) - DPRINT_DBG(VMBUS, "gpadl body - %d) pfn %llu", - i, gpadl->pfn[i]); -} /* * dump_gpadl_header - Dump the gpadl header message to the console for @@ -485,8 +467,6 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer, CHANNELMSG_GPADL_BODY; gpadl_body->gpadl = next_gpadl_handle; - dump_gpadl_body(gpadl_body, submsginfo->msgsize - - sizeof(*submsginfo)); ret = vmbus_post_msg(gpadl_body, submsginfo->msgsize - sizeof(*submsginfo)); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 043/117] Staging: hv: vmbus: Get rid of the function dump_gpadl_header()
Get rid of the function dump_gpadl_header() as this adds no value. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/channel.c | 28 ---------------------------- 1 files changed, 0 insertions(+), 28 deletions(-) diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c index 2d5bfac..aa0a150 100644 --- a/drivers/staging/hv/channel.c +++ b/drivers/staging/hv/channel.c @@ -239,33 +239,6 @@ errorout: } EXPORT_SYMBOL_GPL(vmbus_open); - -/* - * dump_gpadl_header - Dump the gpadl header message to the console for - * debugging purposes. - */ -static void dump_gpadl_header(struct vmbus_channel_gpadl_header *gpadl) -{ - int i, j; - int pagecount; - - DPRINT_DBG(VMBUS, - "gpadl header - relid %d, range count %d, range buflen %d", - gpadl->child_relid, gpadl->rangecount, gpadl->range_buflen); - for (i = 0; i < gpadl->rangecount; i++) { - pagecount = gpadl->range[i].byte_count >> PAGE_SHIFT; - pagecount = (pagecount > 26) ? 26 : pagecount; - - DPRINT_DBG(VMBUS, "gpadl range %d - len %d offset %d " - "page count %d", i, gpadl->range[i].byte_count, - gpadl->range[i].byte_offset, pagecount); - - for (j = 0; j < pagecount; j++) - DPRINT_DBG(VMBUS, "%d) pfn %llu", j, - gpadl->range[i].pfn_array[j]); - } -} - /* * create_gpadl_header - Creates a gpadl for the specified buffer */ @@ -443,7 +416,6 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer, gpadlmsg->child_relid = channel->offermsg.child_relid; gpadlmsg->gpadl = next_gpadl_handle; - dump_gpadl_header(gpadlmsg); spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags); list_add_tail(&msginfo->msglistentry, -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 044/117] Staging: hv: vmbus: Rename openMsg to open_msg in channel.c
Rename openMsg to open_msg in channel.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/channel.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c index aa0a150..ebd7552 100644 --- a/drivers/staging/hv/channel.c +++ b/drivers/staging/hv/channel.c @@ -119,7 +119,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, u32 recv_ringbuffer_size, void *userdata, u32 userdatalen, void (*onchannelcallback)(void *context), void *context) { - struct vmbus_channel_open_channel *openMsg; + struct vmbus_channel_open_channel *open_msg; struct vmbus_channel_msginfo *openInfo = NULL; void *in, *out; unsigned long flags; @@ -183,14 +183,14 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, init_completion(&openInfo->waitevent); - openMsg = (struct vmbus_channel_open_channel *)openInfo->msg; - openMsg->header.msgtype = CHANNELMSG_OPENCHANNEL; - openMsg->openid = newchannel->offermsg.child_relid; - openMsg->child_relid = newchannel->offermsg.child_relid; - openMsg->ringbuffer_gpadlhandle = newchannel->ringbuffer_gpadlhandle; - openMsg->downstream_ringbuffer_pageoffset = send_ringbuffer_size >> + open_msg = (struct vmbus_channel_open_channel *)openInfo->msg; + open_msg->header.msgtype = CHANNELMSG_OPENCHANNEL; + open_msg->openid = newchannel->offermsg.child_relid; + open_msg->child_relid = newchannel->offermsg.child_relid; + open_msg->ringbuffer_gpadlhandle = newchannel->ringbuffer_gpadlhandle; + open_msg->downstream_ringbuffer_pageoffset = send_ringbuffer_size >> PAGE_SHIFT; - openMsg->server_contextarea_gpadlhandle = 0; + open_msg->server_contextarea_gpadlhandle = 0; if (userdatalen > MAX_USER_DEFINED_BYTES) { err = -EINVAL; @@ -198,14 +198,14 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, } if (userdatalen) - memcpy(openMsg->userdata, userdata, userdatalen); + memcpy(open_msg->userdata, userdata, userdatalen); spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags); list_add_tail(&openInfo->msglistentry, &vmbus_connection.chn_msg_list); spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags); - ret = vmbus_post_msg(openMsg, + ret = vmbus_post_msg(open_msg, sizeof(struct vmbus_channel_open_channel)); if (ret != 0) -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 045/117] Staging: hv: vmbus: Get rid of unnecessary comments in channel.c
Get rid of unnecessary comments in channel.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/channel.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c index ebd7552..e02060e 100644 --- a/drivers/staging/hv/channel.c +++ b/drivers/staging/hv/channel.c @@ -76,7 +76,6 @@ void vmbus_get_debug_info(struct vmbus_channel *channel, struct hv_monitor_page *monitorpage; u8 monitor_group = (u8)channel->offermsg.monitorid / 32; u8 monitor_offset = (u8)channel->offermsg.monitorid % 32; - /* u32 monitorBit = 1 << monitorOffset; */ debuginfo->relid = channel->offermsg.child_relid; debuginfo->state = channel->state; @@ -392,7 +391,6 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer, { struct vmbus_channel_gpadl_header *gpadlmsg; struct vmbus_channel_gpadl_body *gpadl_body; - /* struct vmbus_channel_gpadl_created *gpadlCreated; */ struct vmbus_channel_msginfo *msginfo = NULL; struct vmbus_channel_msginfo *submsginfo; u32 msgcount; @@ -474,8 +472,6 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle) unsigned long flags; int ret, t; - /* ASSERT(gpadl_handle != 0); */ - info = kmalloc(sizeof(*info) + sizeof(struct vmbus_channel_gpadl_teardown), GFP_KERNEL); if (!info) -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 046/117] Staging: hv: vmbus: Change the variable name openInfo to open_info in channel.c
Change the variable name openInfo to open_info in channel.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/channel.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c index e02060e..9eb8def 100644 --- a/drivers/staging/hv/channel.c +++ b/drivers/staging/hv/channel.c @@ -119,7 +119,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, void (*onchannelcallback)(void *context), void *context) { struct vmbus_channel_open_channel *open_msg; - struct vmbus_channel_msginfo *openInfo = NULL; + struct vmbus_channel_msginfo *open_info = NULL; void *in, *out; unsigned long flags; int ret, t, err = 0; @@ -172,17 +172,17 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, } /* Create and init the channel open message */ - openInfo = kmalloc(sizeof(*openInfo) + + open_info = kmalloc(sizeof(*open_info) + sizeof(struct vmbus_channel_open_channel), GFP_KERNEL); - if (!openInfo) { + if (!open_info) { err = -ENOMEM; goto errorout; } - init_completion(&openInfo->waitevent); + init_completion(&open_info->waitevent); - open_msg = (struct vmbus_channel_open_channel *)openInfo->msg; + open_msg = (struct vmbus_channel_open_channel *)open_info->msg; open_msg->header.msgtype = CHANNELMSG_OPENCHANNEL; open_msg->openid = newchannel->offermsg.child_relid; open_msg->child_relid = newchannel->offermsg.child_relid; @@ -200,7 +200,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, memcpy(open_msg->userdata, userdata, userdatalen); spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags); - list_add_tail(&openInfo->msglistentry, + list_add_tail(&open_info->msglistentry, &vmbus_connection.chn_msg_list); spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags); @@ -210,22 +210,22 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, if (ret != 0) goto cleanup; - t = wait_for_completion_timeout(&openInfo->waitevent, 5*HZ); + t = wait_for_completion_timeout(&open_info->waitevent, 5*HZ); if (t == 0) { err = -ETIMEDOUT; goto errorout; } - if (openInfo->response.open_result.status) - err = openInfo->response.open_result.status; + if (open_info->response.open_result.status) + err = open_info->response.open_result.status; cleanup: spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags); - list_del(&openInfo->msglistentry); + list_del(&open_info->msglistentry); spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags); - kfree(openInfo); + kfree(open_info); return err; errorout: @@ -233,7 +233,7 @@ errorout: hv_ringbuffer_cleanup(&newchannel->inbound); free_pages((unsigned long)out, get_order(send_ringbuffer_size + recv_ringbuffer_size)); - kfree(openInfo); + kfree(open_info); return err; } EXPORT_SYMBOL_GPL(vmbus_open); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 047/117] Staging: hv: vmbus: Cleanup error values in ringbuffer.c
Use standard Linux errno values in ringbuffer.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/blkvsc_drv.c | 2 +- drivers/staging/hv/netvsc.c | 2 +- drivers/staging/hv/ring_buffer.c | 6 +++--- drivers/staging/hv/storvsc_drv.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c index cb61598..eab643a 100644 --- a/drivers/staging/hv/blkvsc_drv.c +++ b/drivers/staging/hv/blkvsc_drv.c @@ -726,7 +726,7 @@ static int blkvsc_do_request(struct block_device_context *blkdev, } else { ret = blkvsc_submit_request(blkvsc_req, blkvsc_request_completion); - if (ret == -1) { + if (ret == -EAGAIN) { pending = 1; list_add_tail(&blkvsc_req->pend_entry, &blkdev->pending_list); diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index cb02eed..d547ff6 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -565,7 +565,7 @@ retry_send_cmplt: if (ret == 0) { /* success */ /* no-op */ - } else if (ret == -1) { + } else if (ret == -EAGAIN) { /* no more room...wait a bit and attempt to retry 3 times */ retries++; dev_err(&device->device, "unable to send receive completion pkt" diff --git a/drivers/staging/hv/ring_buffer.c b/drivers/staging/hv/ring_buffer.c index 42f7672..9212699 100644 --- a/drivers/staging/hv/ring_buffer.c +++ b/drivers/staging/hv/ring_buffer.c @@ -390,7 +390,7 @@ int hv_ringbuffer_write(struct hv_ring_buffer_info *outring_info, /* is empty since the read index == write index */ if (bytes_avail_towrite <= totalbytes_towrite) { spin_unlock_irqrestore(&outring_info->ring_lock, flags); - return -1; + return -EAGAIN; } /* Write to the ring buffer */ @@ -450,7 +450,7 @@ int hv_ringbuffer_peek(struct hv_ring_buffer_info *Inring_info, spin_unlock_irqrestore(&Inring_info->ring_lock, flags); - return -1; + return -EAGAIN; } /* Convert to byte offset */ @@ -496,7 +496,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info, void *buffer, if (bytes_avail_toread < buflen) { spin_unlock_irqrestore(&inring_info->ring_lock, flags); - return -1; + return -EAGAIN; } next_read_location diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 46cb81a..7efde7c 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -580,7 +580,7 @@ retry_request: /* Invokes the vsc to start an IO */ ret = storvsc_do_io(dev, &cmd_request->request); - if (ret == -1) { + if (ret == -EAGAIN) { /* no more space */ if (cmd_request->bounce_sgl_count) { -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 048/117] Staging: hv: vmbus: Cleanup the error return value in vmbus_recvpacket_raw()
Use standard Linux errno values. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/channel.c | 2 +- drivers/staging/hv/hv_mouse.c | 2 +- drivers/staging/hv/netvsc.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/channel.c b/drivers/staging/hv/channel.c index 9eb8def..ac92c1f 100644 --- a/drivers/staging/hv/channel.c +++ b/drivers/staging/hv/channel.c @@ -811,7 +811,7 @@ int vmbus_recvpacket_raw(struct vmbus_channel *channel, void *buffer, pr_err("Buffer too small - needed %d bytes but " "got space for only %d bytes\n", packetlen, bufferlen); - return -2; + return -ENOBUFS; } *requestid = desc.trans_id; diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index e0cede3..30aa709 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -542,7 +542,7 @@ static void mousevsc_on_channel_callback(void *context) } break; } - } else if (ret == -2) { + } else if (ret == -ENOBUFS) { /* Handle large packet */ bufferlen = bytes_recvd; buffer = kzalloc(bytes_recvd, GFP_KERNEL); diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index d547ff6..b89ac7e 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -884,7 +884,7 @@ static void netvsc_channel_cb(void *context) break; } - } else if (ret == -2) { + } else if (ret == -ENOBUFS) { /* Handle large packet */ buffer = kmalloc(bytes_recvd, GFP_ATOMIC); if (buffer == NULL) { -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 049/117] Staging: hv: netvsc: Get rid of an unnecessary print statement in netvsc_probe()
Get rid of an unnecessary print statement in netvsc_probe(). Furthermore, this fixes a bug since netdev_err is being invoked after the device has been freed. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 11c03ae..542be65 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -357,8 +357,6 @@ static int netvsc_probe(struct hv_device *dev) if (ret != 0) { free_netdev(net); dev_set_drvdata(&dev->device, NULL); - - netdev_err(net, "unable to add netvsc device (ret %d)\n", ret); return ret; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 050/117] Staging: hv: vmbus: Retry vmbus_post_msg() before giving up
The function hv_post_msg() can fail because of transient resource conditions. It may be useful to retry the operation. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- arch/x86/include/asm/hyperv.h | 1 + drivers/staging/hv/connection.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletions(-) diff --git a/arch/x86/include/asm/hyperv.h b/arch/x86/include/asm/hyperv.h index 5df477a..b80420b 100644 --- a/arch/x86/include/asm/hyperv.h +++ b/arch/x86/include/asm/hyperv.h @@ -189,5 +189,6 @@ #define HV_STATUS_INVALID_HYPERCALL_CODE 2 #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 #define HV_STATUS_INVALID_ALIGNMENT 4 +#define HV_STATUS_INSUFFICIENT_BUFFERS 19 #endif diff --git a/drivers/staging/hv/connection.c b/drivers/staging/hv/connection.c index 0e7efce..a88ad70 100644 --- a/drivers/staging/hv/connection.c +++ b/drivers/staging/hv/connection.c @@ -25,6 +25,7 @@ #include <linux/kernel.h> #include <linux/sched.h> #include <linux/wait.h> +#include <linux/delay.h> #include <linux/mm.h> #include <linux/slab.h> #include <linux/vmalloc.h> @@ -268,10 +269,25 @@ void vmbus_on_event(unsigned long data) int vmbus_post_msg(void *buffer, size_t buflen) { union hv_connection_id conn_id; + int ret = 0; + int retries = 0; conn_id.asu32 = 0; conn_id.u.id = VMBUS_MESSAGE_CONNECTION_ID; - return hv_post_message(conn_id, 1, buffer, buflen); + + /* + * hv_post_message() can have transient failures because of + * insufficient resources. Retry the operation a couple of + * times before giving up. + */ + while (retries < 3) { + ret = hv_post_message(conn_id, 1, buffer, buflen); + if (ret != HV_STATUS_INSUFFICIENT_BUFFERS) + return ret; + retries++; + msleep(100); + } + return ret; } /* -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 051/117] Staging: hv: storvsc: Cleanup error handling in storvsc_dev_add()
Use standard Linux error values and cleanup error handling. I would like to acknowledge Andre Bartke (andre.bartke at gmail.com) for highlighting this problem. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 3029786..915aeee 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -392,10 +392,8 @@ int storvsc_dev_add(struct hv_device *device, device_info = (struct storvsc_device_info *)additional_info; stor_device = alloc_stor_device(device); - if (!stor_device) { - ret = -1; - goto cleanup; - } + if (!stor_device) + return -ENOMEM; /* Save the channel properties to our storvsc channel */ @@ -409,11 +407,13 @@ int storvsc_dev_add(struct hv_device *device, 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) { + free_stor_device(stor_device); + return ret; + } device_info->path_id = stor_device->path_id; device_info->target_id = stor_device->target_id; -cleanup: return ret; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 052/117] Staging: hv: storvsc: Cleanup error handling in storvsc_channel_init()
Use standard Linux error codes. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 915aeee..22ac6f2 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -111,7 +111,7 @@ static int storvsc_channel_init(struct hv_device *device) stor_device = get_stor_device(device); if (!stor_device) - return -1; + return -ENODEV; request = &stor_device->init_request; vstor_packet = &request->vstor_packet; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 053/117] Staging: hv: storvsc: Cleanup error handling in storvsc_connect_to_vsp()
Cleanup error handling in storvsc_connect_to_vsp(). Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 22ac6f2..2b73f72 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -376,7 +376,7 @@ static int storvsc_connect_to_vsp(struct hv_device *device, u32 ring_size) storvsc_on_channel_callback, device); if (ret != 0) - return -1; + return ret; ret = storvsc_channel_init(device); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 054/117] Staging: hv: storvsc: Cleanup error handling in storvsc_do_io()
Use standard Linux error codes. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 2b73f72..2b914e4 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -454,7 +454,7 @@ int storvsc_do_io(struct hv_device *device, stor_device = get_stor_device(device); if (!stor_device) - return -2; + return -ENODEV; request->device = device; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 055/117] Storage: hv: storvsc: Get rid of some unnecessary DPRINTs from storvsc.c
Get rid of some unnecessary DPRINTs from storvsc.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 16 ---------------- 1 files changed, 0 insertions(+), 16 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 2b914e4..3730f3f 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -125,8 +125,6 @@ static int storvsc_channel_init(struct hv_device *device) vstor_packet->operation = VSTOR_OPERATION_BEGIN_INITIALIZATION; vstor_packet->flags = REQUEST_COMPLETION_FLAG; - DPRINT_INFO(STORVSC, "BEGIN_INITIALIZATION_OPERATION..."); - ret = vmbus_sendpacket(device->channel, vstor_packet, sizeof(struct vstor_packet), (unsigned long)request, @@ -145,7 +143,6 @@ static int storvsc_channel_init(struct hv_device *device) vstor_packet->status != 0) goto cleanup; - DPRINT_INFO(STORVSC, "QUERY_PROTOCOL_VERSION_OPERATION..."); /* reuse the packet for version range supported */ memset(vstor_packet, 0, sizeof(struct vstor_packet)); @@ -174,8 +171,6 @@ static int storvsc_channel_init(struct hv_device *device) vstor_packet->status != 0) goto cleanup; - /* Query channel properties */ - DPRINT_INFO(STORVSC, "QUERY_PROPERTIES_OPERATION..."); memset(vstor_packet, 0, sizeof(struct vstor_packet)); vstor_packet->operation = VSTOR_OPERATION_QUERY_PROPERTIES; @@ -207,8 +202,6 @@ static int storvsc_channel_init(struct hv_device *device) stor_device->target_id = vstor_packet->storage_channel_properties.target_id; - DPRINT_INFO(STORVSC, "END_INITIALIZATION_OPERATION..."); - memset(vstor_packet, 0, sizeof(struct vstor_packet)); vstor_packet->operation = VSTOR_OPERATION_END_INITIALIZATION; vstor_packet->flags = REQUEST_COMPLETION_FLAG; @@ -232,7 +225,6 @@ static int storvsc_channel_init(struct hv_device *device) vstor_packet->status != 0) goto cleanup; - DPRINT_INFO(STORVSC, "**** storage channel up and running!! ****"); cleanup: put_stor_device(device); @@ -305,13 +297,8 @@ static void storvsc_on_receive(struct hv_device *device, storvsc_on_io_completion(device, vstor_packet, request); break; case VSTOR_OPERATION_REMOVE_DEVICE: - DPRINT_INFO(STORVSC, "REMOVE_DEVICE_OPERATION"); - /* TODO: */ - break; default: - DPRINT_INFO(STORVSC, "Unknown operation received - %d", - vstor_packet->operation); break; } } @@ -421,9 +408,6 @@ int storvsc_dev_remove(struct hv_device *device) { struct storvsc_device *stor_device; - DPRINT_INFO(STORVSC, "disabling storage device (%p)...", - device->ext); - stor_device = release_stor_device(device); /* -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 056/117] Staging: hv: storvsc: Fix/cleanup some dated comments in storvsc.c
Fix/cleanup some dated comments in storvsc.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 3730f3f..827b6a3 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -166,7 +166,6 @@ static int storvsc_channel_init(struct hv_device *device) goto cleanup; } - /* TODO: Check returned version */ if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || vstor_packet->status != 0) goto cleanup; @@ -193,7 +192,6 @@ static int storvsc_channel_init(struct hv_device *device) goto cleanup; } - /* TODO: Check returned version */ if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || vstor_packet->status != 0) goto cleanup; @@ -384,11 +382,12 @@ int storvsc_dev_add(struct hv_device *device, /* Save the channel properties to our storvsc channel */ - /* FIXME: */ /* * 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 + * scsi channel prior to the bus scan. + * + * The host does not support this. */ stor_device->port_number = device_info->port_number; @@ -545,4 +544,3 @@ int storvsc_get_major_info(struct storvsc_device_info *device_info, return -ENODEV; } - -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 057/117] Staging: hv: storvsc: Cleanup returned error code in storvsc_host_reset()
Use standard Linux error codes. 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 | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 7efde7c..f85ebb0 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -348,7 +348,7 @@ static int storvsc_host_reset(struct hv_device *device) stor_device = get_stor_device(device); if (!stor_device) - return -1; + return -ENODEV; request = &stor_device->reset_request; vstor_packet = &request->vstor_packet; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 058/117] Staging: hv: storvsc: Cleanup error code returned in storvsc_probe()
Use standard Linux error codes. 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 | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index f85ebb0..9640630 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -696,7 +696,7 @@ static int storvsc_probe(struct hv_device *device) if (ret != 0) { kmem_cache_destroy(host_dev->request_pool); scsi_host_put(host); - return -1; + return -ENODEV; } host_dev->path = device_info.path_id; @@ -717,7 +717,7 @@ static int storvsc_probe(struct hv_device *device) kmem_cache_destroy(host_dev->request_pool); scsi_host_put(host); - return -1; + return -ENODEV; } scsi_scan_host(host); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 059/117] Staging: hv: storvsc: Cleanup returned error code in storvsc_drv_init()
Use standard Linux error codes. 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 | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 9640630..bc71024 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -753,7 +753,7 @@ static int __init storvsc_drv_init(void) if (max_outstanding_req_per_channel < STORVSC_MAX_IO_REQUESTS) - return -1; + return -EINVAL; drv->driver.name = driver_name; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 060/117] Staging: hv: netvsc: Cleanup the returned error code in netvsc_probe()
Use standard Linux error codes. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc_drv.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 542be65..94c5abc 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -340,7 +340,7 @@ static int netvsc_probe(struct hv_device *dev) net = alloc_etherdev(sizeof(struct net_device_context)); if (!net) - return -1; + return -ENOMEM; /* Set initial state */ netif_carrier_off(net); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 062/117] Staging: hv: netvsc: Cleanup error return values in netvsc_init_recv_buf()
Use standard Linux error codes. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index baa0c8d..5703fd7 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -207,7 +207,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) if (!net_device) { dev_err(&device->device, "unable to get net device..." "device being destroyed?"); - return -1; + return -ENODEV; } net_device->recv_buf @@ -216,7 +216,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) if (!net_device->recv_buf) { dev_err(&device->device, "unable to allocate receive " "buffer of size %d", net_device->recv_buf_size); - ret = -1; + ret = -ENOMEM; goto cleanup; } @@ -269,7 +269,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) "initialzation with NetVsp - status %d", init_packet->msg.v1_msg. send_recv_buf_complete.status); - ret = -1; + ret = -EINVAL; goto cleanup; } @@ -281,7 +281,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) net_device->recv_section = kmalloc(net_device->recv_section_cnt * sizeof(struct nvsp_1_receive_buffer_section), GFP_KERNEL); if (net_device->recv_section == NULL) { - ret = -1; + ret = -EINVAL; goto cleanup; } @@ -297,7 +297,7 @@ static int netvsc_init_recv_buf(struct hv_device *device) */ if (net_device->recv_section_cnt != 1 || net_device->recv_section->offset != 0) { - ret = -1; + ret = -EINVAL; goto cleanup; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 063/117] Staging: hv: netvsc: Cleanup error returns in netvsc_connect_vsp()
Use standard Linux error codes. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 5703fd7..9cc126b 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -323,7 +323,7 @@ static int netvsc_connect_vsp(struct hv_device *device) if (!net_device) { dev_err(&device->device, "unable to get net device..." "device being destroyed?"); - return -1; + return -ENODEV; } init_packet = &net_device->channel_init_pkt; @@ -354,13 +354,13 @@ static int netvsc_connect_vsp(struct hv_device *device) if (init_packet->msg.init_msg.init_complete.status ! NVSP_STAT_SUCCESS) { - ret = -1; + ret = -EINVAL; goto cleanup; } if (init_packet->msg.init_msg.init_complete. negotiated_protocol_ver != NVSP_PROTOCOL_VERSION_1) { - ret = -1; + ret = -EPROTO; goto cleanup; } /* Send the ndis version */ @@ -381,10 +381,8 @@ static int netvsc_connect_vsp(struct hv_device *device) sizeof(struct nvsp_message), (unsigned long)init_packet, VM_PKT_DATA_INBAND, 0); - if (ret != 0) { - ret = -1; + if (ret != 0) goto cleanup; - } /* Post the big receive buffer to NetVSP */ ret = netvsc_init_recv_buf(device); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 064/117] Staging: hv: netvsc: Cleanup error return values in netvsc_send()
Use standard Linux error codes. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 9cc126b..f7f4957 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -409,7 +409,7 @@ int netvsc_device_remove(struct hv_device *device) net_device = release_outbound_net_device(device); if (!net_device) { dev_err(&device->device, "No net device present!!"); - return -1; + return -ENODEV; } /* Wait for all send completions */ @@ -499,7 +499,7 @@ int netvsc_send(struct hv_device *device, if (!net_device) { dev_err(&device->device, "net device (%p) shutting down..." "ignoring outbound packets", net_device); - return -2; + return -ENODEV; } sendMessage.hdr.msg_type = NVSP_MSG1_TYPE_SEND_RNDIS_PKT; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 065/117] Staging: hv: netvsc: Cleanup error return codes in netvsc_device_add()
Use standard Linux error codes. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index f7f4957..b6e1fb9 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -918,7 +918,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info) net_device = alloc_net_device(device); if (!net_device) { - ret = -1; + ret = -ENOMEM; goto cleanup; } @@ -947,7 +947,6 @@ int netvsc_device_add(struct hv_device *device, void *additional_info) if (ret != 0) { dev_err(&device->device, "unable to open channel: %d", ret); - ret = -1; goto cleanup; } @@ -959,7 +958,6 @@ int netvsc_device_add(struct hv_device *device, void *additional_info) if (ret != 0) { dev_err(&device->device, "unable to connect to NetVSP - %d", ret); - ret = -1; goto close; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 066/117] Staging: hv: netvsc: Cleanup error codes in rndis_filter_receive()
Use standard Linux error codes. 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 | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c index dbb5201..8e1ef00 100644 --- a/drivers/staging/hv/rndis_filter.c +++ b/drivers/staging/hv/rndis_filter.c @@ -358,14 +358,14 @@ int rndis_filter_receive(struct hv_device *dev, if (!net_dev->extension) { dev_err(&dev->device, "got rndis message but no rndis device - " "dropping this message!\n"); - return -1; + return -ENODEV; } rndis_dev = (struct rndis_device *)net_dev->extension; if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED) { dev_err(&dev->device, "got rndis message but rndis device " "uninitialized...dropping this message!\n"); - return -1; + return -ENODEV; } rndis_hdr = (struct rndis_message *)kmap_atomic( -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 067/117] Staging: hv: netvsc: Cleanup error code in rndis_filter_query_device()
Use standard Linux error codes. 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 | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c index 8e1ef00..f26886d 100644 --- a/drivers/staging/hv/rndis_filter.c +++ b/drivers/staging/hv/rndis_filter.c @@ -437,7 +437,7 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid, request = get_rndis_request(dev, REMOTE_NDIS_QUERY_MSG, RNDIS_MESSAGE_SIZE(struct rndis_query_request)); if (!request) { - ret = -1; + ret = -ENOMEM; goto Cleanup; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 068/117] Staging: hv: netvsc: Cleanup error return values in rndis_filter_set_packet_filter()
Use standard Linux error codes and cleanup some error paths. 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 | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c index f26886d..f5f3052 100644 --- a/drivers/staging/hv/rndis_filter.c +++ b/drivers/staging/hv/rndis_filter.c @@ -511,7 +511,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev, RNDIS_MESSAGE_SIZE(struct rndis_set_request) + sizeof(u32)); if (!request) { - ret = -1; + ret = -ENOMEM; goto Cleanup; } @@ -531,7 +531,6 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev, t = wait_for_completion_timeout(&request->wait_event, 5*HZ); if (t == 0) { - ret = -1; dev_err(&dev->net_dev->dev->device, "timeout before we got a set response...\n"); /* @@ -540,8 +539,6 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev, */ goto Exit; } else { - if (ret > 0) - ret = 0; set_complete = &request->response_msg.msg.set_complete; status = set_complete->status; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 069/117] Staging: hv: netvsc: Cleanup error returns in rndis_filter_init_device()
Use standard Linux error codes. 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 | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c index f5f3052..a71f29d 100644 --- a/drivers/staging/hv/rndis_filter.c +++ b/drivers/staging/hv/rndis_filter.c @@ -562,7 +562,7 @@ static int rndis_filter_init_device(struct rndis_device *dev) request = get_rndis_request(dev, REMOTE_NDIS_INITIALIZE_MSG, RNDIS_MESSAGE_SIZE(struct rndis_initialize_request)); if (!request) { - ret = -1; + ret = -ENOMEM; goto Cleanup; } @@ -596,7 +596,7 @@ static int rndis_filter_init_device(struct rndis_device *dev) ret = 0; } else { dev->state = RNDIS_DEV_UNINITIALIZED; - ret = -1; + ret = -EINVAL; } Cleanup: -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 070/117] Staging: hv: netvsc: Cleanup error code in rndis_filter_device_add()
Use standard Linux error codes. 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 | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c index a71f29d..f0d1362 100644 --- a/drivers/staging/hv/rndis_filter.c +++ b/drivers/staging/hv/rndis_filter.c @@ -673,7 +673,7 @@ int rndis_filter_device_add(struct hv_device *dev, rndisDevice = get_rndis_device(); if (!rndisDevice) - return -1; + return -ENODEV; /* * Let the inner driver handle this first to create the netvsc channel -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:46 UTC
[PATCH 071/117] Staging: hv: mouse: Change the jump label Cleanup to cleanup
Change the jump label "Cleanup" to "cleanup". 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 | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index 30aa709..1c17658 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -339,7 +339,7 @@ static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, if (!input_device->hid_desc) { pr_err("unable to allocate hid descriptor - size %d", desc->bLength); - goto Cleanup; + goto cleanup; } memcpy(input_device->hid_desc, desc, desc->bLength); @@ -352,7 +352,7 @@ static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, if (!input_device->report_desc) { pr_err("unable to allocate report descriptor - size %d", input_device->report_desc_size); - goto Cleanup; + goto cleanup; } memcpy(input_device->report_desc, @@ -379,7 +379,7 @@ static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, if (ret != 0) { pr_err("unable to send synthhid device info ack - ret %d", ret); - goto Cleanup; + goto cleanup; } input_device->device_wait_condition = 1; @@ -387,7 +387,7 @@ static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, return; -Cleanup: +cleanup: kfree(input_device->hid_desc); input_device->hid_desc = NULL; @@ -606,7 +606,7 @@ static int mousevsc_connect_to_vsp(struct hv_device *device) VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); if (ret != 0) { pr_err("unable to send synthhid protocol request."); - goto Cleanup; + goto cleanup; } input_dev->protocol_wait_condition = 0; @@ -614,7 +614,7 @@ static int mousevsc_connect_to_vsp(struct hv_device *device) input_dev->protocol_wait_condition, msecs_to_jiffies(1000)); if (input_dev->protocol_wait_condition == 0) { ret = -ETIMEDOUT; - goto Cleanup; + goto cleanup; } response = &input_dev->protocol_resp; @@ -623,7 +623,7 @@ static int mousevsc_connect_to_vsp(struct hv_device *device) pr_err("synthhid protocol request failed (version %d)", SYNTHHID_INPUT_VERSION); ret = -1; - goto Cleanup; + goto cleanup; } input_dev->device_wait_condition = 0; @@ -631,7 +631,7 @@ static int mousevsc_connect_to_vsp(struct hv_device *device) input_dev->device_wait_condition, msecs_to_jiffies(1000)); if (input_dev->device_wait_condition == 0) { ret = -ETIMEDOUT; - goto Cleanup; + goto cleanup; } /* @@ -643,7 +643,7 @@ static int mousevsc_connect_to_vsp(struct hv_device *device) else ret = -1; -Cleanup: +cleanup: put_input_device(device); return ret; @@ -661,7 +661,7 @@ static int mousevsc_on_device_add(struct hv_device *device, if (!input_dev) { ret = -1; - goto Cleanup; + goto cleanup; } input_dev->init_complete = false; @@ -714,7 +714,7 @@ static int mousevsc_on_device_add(struct hv_device *device, input_dev->init_complete = true; -Cleanup: +cleanup: return ret; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 073/117] Staging: hv: netvsc: Change the jump label Cleanup to cleanup
Change the jump label "Cleanup" to "cleanup". 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 | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-) diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c index f0d1362..79dfe78 100644 --- a/drivers/staging/hv/rndis_filter.c +++ b/drivers/staging/hv/rndis_filter.c @@ -438,7 +438,7 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid, RNDIS_MESSAGE_SIZE(struct rndis_query_request)); if (!request) { ret = -ENOMEM; - goto Cleanup; + goto cleanup; } /* Setup the rndis query */ @@ -450,12 +450,12 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid, ret = rndis_filter_send_request(dev, request); if (ret != 0) - goto Cleanup; + goto cleanup; t = wait_for_completion_timeout(&request->wait_event, 5*HZ); if (t == 0) { ret = -ETIMEDOUT; - goto Cleanup; + goto cleanup; } /* Copy the response back */ @@ -463,7 +463,7 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid, if (query_complete->info_buflen > inresult_size) { ret = -1; - goto Cleanup; + goto cleanup; } memcpy(result, @@ -473,7 +473,7 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid, *result_size = query_complete->info_buflen; -Cleanup: +cleanup: if (request) put_rndis_request(dev, request); @@ -512,7 +512,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev, sizeof(u32)); if (!request) { ret = -ENOMEM; - goto Cleanup; + goto cleanup; } /* Setup the rndis set */ @@ -526,7 +526,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev, ret = rndis_filter_send_request(dev, request); if (ret != 0) - goto Cleanup; + goto cleanup; t = wait_for_completion_timeout(&request->wait_event, 5*HZ); @@ -543,7 +543,7 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev, status = set_complete->status; } -Cleanup: +cleanup: if (request) put_rndis_request(dev, request); Exit: @@ -563,7 +563,7 @@ static int rndis_filter_init_device(struct rndis_device *dev) RNDIS_MESSAGE_SIZE(struct rndis_initialize_request)); if (!request) { ret = -ENOMEM; - goto Cleanup; + goto cleanup; } /* Setup the rndis set */ @@ -578,7 +578,7 @@ static int rndis_filter_init_device(struct rndis_device *dev) ret = rndis_filter_send_request(dev, request); if (ret != 0) { dev->state = RNDIS_DEV_UNINITIALIZED; - goto Cleanup; + goto cleanup; } @@ -586,7 +586,7 @@ static int rndis_filter_init_device(struct rndis_device *dev) if (t == 0) { ret = -ETIMEDOUT; - goto Cleanup; + goto cleanup; } init_complete = &request->response_msg.msg.init_complete; @@ -599,7 +599,7 @@ static int rndis_filter_init_device(struct rndis_device *dev) ret = -EINVAL; } -Cleanup: +cleanup: if (request) put_rndis_request(dev, request); @@ -615,7 +615,7 @@ static void rndis_filter_halt_device(struct rndis_device *dev) request = get_rndis_request(dev, REMOTE_NDIS_HALT_MSG, RNDIS_MESSAGE_SIZE(struct rndis_halt_request)); if (!request) - goto Cleanup; + goto cleanup; /* Setup the rndis set */ halt = &request->request_msg.msg.halt_req; @@ -626,7 +626,7 @@ static void rndis_filter_halt_device(struct rndis_device *dev) dev->state = RNDIS_DEV_UNINITIALIZED; -Cleanup: +cleanup: if (request) put_rndis_request(dev, request); return; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 075/117] Staging: hv: storvsc: Inline free_stor_device()
Inline the code for free_stor_device() and get rid of the function. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 8 ++------ 1 files changed, 2 insertions(+), 6 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 827b6a3..8c62829 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -51,10 +51,6 @@ static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) return stor_device; } -static inline void free_stor_device(struct storvsc_device *device) -{ - kfree(device); -} /* Get the stordevice object iff exists and its refcount > 0 */ static inline struct storvsc_device *must_get_stor_device( @@ -394,7 +390,7 @@ int storvsc_dev_add(struct hv_device *device, /* Send it back up */ ret = storvsc_connect_to_vsp(device, device_info->ring_buffer_size); if (ret) { - free_stor_device(stor_device); + kfree(stor_device); return ret; } device_info->path_id = stor_device->path_id; @@ -422,7 +418,7 @@ int storvsc_dev_remove(struct hv_device *device) /* Close the channel */ vmbus_close(device->channel); - free_stor_device(stor_device); + kfree(stor_device); return 0; } -- 1.7.4.1
Further cleanup of the hv drivers. Back in June I had sent two patch sets to address these issues. I have addressed the comments I got from the community on my earlier patches here: 1) Implement code for autoloading the vmbus drivers without using PCI or DMI signatures. I have implemented this based on Greg's feedback on my earlier implementation. 2) Cleanup error handling across the board and use standard Linux error codes. 3) General cleanup 4) Some bug fixes. 5) Cleanup the reference counting mess for both stor and net devices. 6) Handle all block devices using the storvsc driver. I have modified the implementation here based on Christoph's feedback on my earlier implementation. 7) Accomodate some host side scsi emulation bugs. 8) In case of scsi errors off-line the device. This patch-set further reduces the size of Hyper-V drivers - the code is about 10% smaller. This reduction is mainly because we have eliminated the blkvsc driver. Regards, K. Y
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 076/117] Staging: hv: storvsc: Do not aquire an unnecessary reference on stor_device
On entry into storvsc_on_io_completion() we have already acquired a reference on the stor_device; there is no need to acquire an additional reference here. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 8c62829..cd38cd6 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -232,9 +232,7 @@ static void storvsc_on_io_completion(struct hv_device *device, struct storvsc_device *stor_device; struct vstor_packet *stor_pkt; - stor_device = must_get_stor_device(device); - if (!stor_device) - return; + stor_device = (struct storvsc_device *)device->ext; stor_pkt = &request->vstor_packet; @@ -279,7 +277,6 @@ static void storvsc_on_io_completion(struct hv_device *device, wake_up(&stor_device->waiting_to_drain); - put_stor_device(device); } static void storvsc_on_receive(struct hv_device *device, -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 077/117] Staging: hv: storvsc: Rename must_get_stor_device()
In preparation for cleaning up how we manage reference counts on the stor device, clearly distinguish why we are attempting to acquire a reference. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index cd38cd6..89708b1 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -41,7 +41,7 @@ static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) return NULL; /* Set to 2 to allow both inbound and outbound traffics */ - /* (ie get_stor_device() and must_get_stor_device()) to proceed. */ + /* (ie get_stor_device() and get_in_stor_device()) to proceed. */ atomic_cmpxchg(&stor_device->ref_count, 0, 2); init_waitqueue_head(&stor_device->waiting_to_drain); @@ -53,7 +53,7 @@ static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) /* Get the stordevice object iff exists and its refcount > 0 */ -static inline struct storvsc_device *must_get_stor_device( +static inline struct storvsc_device *get_in_stor_device( struct hv_device *device) { struct storvsc_device *stor_device; @@ -305,7 +305,7 @@ static void storvsc_on_channel_callback(void *context) int ret; - stor_device = must_get_stor_device(device); + stor_device = get_in_stor_device(device); if (!stor_device) return; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 078/117] Staging: hv: storvsc: Rename get_stor_device()
In preparation for cleaning up how we manage reference counts on the stor device, clearly distinguish why we are attempting to acquire a reference. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/hyperv_storage.h | 3 ++- drivers/staging/hv/storvsc.c | 8 ++++---- drivers/staging/hv/storvsc_drv.c | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/staging/hv/hyperv_storage.h b/drivers/staging/hv/hyperv_storage.h index a01f9a0..a224413 100644 --- a/drivers/staging/hv/hyperv_storage.h +++ b/drivers/staging/hv/hyperv_storage.h @@ -288,7 +288,8 @@ struct storvsc_device { /* Get the stordevice object iff exists and its refcount > 1 */ -static inline struct storvsc_device *get_stor_device(struct hv_device *device) +static inline struct storvsc_device *get_out_stor_device( + struct hv_device *device) { struct storvsc_device *stor_device; diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 89708b1..313a3f8 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -41,7 +41,7 @@ static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) return NULL; /* Set to 2 to allow both inbound and outbound traffics */ - /* (ie get_stor_device() and get_in_stor_device()) to proceed. */ + /* (ie get_out_stor_device() and get_in_stor_device()) to proceed. */ atomic_cmpxchg(&stor_device->ref_count, 0, 2); init_waitqueue_head(&stor_device->waiting_to_drain); @@ -67,7 +67,7 @@ static inline struct storvsc_device *get_in_stor_device( return stor_device; } -/* Drop ref count to 1 to effectively disable get_stor_device() */ +/* Drop ref count to 1 to effectively disable get_out_stor_device() */ static inline struct storvsc_device *release_stor_device( struct hv_device *device) { @@ -105,7 +105,7 @@ static int storvsc_channel_init(struct hv_device *device) struct vstor_packet *vstor_packet; int ret, t; - stor_device = get_stor_device(device); + stor_device = get_out_stor_device(device); if (!stor_device) return -ENODEV; @@ -427,7 +427,7 @@ int storvsc_do_io(struct hv_device *device, int ret = 0; vstor_packet = &request->vstor_packet; - stor_device = get_stor_device(device); + stor_device = get_out_stor_device(device); if (!stor_device) return -ENODEV; diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index bc71024..0f2fc2f 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -346,7 +346,7 @@ static int storvsc_host_reset(struct hv_device *device) int ret, t; - stor_device = get_stor_device(device); + stor_device = get_out_stor_device(device); if (!stor_device) return -ENODEV; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 079/117] Staging: hv: storvsc: Cleanup alloc_stor_device()
Cleanup alloc_stor_device(), we can set the ref_count directly. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 313a3f8..48bd8da 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -42,7 +42,7 @@ static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) /* Set to 2 to allow both inbound and outbound traffics */ /* (ie get_out_stor_device() and get_in_stor_device()) to proceed. */ - atomic_cmpxchg(&stor_device->ref_count, 0, 2); + atomic_set(&stor_device->ref_count, 2); init_waitqueue_head(&stor_device->waiting_to_drain); stor_device->device = device; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 080/117] Staging: hv: storvsc: Introduce state to manage the lifecycle of stor device
Introduce state to manage the lifecycle of stor device. This would be the basis for managing the references on the stor object. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/hyperv_storage.h | 2 +- drivers/staging/hv/storvsc.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/hyperv_storage.h b/drivers/staging/hv/hyperv_storage.h index a224413..d93bf93 100644 --- a/drivers/staging/hv/hyperv_storage.h +++ b/drivers/staging/hv/hyperv_storage.h @@ -266,7 +266,7 @@ struct storvsc_device { /* 0 indicates the device is being destroyed */ atomic_t ref_count; - + bool destroy; bool drain_notify; atomic_t num_outstanding_req; diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 48bd8da..357b08a 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -43,7 +43,7 @@ static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) /* Set to 2 to allow both inbound and outbound traffics */ /* (ie get_out_stor_device() and get_in_stor_device()) to proceed. */ atomic_set(&stor_device->ref_count, 2); - + stor_device->destroy = false; init_waitqueue_head(&stor_device->waiting_to_drain); stor_device->device = device; device->ext = stor_device; @@ -401,6 +401,7 @@ int storvsc_dev_remove(struct hv_device *device) struct storvsc_device *stor_device; stor_device = release_stor_device(device); + stor_device->destroy = true; /* * At this point, all outbound traffic should be disable. We -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 081/117] Staging: hv: vmbus: Introduce a lock to protect the ext field in hv_device
The current mechanism for handling references in broken. Introduce a lock to protect the ext field in hv_device. 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 +++ drivers/staging/hv/vmbus_drv.c | 1 + 2 files changed, 4 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h index c4a9f38..82ba110 100644 --- a/drivers/staging/hv/hyperv.h +++ b/drivers/staging/hv/hyperv.h @@ -826,6 +826,9 @@ struct hv_device { struct vmbus_channel *channel; + /* This lock protects the device extension field */ + spinlock_t ext_lock; + /* Device extension; */ void *ext; }; diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index ffd6066..29c1712 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -578,6 +578,7 @@ struct hv_device *vmbus_child_device_create(uuid_le *type, return NULL; } + spin_lock_init(&child_device_obj->ext_lock); child_device_obj->channel = channel; memcpy(&child_device_obj->dev_type, type, sizeof(uuid_le)); memcpy(&child_device_obj->dev_instance, instance, -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 082/117] Staging: hv: storvsc: Use the newly introduced lock in accessing ext field
Use the newly introduced lock in accessing 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_storage.h | 6 ++++++ drivers/staging/hv/storvsc.c | 6 ++++++ 2 files changed, 12 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/hyperv_storage.h b/drivers/staging/hv/hyperv_storage.h index d93bf93..6b20f1d 100644 --- a/drivers/staging/hv/hyperv_storage.h +++ b/drivers/staging/hv/hyperv_storage.h @@ -292,12 +292,15 @@ static inline struct storvsc_device *get_out_stor_device( struct hv_device *device) { struct storvsc_device *stor_device; + unsigned long flags; + spin_lock_irqsave(&device->ext_lock, flags); stor_device = (struct storvsc_device *)device->ext; if (stor_device && atomic_read(&stor_device->ref_count) > 1) atomic_inc(&stor_device->ref_count); else stor_device = NULL; + spin_unlock_irqrestore(&device->ext_lock, flags); return stor_device; } @@ -306,10 +309,13 @@ static inline struct storvsc_device *get_out_stor_device( static inline void put_stor_device(struct hv_device *device) { struct storvsc_device *stor_device; + unsigned long flags; + spin_lock_irqsave(&device->ext_lock, flags); stor_device = (struct storvsc_device *)device->ext; atomic_dec(&stor_device->ref_count); + spin_unlock_irqrestore(&device->ext_lock, flags); } static inline void storvsc_wait_to_drain(struct storvsc_device *dev) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 357b08a..d1b6c4e 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -57,12 +57,15 @@ static inline struct storvsc_device *get_in_stor_device( struct hv_device *device) { struct storvsc_device *stor_device; + unsigned long flags; + spin_lock_irqsave(&device->ext_lock, flags); stor_device = (struct storvsc_device *)device->ext; if (stor_device && atomic_read(&stor_device->ref_count)) atomic_inc(&stor_device->ref_count); else stor_device = NULL; + spin_unlock_irqrestore(&device->ext_lock, flags); return stor_device; } @@ -87,6 +90,7 @@ static inline struct storvsc_device *final_release_stor_device( struct hv_device *device) { struct storvsc_device *stor_device; + unsigned long flags; stor_device = (struct storvsc_device *)device->ext; @@ -94,7 +98,9 @@ static inline struct storvsc_device *final_release_stor_device( while (atomic_cmpxchg(&stor_device->ref_count, 1, 0) != 1) udelay(100); + spin_lock_irqsave(&device->ext_lock, flags); device->ext = NULL; + spin_unlock_irqrestore(&device->ext_lock, flags); return stor_device; } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 083/117] Staging: hv: storvsc: Prevent outgoing traffic when stor dev is destroyed
Prevent outgoing traffic when stor dev is destroyed. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/hyperv_storage.h | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/hyperv_storage.h b/drivers/staging/hv/hyperv_storage.h index 6b20f1d..53b65be 100644 --- a/drivers/staging/hv/hyperv_storage.h +++ b/drivers/staging/hv/hyperv_storage.h @@ -296,7 +296,8 @@ static inline struct storvsc_device *get_out_stor_device( spin_lock_irqsave(&device->ext_lock, flags); stor_device = (struct storvsc_device *)device->ext; - if (stor_device && atomic_read(&stor_device->ref_count) > 1) + if (stor_device && (atomic_read(&stor_device->ref_count) > 1) && + !stor_device->destroy) atomic_inc(&stor_device->ref_count); else stor_device = NULL; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 084/117] Staging: hv: storvsc: Get rid of release_stor_device() by inlining the code
Get rid of release_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.c | 23 +++++++---------------- 1 files changed, 7 insertions(+), 16 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index d1b6c4e..f52e610 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -70,21 +70,6 @@ static inline struct storvsc_device *get_in_stor_device( return stor_device; } -/* Drop ref count to 1 to effectively disable get_out_stor_device() */ -static inline struct storvsc_device *release_stor_device( - struct hv_device *device) -{ - struct storvsc_device *stor_device; - - stor_device = (struct storvsc_device *)device->ext; - - /* Busy wait until the ref drop to 2, then set it to 1 */ - while (atomic_cmpxchg(&stor_device->ref_count, 2, 1) != 2) - udelay(100); - - return stor_device; -} - /* Drop ref count to 0. No one can use stor_device object. */ static inline struct storvsc_device *final_release_stor_device( struct hv_device *device) @@ -406,7 +391,13 @@ int storvsc_dev_remove(struct hv_device *device) { struct storvsc_device *stor_device; - stor_device = release_stor_device(device); + /* + * Since we currently hold a reference on the stor + * device, it is safe to dereference the ext + * pointer. + */ + stor_device = (struct storvsc_device *)device->ext; + atomic_dec(&stor_device->ref_count); stor_device->destroy = true; /* -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 085/117] Staging: hv: storvsc: Get rid of final_release_stor_device() by inlining code
Get rid of final_release_stor_device() by inlining code. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/storvsc.c | 25 +++++-------------------- 1 files changed, 5 insertions(+), 20 deletions(-) diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index f52e610..c4cb170 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -70,25 +70,6 @@ static inline struct storvsc_device *get_in_stor_device( return stor_device; } -/* Drop ref count to 0. No one can use stor_device object. */ -static inline struct storvsc_device *final_release_stor_device( - struct hv_device *device) -{ - struct storvsc_device *stor_device; - unsigned long flags; - - stor_device = (struct storvsc_device *)device->ext; - - /* Busy wait until the ref drop to 1, then set it to 0 */ - while (atomic_cmpxchg(&stor_device->ref_count, 1, 0) != 1) - udelay(100); - - spin_lock_irqsave(&device->ext_lock, flags); - device->ext = NULL; - spin_unlock_irqrestore(&device->ext_lock, flags); - return stor_device; -} - static int storvsc_channel_init(struct hv_device *device) { struct storvsc_device *stor_device; @@ -390,6 +371,7 @@ int storvsc_dev_add(struct hv_device *device, int storvsc_dev_remove(struct hv_device *device) { struct storvsc_device *stor_device; + unsigned long flags; /* * Since we currently hold a reference on the stor @@ -408,7 +390,10 @@ int storvsc_dev_remove(struct hv_device *device) storvsc_wait_to_drain(stor_device); - stor_device = final_release_stor_device(device); + spin_lock_irqsave(&device->ext_lock, flags); + atomic_set(&stor_device->ref_count, 0); + device->ext = NULL; + spin_unlock_irqrestore(&device->ext_lock, flags); /* Close the channel */ vmbus_close(device->channel); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 086/117] Staging: hv: storvsc: Leverage the spinlock to manage ref_cnt
Now that we have a spin lock protecting access to the stor device pointer, use it manage the reference count as well. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/hyperv_storage.h | 8 ++++---- drivers/staging/hv/storvsc.c | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/staging/hv/hyperv_storage.h b/drivers/staging/hv/hyperv_storage.h index 53b65be..d946211 100644 --- a/drivers/staging/hv/hyperv_storage.h +++ b/drivers/staging/hv/hyperv_storage.h @@ -265,7 +265,7 @@ struct storvsc_device { struct hv_device *device; /* 0 indicates the device is being destroyed */ - atomic_t ref_count; + int ref_count; bool destroy; bool drain_notify; atomic_t num_outstanding_req; @@ -296,9 +296,9 @@ static inline struct storvsc_device *get_out_stor_device( spin_lock_irqsave(&device->ext_lock, flags); stor_device = (struct storvsc_device *)device->ext; - if (stor_device && (atomic_read(&stor_device->ref_count) > 1) && + if (stor_device && (stor_device->ref_count > 1) && !stor_device->destroy) - atomic_inc(&stor_device->ref_count); + stor_device->ref_count++; else stor_device = NULL; spin_unlock_irqrestore(&device->ext_lock, flags); @@ -315,7 +315,7 @@ static inline void put_stor_device(struct hv_device *device) spin_lock_irqsave(&device->ext_lock, flags); stor_device = (struct storvsc_device *)device->ext; - atomic_dec(&stor_device->ref_count); + stor_device->ref_count--; spin_unlock_irqrestore(&device->ext_lock, flags); } diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index c4cb170..a41be2a 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -42,7 +42,7 @@ static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) /* Set to 2 to allow both inbound and outbound traffics */ /* (ie get_out_stor_device() and get_in_stor_device()) to proceed. */ - atomic_set(&stor_device->ref_count, 2); + stor_device->ref_count = 2; stor_device->destroy = false; init_waitqueue_head(&stor_device->waiting_to_drain); stor_device->device = device; @@ -61,8 +61,8 @@ static inline struct storvsc_device *get_in_stor_device( spin_lock_irqsave(&device->ext_lock, flags); stor_device = (struct storvsc_device *)device->ext; - if (stor_device && atomic_read(&stor_device->ref_count)) - atomic_inc(&stor_device->ref_count); + if (stor_device && stor_device->ref_count) + stor_device->ref_count++; else stor_device = NULL; spin_unlock_irqrestore(&device->ext_lock, flags); @@ -379,7 +379,7 @@ int storvsc_dev_remove(struct hv_device *device) * pointer. */ stor_device = (struct storvsc_device *)device->ext; - atomic_dec(&stor_device->ref_count); + stor_device->destroy = true; /* @@ -391,7 +391,7 @@ int storvsc_dev_remove(struct hv_device *device) storvsc_wait_to_drain(stor_device); spin_lock_irqsave(&device->ext_lock, flags); - atomic_set(&stor_device->ref_count, 0); + stor_device->ref_count = 0; device->ext = NULL; spin_unlock_irqrestore(&device->ext_lock, flags); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 087/117] Staging: hv: storvsc: Further cleanup reference counting of stor_device
Further cleanup reference counting of stor_device - when the device is being destroyed, we will permit incoming traffic only to drain outstanding requests. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/hyperv_storage.h | 3 +-- drivers/staging/hv/storvsc.c | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/drivers/staging/hv/hyperv_storage.h b/drivers/staging/hv/hyperv_storage.h index d946211..a1f3e27 100644 --- a/drivers/staging/hv/hyperv_storage.h +++ b/drivers/staging/hv/hyperv_storage.h @@ -287,7 +287,6 @@ struct storvsc_device { }; -/* Get the stordevice object iff exists and its refcount > 1 */ static inline struct storvsc_device *get_out_stor_device( struct hv_device *device) { @@ -296,7 +295,7 @@ static inline struct storvsc_device *get_out_stor_device( spin_lock_irqsave(&device->ext_lock, flags); stor_device = (struct storvsc_device *)device->ext; - if (stor_device && (stor_device->ref_count > 1) && + if (stor_device && (stor_device->ref_count) && !stor_device->destroy) stor_device->ref_count++; else diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index a41be2a..4d13044 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -40,9 +40,7 @@ static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) if (!stor_device) return NULL; - /* Set to 2 to allow both inbound and outbound traffics */ - /* (ie get_out_stor_device() and get_in_stor_device()) to proceed. */ - stor_device->ref_count = 2; + stor_device->ref_count = 1; stor_device->destroy = false; init_waitqueue_head(&stor_device->waiting_to_drain); stor_device->device = device; @@ -51,8 +49,6 @@ static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) return stor_device; } - -/* Get the stordevice object iff exists and its refcount > 0 */ static inline struct storvsc_device *get_in_stor_device( struct hv_device *device) { @@ -61,10 +57,18 @@ static inline struct storvsc_device *get_in_stor_device( spin_lock_irqsave(&device->ext_lock, flags); stor_device = (struct storvsc_device *)device->ext; - if (stor_device && stor_device->ref_count) - stor_device->ref_count++; - else - stor_device = NULL; + if (!stor_device) + goto cleanup; + + /* + * If the device is being destroyed; allow incoming + * traffic only to cleanup outstanding requests. + */ + if (stor_device->destroy && + (atomic_read(&stor_device->num_outstanding_req) == 0)) + goto cleanup; + stor_device->ref_count++; +cleanup: spin_unlock_irqrestore(&device->ext_lock, flags); return stor_device; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 088/117] Staging: hv: netvsc: Inline the code for free_net_device()
Inline the code for free_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 | 12 ++---------- 1 files changed, 2 insertions(+), 10 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index b6e1fb9..75c6ed7 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -49,14 +49,6 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device) return net_device; } -static void free_net_device(struct netvsc_device *device) -{ - WARN_ON(atomic_read(&device->refcnt) != 0); - device->dev->ext = NULL; - kfree(device); -} - - /* Get the net device object iff exists and its refcount > 1 */ static struct netvsc_device *get_outbound_net_device(struct hv_device *device) { @@ -438,7 +430,7 @@ int netvsc_device_remove(struct hv_device *device) kfree(netvsc_packet); } - free_net_device(net_device); + kfree(net_device); return 0; } @@ -980,7 +972,7 @@ cleanup: release_outbound_net_device(device); release_inbound_net_device(device); - free_net_device(net_device); + kfree(net_device); } return ret; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 089/117] Staging: hv: netvsc: Cleanup alloc_net_device()
Cleanup alloc_net_device(); we can directly set the refcnt. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 75c6ed7..7722102 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -41,7 +41,7 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device) return NULL; /* Set to 2 to allow both inbound and outbound traffic */ - atomic_cmpxchg(&net_device->refcnt, 0, 2); + atomic_set(&net_device->refcnt, 2); net_device->dev = device; device->ext = net_device; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 090/117] Staging: hv: netvsc: Introduce state to manage the lifecycle of net device
Introduce state to manage the lifecycle of net device. 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 | 1 + drivers/staging/hv/netvsc.c | 3 +++ 2 files changed, 4 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/hyperv_net.h b/drivers/staging/hv/hyperv_net.h index 5782fea..0b347c1 100644 --- a/drivers/staging/hv/hyperv_net.h +++ b/drivers/staging/hv/hyperv_net.h @@ -371,6 +371,7 @@ struct netvsc_device { atomic_t refcnt; atomic_t num_outstanding_sends; + bool destroy; /* * List of free preallocated hv_netvsc_packet to represent receive * packet diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 7722102..67cf7fb 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -43,6 +43,7 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device) /* Set to 2 to allow both inbound and outbound traffic */ atomic_set(&net_device->refcnt, 2); + net_device->destroy = false; net_device->dev = device; device->ext = net_device; @@ -404,6 +405,8 @@ int netvsc_device_remove(struct hv_device *device) return -ENODEV; } + net_device->destroy = true; + /* Wait for all send completions */ while (atomic_read(&net_device->num_outstanding_sends)) { dev_err(&device->device, -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 091/117] Staging: hv: netvsc: Use the newly introduced lock in accessing ext field
Use the newly introduced lock in accessing ext field. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc.c | 33 ++++++++++++++++++++++++++++++--- 1 files changed, 30 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 67cf7fb..c38c669 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -54,12 +54,15 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device) static struct netvsc_device *get_outbound_net_device(struct hv_device *device) { struct netvsc_device *net_device; + unsigned long flags; + spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; if (net_device && atomic_read(&net_device->refcnt) > 1) atomic_inc(&net_device->refcnt); else net_device = NULL; + spin_unlock_irqrestore(&device->ext_lock, flags); return net_device; } @@ -68,33 +71,46 @@ static struct netvsc_device *get_outbound_net_device(struct hv_device *device) static struct netvsc_device *get_inbound_net_device(struct hv_device *device) { struct netvsc_device *net_device; + unsigned long flags; + spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; if (net_device && atomic_read(&net_device->refcnt)) atomic_inc(&net_device->refcnt); else net_device = NULL; + spin_unlock_irqrestore(&device->ext_lock, flags); return net_device; } static void put_net_device(struct hv_device *device) { struct netvsc_device *net_device; + unsigned long flags; + + spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; atomic_dec(&net_device->refcnt); + spin_unlock_irqrestore(&device->ext_lock, flags); } static struct netvsc_device *release_outbound_net_device( struct hv_device *device) { struct netvsc_device *net_device; + unsigned long flags; + spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; - if (net_device == NULL) + if (net_device == NULL) { + spin_unlock_irqrestore(&device->ext_lock, flags); return NULL; + } + + spin_unlock_irqrestore(&device->ext_lock, flags); /* Busy wait until the ref drop to 2, then set it to 1 */ while (atomic_cmpxchg(&net_device->refcnt, 2, 1) != 2) @@ -107,16 +123,23 @@ static struct netvsc_device *release_inbound_net_device( struct hv_device *device) { struct netvsc_device *net_device; + unsigned long flags; + spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; - if (net_device == NULL) + if (net_device == NULL) { + spin_unlock_irqrestore(&device->ext_lock, flags); return NULL; + } + spin_unlock_irqrestore(&device->ext_lock, flags); /* Busy wait until the ref drop to 1, then set it to 0 */ while (atomic_cmpxchg(&net_device->refcnt, 1, 0) != 1) udelay(100); + spin_lock_irqsave(&device->ext_lock, flags); device->ext = NULL; + spin_unlock_irqrestore(&device->ext_lock, flags); return net_device; } @@ -397,6 +420,8 @@ int netvsc_device_remove(struct hv_device *device) { struct netvsc_device *net_device; struct hv_netvsc_packet *netvsc_packet, *pos; + unsigned long flags; + /* Stop outbound traffic ie sends and receives completions */ net_device = release_outbound_net_device(device); @@ -404,8 +429,10 @@ int netvsc_device_remove(struct hv_device *device) dev_err(&device->device, "No net device present!!"); return -ENODEV; } - + spin_lock_irqsave(&device->ext_lock, flags); net_device->destroy = true; + spin_unlock_irqrestore(&device->ext_lock, flags); + /* Wait for all send completions */ while (atomic_read(&net_device->num_outstanding_sends)) { -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 092/117] Staging: hv: netvsc: Prevent outgoing traffic when netvsc dev is destroyed
Prevent outgoing traffic when netvsc dev is destroyed. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 2ee3f07..538259d 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -58,7 +58,8 @@ static struct netvsc_device *get_outbound_net_device(struct hv_device *device) spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; - if (net_device && atomic_read(&net_device->refcnt) > 1) + if (net_device && (atomic_read(&net_device->refcnt) > 1) && + !net_device->destroy) atomic_inc(&net_device->refcnt); else net_device = NULL; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 094/117] Staging: hv: netvsc: Get rid of release_inbound_net_device() by inlining the code
Get rid of release_inbound_net_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/netvsc.c | 32 ++++---------------------------- 1 files changed, 4 insertions(+), 28 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 3975219..6805137 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -98,30 +98,6 @@ static void put_net_device(struct hv_device *device) spin_unlock_irqrestore(&device->ext_lock, flags); } -static struct netvsc_device *release_inbound_net_device( - struct hv_device *device) -{ - struct netvsc_device *net_device; - unsigned long flags; - - spin_lock_irqsave(&device->ext_lock, flags); - net_device = device->ext; - if (net_device == NULL) { - spin_unlock_irqrestore(&device->ext_lock, flags); - return NULL; - } - - spin_unlock_irqrestore(&device->ext_lock, flags); - /* Busy wait until the ref drop to 1, then set it to 0 */ - while (atomic_cmpxchg(&net_device->refcnt, 1, 0) != 1) - udelay(100); - - spin_lock_irqsave(&device->ext_lock, flags); - device->ext = NULL; - spin_unlock_irqrestore(&device->ext_lock, flags); - return net_device; -} - static int netvsc_destroy_recv_buf(struct netvsc_device *net_device) { struct nvsp_message *revoke_packet; @@ -423,8 +399,10 @@ int netvsc_device_remove(struct hv_device *device) netvsc_disconnect_vsp(net_device); - /* Stop inbound traffic ie receives and sends completions */ - net_device = release_inbound_net_device(device); + spin_lock_irqsave(&device->ext_lock, flags); + atomic_dec(&net_device->refcnt); + device->ext = NULL; + spin_unlock_irqrestore(&device->ext_lock, flags); /* * Wait until the ref cnt falls to 0. @@ -990,8 +968,6 @@ cleanup: kfree(packet); } - release_inbound_net_device(device); - kfree(net_device); } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 095/117] Staging: hv: netvsc: Leverage the spinlock to manage refcnt
Now that we have a spin lock protecting the device pointer, use it to also protect the refrence count. 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 | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/staging/hv/hyperv_net.h b/drivers/staging/hv/hyperv_net.h index 0b347c1..5c8fc31 100644 --- a/drivers/staging/hv/hyperv_net.h +++ b/drivers/staging/hv/hyperv_net.h @@ -369,7 +369,7 @@ struct nvsp_message { struct netvsc_device { struct hv_device *dev; - atomic_t refcnt; + int refcnt; atomic_t num_outstanding_sends; bool destroy; /* diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 0411332..3b234a3 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -41,7 +41,7 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device) return NULL; /* Set to 2 to allow both inbound and outbound traffic */ - atomic_set(&net_device->refcnt, 2); + net_device->refcnt = 2; net_device->destroy = false; net_device->dev = device; @@ -58,9 +58,9 @@ static struct netvsc_device *get_outbound_net_device(struct hv_device *device) spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; - if (net_device && (atomic_read(&net_device->refcnt) > 1) && + if (net_device && (net_device->refcnt > 1) && !net_device->destroy) - atomic_inc(&net_device->refcnt); + net_device->refcnt++; else net_device = NULL; spin_unlock_irqrestore(&device->ext_lock, flags); @@ -76,8 +76,8 @@ static struct netvsc_device *get_inbound_net_device(struct hv_device *device) spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; - if (net_device && atomic_read(&net_device->refcnt)) - atomic_inc(&net_device->refcnt); + if (net_device && net_device->refcnt) + net_device->refcnt++; else net_device = NULL; @@ -94,7 +94,7 @@ static void put_net_device(struct hv_device *device) net_device = device->ext; - atomic_dec(&net_device->refcnt); + net_device->refcnt--; spin_unlock_irqrestore(&device->ext_lock, flags); } @@ -385,7 +385,7 @@ int netvsc_device_remove(struct hv_device *device) spin_unlock_irqrestore(&device->ext_lock, flags); return -ENODEV; } - atomic_dec(&net_device->refcnt); + net_device->refcnt--; net_device->destroy = true; spin_unlock_irqrestore(&device->ext_lock, flags); @@ -401,7 +401,7 @@ int netvsc_device_remove(struct hv_device *device) netvsc_disconnect_vsp(net_device); spin_lock_irqsave(&device->ext_lock, flags); - atomic_dec(&net_device->refcnt); + net_device->refcnt--; device->ext = NULL; spin_unlock_irqrestore(&device->ext_lock, flags); @@ -414,7 +414,7 @@ int netvsc_device_remove(struct hv_device *device) * Since the send path is non-blocking, it is reasonable to busy * wait here. */ - while (atomic_read(&net_device->refcnt)) + while (net_device->refcnt != 0) udelay(100); /* At this point, no one should be accessing netDevice except in here */ -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 096/117] Staging: hv: netvsc: Further cleanup reference counting of netvsc_device
Further cleanup reference counting of netvsc_device. Since once the device is marked for destruction, we only allow incoming traffic to drain out outstanding sends, we can simplify reference counting. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/netvsc.c | 27 ++++++++++++++++++--------- 1 files changed, 18 insertions(+), 9 deletions(-) diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c index 4ef17d8..16a80b1 100644 --- a/drivers/staging/hv/netvsc.c +++ b/drivers/staging/hv/netvsc.c @@ -17,6 +17,7 @@ * Authors: * Haiyang Zhang <haiyangz at microsoft.com> * Hank Janssen <hjanssen at microsoft.com> + * K. Y. Srinivasan <kys at microsoft.com> */ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt @@ -40,8 +41,7 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device) if (!net_device) return NULL; - /* Set to 2 to allow both inbound and outbound traffic */ - net_device->refcnt = 2; + net_device->refcnt = 1; net_device->destroy = false; net_device->dev = device; @@ -50,7 +50,6 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device) return net_device; } -/* Get the net device object iff exists and its refcount > 1 */ static struct netvsc_device *get_outbound_net_device(struct hv_device *device) { struct netvsc_device *net_device; @@ -58,7 +57,7 @@ static struct netvsc_device *get_outbound_net_device(struct hv_device *device) spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; - if (net_device && (net_device->refcnt > 1) && + if (net_device && (net_device->refcnt) && !net_device->destroy) net_device->refcnt++; else @@ -68,7 +67,6 @@ static struct netvsc_device *get_outbound_net_device(struct hv_device *device) return net_device; } -/* Get the net device object iff exists and its refcount > 0 */ static struct netvsc_device *get_inbound_net_device(struct hv_device *device) { struct netvsc_device *net_device; @@ -76,11 +74,23 @@ static struct netvsc_device *get_inbound_net_device(struct hv_device *device) spin_lock_irqsave(&device->ext_lock, flags); net_device = device->ext; - if (net_device && net_device->refcnt) - net_device->refcnt++; - else + + if (!net_device) + goto cleanup; + + /* + * If the device is being destroyed; allow incoming + * traffic only to cleanup outstanding requests. + */ + if (net_device->destroy && + (atomic_read(&net_device->num_outstanding_sends) == 0)) { net_device = NULL; + goto cleanup; + } + net_device->refcnt++; + +cleanup: spin_unlock_irqrestore(&device->ext_lock, flags); return net_device; } @@ -400,7 +410,6 @@ int netvsc_device_remove(struct hv_device *device) netvsc_disconnect_vsp(net_device); spin_lock_irqsave(&device->ext_lock, flags); - net_device->refcnt--; device->ext = NULL; spin_unlock_irqrestore(&device->ext_lock, flags); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 097/117] Staging: hv: storvsc: Add code to handle IDE devices using the storvsc driver
Add code to handle IDE devices using the storvsc driver. The storvsc_probe() is modified so that the storvsc driver can surface all disks presented to the guest as scsi devices using generic upper level Linux scsi drivers. 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 | 62 +++++++++++++++++++++++++++++++------- 1 files changed, 51 insertions(+), 11 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 0f2fc2f..efbc603 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -61,6 +61,17 @@ struct storvsc_cmd_request { struct hv_storvsc_request request; }; +static void storvsc_get_ide_info(struct hv_device *dev, int *target, int *path) +{ + *target + dev->dev_instance.b[5] << 8 | dev->dev_instance.b[4]; + + *path + dev->dev_instance.b[3] << 24 | + dev->dev_instance.b[2] << 16 | + dev->dev_instance.b[1] << 8 | dev->dev_instance.b[0]; +} + static int storvsc_device_alloc(struct scsi_device *sdevice) { @@ -654,6 +665,14 @@ static const struct hv_vmbus_device_id id_table[] = { }; MODULE_DEVICE_TABLE(vmbus, id_table); + +static const uuid_le blk_guid = { + .b = { + 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, + 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 + } +}; + /* * storvsc_probe - Add a new device for this driver */ @@ -664,6 +683,14 @@ 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; + int path = 0; + int target = 0; + + if (!uuid_le_cmp(device->dev_type, blk_guid)) + dev_is_ide = true; + else + dev_is_ide = false; host = scsi_host_alloc(&scsi_driver, sizeof(struct hv_host_device)); @@ -699,8 +726,14 @@ static int storvsc_probe(struct hv_device *device) return -ENODEV; } - host_dev->path = device_info.path_id; - host_dev->target = device_info.target_id; + 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; + } else { + host_dev->path = device_info.path_id; + host_dev->target = device_info.target_id; + } /* max # of devices per target */ host->max_lun = STORVSC_MAX_LUNS_PER_TARGET; @@ -711,17 +744,24 @@ static int storvsc_probe(struct hv_device *device) /* Register the HBA and start the scsi bus scan */ ret = scsi_add_host(host, &device->device); - if (ret != 0) { - - storvsc_dev_remove(device); - - kmem_cache_destroy(host_dev->request_pool); - scsi_host_put(host); - return -ENODEV; - } + if (ret != 0) + goto err_out; - scsi_scan_host(host); + if (dev_is_ide) { + ret = scsi_add_device(host, 0, target, 0); + if (ret) { + scsi_remove_host(host); + goto err_out; + } + } else + scsi_scan_host(host); return ret; + +err_out: + storvsc_dev_remove(device); + kmem_cache_destroy(host_dev->request_pool); + scsi_host_put(host); + return -ENODEV; } /* The one and only one */ -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 098/117] Staging: hv: storvsc: Handle IDE devices using the storvsc driver
Now, enable handling of all IDE devices by extending the storvsc device id table to handle IDE guid. As part of this cleanup Kconfig and Hyper-V Makefile to not build the IDE driver (blkvsc). Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/Kconfig | 7 ------- drivers/staging/hv/Makefile | 2 -- drivers/staging/hv/storvsc_drv.c | 7 +++++++ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/drivers/staging/hv/Kconfig b/drivers/staging/hv/Kconfig index 5e0c9f6..26b5064 100644 --- a/drivers/staging/hv/Kconfig +++ b/drivers/staging/hv/Kconfig @@ -15,13 +15,6 @@ config HYPERV_STORAGE help Select this option to enable the Hyper-V virtual storage driver. -config HYPERV_BLOCK - tristate "Microsoft Hyper-V virtual block driver" - depends on BLOCK && SCSI && (LBDAF || 64BIT) - default HYPERV - help - Select this option to enable the Hyper-V virtual block driver. - config HYPERV_NET tristate "Microsoft Hyper-V virtual network driver" depends on NET diff --git a/drivers/staging/hv/Makefile b/drivers/staging/hv/Makefile index 3004674..bb89437 100644 --- a/drivers/staging/hv/Makefile +++ b/drivers/staging/hv/Makefile @@ -1,6 +1,5 @@ obj-$(CONFIG_HYPERV) += hv_vmbus.o hv_timesource.o obj-$(CONFIG_HYPERV_STORAGE) += hv_storvsc.o -obj-$(CONFIG_HYPERV_BLOCK) += hv_blkvsc.o obj-$(CONFIG_HYPERV_NET) += hv_netvsc.o obj-$(CONFIG_HYPERV_UTILS) += hv_utils.o obj-$(CONFIG_HYPERV_MOUSE) += hv_mouse.o @@ -9,6 +8,5 @@ hv_vmbus-y := vmbus_drv.o \ hv.o connection.o channel.o \ channel_mgmt.o ring_buffer.o hv_storvsc-y := storvsc_drv.o storvsc.o -hv_blkvsc-y := blkvsc_drv.o storvsc.o hv_netvsc-y := netvsc_drv.o netvsc.o rndis_filter.o hv_utils-y := hv_util.o hv_kvp.o diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index efbc603..5777482 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -657,6 +657,13 @@ static const struct hv_vmbus_device_id id_table[] = { } }, { + /* IDE guid */ + .guid = { + 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, + 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 + } + }, + { .guid = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 099/117] Staging: hv: storvsc: Optimize bounce buffer handling for the "write" case
Optimize bounce buffer handling for the "write" case. 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 | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 5777482..e2294d5 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -428,17 +428,17 @@ static void storvsc_commmand_completion(struct hv_storvsc_request *request) struct scsi_sense_hdr sense_hdr; struct vmscsi_request *vm_srb; + vm_srb = &request->vstor_packet.vm_srb; if (cmd_request->bounce_sgl_count) { - - /* FIXME: We can optimize on writes by just skipping this */ - copy_from_bounce_buffer(scsi_sglist(scmnd), + if (vm_srb->data_in == READ_TYPE) { + copy_from_bounce_buffer(scsi_sglist(scmnd), cmd_request->bounce_sgl, scsi_sg_count(scmnd)); - destroy_bounce_buffer(cmd_request->bounce_sgl, - cmd_request->bounce_sgl_count); + destroy_bounce_buffer(cmd_request->bounce_sgl, + cmd_request->bounce_sgl_count); + } } - vm_srb = &request->vstor_packet.vm_srb; scmnd->result = vm_srb->scsi_status; if (scmnd->result) { -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 100/117] Staging: hv: storvsc: Optimize the bounce buffer handling in the "read" case
Optimize the bounce buffer handling in the "read" case. 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 | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index e2294d5..6e4725f 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -563,12 +563,10 @@ static int storvsc_queuecommand_lck(struct scsi_cmnd *scmnd, ALIGN(scsi_bufflen(scmnd), PAGE_SIZE) >> PAGE_SHIFT; - /* - * FIXME: We can optimize on reads by just skipping - * this - */ - copy_to_bounce_buffer(sgl, cmd_request->bounce_sgl, - scsi_sg_count(scmnd)); + if (vm_srb->data_in == WRITE_TYPE) + copy_to_bounce_buffer(sgl, + cmd_request->bounce_sgl, + scsi_sg_count(scmnd)); sgl = cmd_request->bounce_sgl; sg_count = cmd_request->bounce_sgl_count; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 101/117] Staging: hv: storvsc: Include storvsc.c in storvsc_drv.c
As part of further cleanup of our storage drivers, include the content of storvsc.c into storvsc_drv.c. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/Makefile | 2 +- drivers/staging/hv/storvsc.c | 526 ------------------------------------- drivers/staging/hv/storvsc_drv.c | 527 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 528 insertions(+), 527 deletions(-) delete mode 100644 drivers/staging/hv/storvsc.c diff --git a/drivers/staging/hv/Makefile b/drivers/staging/hv/Makefile index bb89437..bd176b1 100644 --- a/drivers/staging/hv/Makefile +++ b/drivers/staging/hv/Makefile @@ -7,6 +7,6 @@ obj-$(CONFIG_HYPERV_MOUSE) += hv_mouse.o hv_vmbus-y := vmbus_drv.o \ hv.o connection.o channel.o \ channel_mgmt.o ring_buffer.o -hv_storvsc-y := storvsc_drv.o storvsc.o +hv_storvsc-y := storvsc_drv.o hv_netvsc-y := netvsc_drv.o netvsc.o rndis_filter.o hv_utils-y := hv_util.o hv_kvp.o diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c deleted file mode 100644 index 4d13044..0000000 --- a/drivers/staging/hv/storvsc.c +++ /dev/null @@ -1,526 +0,0 @@ -/* - * Copyright (c) 2009, Microsoft Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307 USA. - * - * Authors: - * Haiyang Zhang <haiyangz at microsoft.com> - * Hank Janssen <hjanssen at microsoft.com> - * K. Y. Srinivasan <kys at microsoft.com> - * - */ -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/completion.h> -#include <linux/string.h> -#include <linux/slab.h> -#include <linux/mm.h> -#include <linux/delay.h> - -#include "hyperv.h" -#include "hyperv_storage.h" - - -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->ref_count = 1; - 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) -{ - struct storvsc_device *stor_device; - unsigned long flags; - - spin_lock_irqsave(&device->ext_lock, flags); - stor_device = (struct storvsc_device *)device->ext; - if (!stor_device) - goto cleanup; - - /* - * If the device is being destroyed; allow incoming - * traffic only to cleanup outstanding requests. - */ - if (stor_device->destroy && - (atomic_read(&stor_device->num_outstanding_req) == 0)) - goto cleanup; - stor_device->ref_count++; -cleanup: - spin_unlock_irqrestore(&device->ext_lock, flags); - - return stor_device; -} - -static int storvsc_channel_init(struct hv_device *device) -{ - struct storvsc_device *stor_device; - struct hv_storvsc_request *request; - struct vstor_packet *vstor_packet; - int ret, t; - - stor_device = get_out_stor_device(device); - if (!stor_device) - return -ENODEV; - - request = &stor_device->init_request; - vstor_packet = &request->vstor_packet; - - /* - * Now, initiate the vsc/vsp initialization protocol on the open - * channel - */ - memset(request, 0, sizeof(struct hv_storvsc_request)); - init_completion(&request->wait_event); - vstor_packet->operation = VSTOR_OPERATION_BEGIN_INITIALIZATION; - vstor_packet->flags = REQUEST_COMPLETION_FLAG; - - ret = vmbus_sendpacket(device->channel, vstor_packet, - sizeof(struct vstor_packet), - (unsigned long)request, - VM_PKT_DATA_INBAND, - VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); - if (ret != 0) - goto cleanup; - - t = wait_for_completion_timeout(&request->wait_event, 5*HZ); - if (t == 0) { - ret = -ETIMEDOUT; - goto cleanup; - } - - if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || - vstor_packet->status != 0) - goto cleanup; - - - /* reuse the packet for version range supported */ - memset(vstor_packet, 0, sizeof(struct vstor_packet)); - vstor_packet->operation = VSTOR_OPERATION_QUERY_PROTOCOL_VERSION; - vstor_packet->flags = REQUEST_COMPLETION_FLAG; - - vstor_packet->version.major_minor = VMSTOR_PROTOCOL_VERSION_CURRENT; - FILL_VMSTOR_REVISION(vstor_packet->version.revision); - - ret = vmbus_sendpacket(device->channel, vstor_packet, - sizeof(struct vstor_packet), - (unsigned long)request, - VM_PKT_DATA_INBAND, - VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); - if (ret != 0) - goto cleanup; - - t = wait_for_completion_timeout(&request->wait_event, 5*HZ); - if (t == 0) { - ret = -ETIMEDOUT; - goto cleanup; - } - - if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || - vstor_packet->status != 0) - goto cleanup; - - - memset(vstor_packet, 0, sizeof(struct vstor_packet)); - vstor_packet->operation = VSTOR_OPERATION_QUERY_PROPERTIES; - vstor_packet->flags = REQUEST_COMPLETION_FLAG; - vstor_packet->storage_channel_properties.port_number - stor_device->port_number; - - ret = vmbus_sendpacket(device->channel, vstor_packet, - sizeof(struct vstor_packet), - (unsigned long)request, - VM_PKT_DATA_INBAND, - VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); - - if (ret != 0) - goto cleanup; - - t = wait_for_completion_timeout(&request->wait_event, 5*HZ); - if (t == 0) { - ret = -ETIMEDOUT; - goto cleanup; - } - - if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || - vstor_packet->status != 0) - goto cleanup; - - stor_device->path_id = vstor_packet->storage_channel_properties.path_id; - stor_device->target_id - = vstor_packet->storage_channel_properties.target_id; - - memset(vstor_packet, 0, sizeof(struct vstor_packet)); - vstor_packet->operation = VSTOR_OPERATION_END_INITIALIZATION; - vstor_packet->flags = REQUEST_COMPLETION_FLAG; - - ret = vmbus_sendpacket(device->channel, vstor_packet, - sizeof(struct vstor_packet), - (unsigned long)request, - VM_PKT_DATA_INBAND, - VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); - - if (ret != 0) - goto cleanup; - - t = wait_for_completion_timeout(&request->wait_event, 5*HZ); - if (t == 0) { - ret = -ETIMEDOUT; - goto cleanup; - } - - if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || - vstor_packet->status != 0) - goto cleanup; - - -cleanup: - put_stor_device(device); - return ret; -} - -static void storvsc_on_io_completion(struct hv_device *device, - struct vstor_packet *vstor_packet, - struct hv_storvsc_request *request) -{ - struct storvsc_device *stor_device; - struct vstor_packet *stor_pkt; - - stor_device = (struct storvsc_device *)device->ext; - - stor_pkt = &request->vstor_packet; - - - /* Copy over the status...etc */ - stor_pkt->vm_srb.scsi_status = vstor_packet->vm_srb.scsi_status; - stor_pkt->vm_srb.srb_status = vstor_packet->vm_srb.srb_status; - stor_pkt->vm_srb.sense_info_length - vstor_packet->vm_srb.sense_info_length; - - if (vstor_packet->vm_srb.scsi_status != 0 || - vstor_packet->vm_srb.srb_status != 1){ - DPRINT_WARN(STORVSC, - "cmd 0x%x scsi status 0x%x srb status 0x%x\n", - stor_pkt->vm_srb.cdb[0], - vstor_packet->vm_srb.scsi_status, - vstor_packet->vm_srb.srb_status); - } - - if ((vstor_packet->vm_srb.scsi_status & 0xFF) == 0x02) { - /* CHECK_CONDITION */ - if (vstor_packet->vm_srb.srb_status & 0x80) { - /* autosense data available */ - DPRINT_WARN(STORVSC, "storvsc pkt %p autosense data " - "valid - len %d\n", request, - vstor_packet->vm_srb.sense_info_length); - - memcpy(request->sense_buffer, - vstor_packet->vm_srb.sense_data, - vstor_packet->vm_srb.sense_info_length); - - } - } - - stor_pkt->vm_srb.data_transfer_length - vstor_packet->vm_srb.data_transfer_length; - - request->on_io_completion(request); - - if (atomic_dec_and_test(&stor_device->num_outstanding_req) && - stor_device->drain_notify) - wake_up(&stor_device->waiting_to_drain); - - -} - -static void storvsc_on_receive(struct hv_device *device, - struct vstor_packet *vstor_packet, - struct hv_storvsc_request *request) -{ - switch (vstor_packet->operation) { - case VSTOR_OPERATION_COMPLETE_IO: - storvsc_on_io_completion(device, vstor_packet, request); - break; - case VSTOR_OPERATION_REMOVE_DEVICE: - - default: - break; - } -} - -static void storvsc_on_channel_callback(void *context) -{ - struct hv_device *device = (struct hv_device *)context; - struct storvsc_device *stor_device; - u32 bytes_recvd; - u64 request_id; - unsigned char packet[ALIGN(sizeof(struct vstor_packet), 8)]; - struct hv_storvsc_request *request; - int ret; - - - stor_device = get_in_stor_device(device); - if (!stor_device) - return; - - do { - ret = vmbus_recvpacket(device->channel, packet, - ALIGN(sizeof(struct vstor_packet), 8), - &bytes_recvd, &request_id); - if (ret == 0 && bytes_recvd > 0) { - - request = (struct hv_storvsc_request *) - (unsigned long)request_id; - - if ((request == &stor_device->init_request) || - (request == &stor_device->reset_request)) { - - memcpy(&request->vstor_packet, packet, - sizeof(struct vstor_packet)); - complete(&request->wait_event); - } else { - storvsc_on_receive(device, - (struct vstor_packet *)packet, - request); - } - } else { - break; - } - } while (1); - - put_stor_device(device); - return; -} - -static int storvsc_connect_to_vsp(struct hv_device *device, u32 ring_size) -{ - struct vmstorage_channel_properties props; - int ret; - - memset(&props, 0, sizeof(struct vmstorage_channel_properties)); - - /* Open the channel */ - ret = vmbus_open(device->channel, - ring_size, - ring_size, - (void *)&props, - sizeof(struct vmstorage_channel_properties), - storvsc_on_channel_callback, device); - - if (ret != 0) - return ret; - - ret = storvsc_channel_init(device); - - return ret; -} - -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; -} - -int storvsc_dev_remove(struct hv_device *device) -{ - struct storvsc_device *stor_device; - unsigned long flags; - - /* - * Since we currently hold a reference on the stor - * device, it is safe to dereference the ext - * pointer. - */ - stor_device = (struct storvsc_device *)device->ext; - - stor_device->destroy = true; - - /* - * At this point, all outbound traffic should be disable. We - * only allow inbound traffic (responses) to proceed so that - * outstanding requests can be completed. - */ - - storvsc_wait_to_drain(stor_device); - - spin_lock_irqsave(&device->ext_lock, flags); - stor_device->ref_count = 0; - device->ext = NULL; - spin_unlock_irqrestore(&device->ext_lock, flags); - - /* Close the channel */ - vmbus_close(device->channel); - - kfree(stor_device); - return 0; -} - -int storvsc_do_io(struct hv_device *device, - struct hv_storvsc_request *request) -{ - struct storvsc_device *stor_device; - struct vstor_packet *vstor_packet; - int ret = 0; - - vstor_packet = &request->vstor_packet; - stor_device = get_out_stor_device(device); - - if (!stor_device) - return -ENODEV; - - - request->device = device; - - - vstor_packet->flags |= REQUEST_COMPLETION_FLAG; - - vstor_packet->vm_srb.length = sizeof(struct vmscsi_request); - - - vstor_packet->vm_srb.sense_info_length = SENSE_BUFFER_SIZE; - - - vstor_packet->vm_srb.data_transfer_length - request->data_buffer.len; - - vstor_packet->operation = VSTOR_OPERATION_EXECUTE_SRB; - - if (request->data_buffer.len) { - ret = vmbus_sendpacket_multipagebuffer(device->channel, - &request->data_buffer, - vstor_packet, - sizeof(struct vstor_packet), - (unsigned long)request); - } else { - ret = vmbus_sendpacket(device->channel, vstor_packet, - sizeof(struct vstor_packet), - (unsigned long)request, - VM_PKT_DATA_INBAND, - VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); - } - - if (ret != 0) - return ret; - - atomic_inc(&stor_device->num_outstanding_req); - - put_stor_device(device); - return ret; -} - -/* - * The channel properties uniquely specify how the device is to be - * presented to the guest. Map this information for use by the block - * driver. For Linux guests on Hyper-V, we emulate a scsi HBA in the guest - * (storvsc_drv) and so scsi devices in the guest are handled by - * native upper level Linux drivers. Consequently, Hyper-V - * block driver, while being a generic block driver, presently does not - * deal with anything other than devices that would need to be presented - * to the guest as an IDE disk. - * - * This function maps the channel properties as embedded in the input - * parameter device_info onto information necessary to register the - * corresponding block device. - * - * Currently, there is no way to stop the emulation of the block device - * on the host side. And so, to prevent the native IDE drivers in Linux - * from taking over these devices (to be managedby Hyper-V block - * driver), we will take over if need be the major of the IDE controllers. - * - */ - -int storvsc_get_major_info(struct storvsc_device_info *device_info, - struct storvsc_major_info *major_info) -{ - static bool ide0_registered; - static bool ide1_registered; - - /* - * For now we only support IDE disks. - */ - major_info->devname = "ide"; - major_info->diskname = "hd"; - - if (device_info->path_id) { - major_info->major = 22; - if (!ide1_registered) { - major_info->do_register = true; - ide1_registered = true; - } else - major_info->do_register = false; - - if (device_info->target_id) - major_info->index = 3; - else - major_info->index = 2; - - return 0; - } else { - major_info->major = 3; - if (!ide0_registered) { - major_info->do_register = true; - ide0_registered = true; - } else - major_info->do_register = false; - - if (device_info->target_id) - major_info->index = 1; - else - major_info->index = 0; - - return 0; - } - - return -ENODEV; -} diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 6e4725f..3ce43a3 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -36,6 +36,533 @@ #include "hyperv.h" #include "hyperv_storage.h" + +/* + * Copyright (c) 2009, Microsoft Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place - Suite 330, Boston, MA 02111-1307 USA. + * + * Authors: + * Haiyang Zhang <haiyangz at microsoft.com> + * Hank Janssen <hjanssen at microsoft.com> + * K. Y. Srinivasan <kys at microsoft.com> + * + */ +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/completion.h> +#include <linux/string.h> +#include <linux/slab.h> +#include <linux/mm.h> +#include <linux/delay.h> + +#include "hyperv.h" +#include "hyperv_storage.h" + + +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->ref_count = 1; + 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) +{ + struct storvsc_device *stor_device; + unsigned long flags; + + spin_lock_irqsave(&device->ext_lock, flags); + stor_device = (struct storvsc_device *)device->ext; + if (!stor_device) + goto cleanup; + + /* + * If the device is being destroyed; allow incoming + * traffic only to cleanup outstanding requests. + */ + if (stor_device->destroy && + (atomic_read(&stor_device->num_outstanding_req) == 0)) + goto cleanup; + stor_device->ref_count++; +cleanup: + spin_unlock_irqrestore(&device->ext_lock, flags); + + return stor_device; +} + +static int storvsc_channel_init(struct hv_device *device) +{ + struct storvsc_device *stor_device; + struct hv_storvsc_request *request; + struct vstor_packet *vstor_packet; + int ret, t; + + stor_device = get_out_stor_device(device); + if (!stor_device) + return -ENODEV; + + request = &stor_device->init_request; + vstor_packet = &request->vstor_packet; + + /* + * Now, initiate the vsc/vsp initialization protocol on the open + * channel + */ + memset(request, 0, sizeof(struct hv_storvsc_request)); + init_completion(&request->wait_event); + vstor_packet->operation = VSTOR_OPERATION_BEGIN_INITIALIZATION; + vstor_packet->flags = REQUEST_COMPLETION_FLAG; + + ret = vmbus_sendpacket(device->channel, vstor_packet, + sizeof(struct vstor_packet), + (unsigned long)request, + VM_PKT_DATA_INBAND, + VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); + if (ret != 0) + goto cleanup; + + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); + if (t == 0) { + ret = -ETIMEDOUT; + goto cleanup; + } + + if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || + vstor_packet->status != 0) + goto cleanup; + + + /* reuse the packet for version range supported */ + memset(vstor_packet, 0, sizeof(struct vstor_packet)); + vstor_packet->operation = VSTOR_OPERATION_QUERY_PROTOCOL_VERSION; + vstor_packet->flags = REQUEST_COMPLETION_FLAG; + + vstor_packet->version.major_minor = VMSTOR_PROTOCOL_VERSION_CURRENT; + FILL_VMSTOR_REVISION(vstor_packet->version.revision); + + ret = vmbus_sendpacket(device->channel, vstor_packet, + sizeof(struct vstor_packet), + (unsigned long)request, + VM_PKT_DATA_INBAND, + VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); + if (ret != 0) + goto cleanup; + + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); + if (t == 0) { + ret = -ETIMEDOUT; + goto cleanup; + } + + if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || + vstor_packet->status != 0) + goto cleanup; + + + memset(vstor_packet, 0, sizeof(struct vstor_packet)); + vstor_packet->operation = VSTOR_OPERATION_QUERY_PROPERTIES; + vstor_packet->flags = REQUEST_COMPLETION_FLAG; + vstor_packet->storage_channel_properties.port_number + stor_device->port_number; + + ret = vmbus_sendpacket(device->channel, vstor_packet, + sizeof(struct vstor_packet), + (unsigned long)request, + VM_PKT_DATA_INBAND, + VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); + + if (ret != 0) + goto cleanup; + + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); + if (t == 0) { + ret = -ETIMEDOUT; + goto cleanup; + } + + if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || + vstor_packet->status != 0) + goto cleanup; + + stor_device->path_id = vstor_packet->storage_channel_properties.path_id; + stor_device->target_id + = vstor_packet->storage_channel_properties.target_id; + + memset(vstor_packet, 0, sizeof(struct vstor_packet)); + vstor_packet->operation = VSTOR_OPERATION_END_INITIALIZATION; + vstor_packet->flags = REQUEST_COMPLETION_FLAG; + + ret = vmbus_sendpacket(device->channel, vstor_packet, + sizeof(struct vstor_packet), + (unsigned long)request, + VM_PKT_DATA_INBAND, + VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); + + if (ret != 0) + goto cleanup; + + t = wait_for_completion_timeout(&request->wait_event, 5*HZ); + if (t == 0) { + ret = -ETIMEDOUT; + goto cleanup; + } + + if (vstor_packet->operation != VSTOR_OPERATION_COMPLETE_IO || + vstor_packet->status != 0) + goto cleanup; + + +cleanup: + put_stor_device(device); + return ret; +} + +static void storvsc_on_io_completion(struct hv_device *device, + struct vstor_packet *vstor_packet, + struct hv_storvsc_request *request) +{ + struct storvsc_device *stor_device; + struct vstor_packet *stor_pkt; + + stor_device = (struct storvsc_device *)device->ext; + + stor_pkt = &request->vstor_packet; + + + /* Copy over the status...etc */ + stor_pkt->vm_srb.scsi_status = vstor_packet->vm_srb.scsi_status; + stor_pkt->vm_srb.srb_status = vstor_packet->vm_srb.srb_status; + stor_pkt->vm_srb.sense_info_length + vstor_packet->vm_srb.sense_info_length; + + if (vstor_packet->vm_srb.scsi_status != 0 || + vstor_packet->vm_srb.srb_status != 1){ + DPRINT_WARN(STORVSC, + "cmd 0x%x scsi status 0x%x srb status 0x%x\n", + stor_pkt->vm_srb.cdb[0], + vstor_packet->vm_srb.scsi_status, + vstor_packet->vm_srb.srb_status); + } + + if ((vstor_packet->vm_srb.scsi_status & 0xFF) == 0x02) { + /* CHECK_CONDITION */ + if (vstor_packet->vm_srb.srb_status & 0x80) { + /* autosense data available */ + DPRINT_WARN(STORVSC, "storvsc pkt %p autosense data " + "valid - len %d\n", request, + vstor_packet->vm_srb.sense_info_length); + + memcpy(request->sense_buffer, + vstor_packet->vm_srb.sense_data, + vstor_packet->vm_srb.sense_info_length); + + } + } + + stor_pkt->vm_srb.data_transfer_length + vstor_packet->vm_srb.data_transfer_length; + + request->on_io_completion(request); + + if (atomic_dec_and_test(&stor_device->num_outstanding_req) && + stor_device->drain_notify) + wake_up(&stor_device->waiting_to_drain); + + +} + +static void storvsc_on_receive(struct hv_device *device, + struct vstor_packet *vstor_packet, + struct hv_storvsc_request *request) +{ + switch (vstor_packet->operation) { + case VSTOR_OPERATION_COMPLETE_IO: + storvsc_on_io_completion(device, vstor_packet, request); + break; + case VSTOR_OPERATION_REMOVE_DEVICE: + + default: + break; + } +} + +static void storvsc_on_channel_callback(void *context) +{ + struct hv_device *device = (struct hv_device *)context; + struct storvsc_device *stor_device; + u32 bytes_recvd; + u64 request_id; + unsigned char packet[ALIGN(sizeof(struct vstor_packet), 8)]; + struct hv_storvsc_request *request; + int ret; + + + stor_device = get_in_stor_device(device); + if (!stor_device) + return; + + do { + ret = vmbus_recvpacket(device->channel, packet, + ALIGN(sizeof(struct vstor_packet), 8), + &bytes_recvd, &request_id); + if (ret == 0 && bytes_recvd > 0) { + + request = (struct hv_storvsc_request *) + (unsigned long)request_id; + + if ((request == &stor_device->init_request) || + (request == &stor_device->reset_request)) { + + memcpy(&request->vstor_packet, packet, + sizeof(struct vstor_packet)); + complete(&request->wait_event); + } else { + storvsc_on_receive(device, + (struct vstor_packet *)packet, + request); + } + } else { + break; + } + } while (1); + + put_stor_device(device); + return; +} + +static int storvsc_connect_to_vsp(struct hv_device *device, u32 ring_size) +{ + struct vmstorage_channel_properties props; + int ret; + + memset(&props, 0, sizeof(struct vmstorage_channel_properties)); + + /* Open the channel */ + ret = vmbus_open(device->channel, + ring_size, + ring_size, + (void *)&props, + sizeof(struct vmstorage_channel_properties), + storvsc_on_channel_callback, device); + + if (ret != 0) + return ret; + + ret = storvsc_channel_init(device); + + return ret; +} + +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; +} + +int storvsc_dev_remove(struct hv_device *device) +{ + struct storvsc_device *stor_device; + unsigned long flags; + + /* + * Since we currently hold a reference on the stor + * device, it is safe to dereference the ext + * pointer. + */ + stor_device = (struct storvsc_device *)device->ext; + + stor_device->destroy = true; + + /* + * At this point, all outbound traffic should be disable. We + * only allow inbound traffic (responses) to proceed so that + * outstanding requests can be completed. + */ + + storvsc_wait_to_drain(stor_device); + + spin_lock_irqsave(&device->ext_lock, flags); + stor_device->ref_count = 0; + device->ext = NULL; + spin_unlock_irqrestore(&device->ext_lock, flags); + + /* Close the channel */ + vmbus_close(device->channel); + + kfree(stor_device); + return 0; +} + +int storvsc_do_io(struct hv_device *device, + struct hv_storvsc_request *request) +{ + struct storvsc_device *stor_device; + struct vstor_packet *vstor_packet; + int ret = 0; + + vstor_packet = &request->vstor_packet; + stor_device = get_out_stor_device(device); + + if (!stor_device) + return -ENODEV; + + + request->device = device; + + + vstor_packet->flags |= REQUEST_COMPLETION_FLAG; + + vstor_packet->vm_srb.length = sizeof(struct vmscsi_request); + + + vstor_packet->vm_srb.sense_info_length = SENSE_BUFFER_SIZE; + + + vstor_packet->vm_srb.data_transfer_length + request->data_buffer.len; + + vstor_packet->operation = VSTOR_OPERATION_EXECUTE_SRB; + + if (request->data_buffer.len) { + ret = vmbus_sendpacket_multipagebuffer(device->channel, + &request->data_buffer, + vstor_packet, + sizeof(struct vstor_packet), + (unsigned long)request); + } else { + ret = vmbus_sendpacket(device->channel, vstor_packet, + sizeof(struct vstor_packet), + (unsigned long)request, + VM_PKT_DATA_INBAND, + VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); + } + + if (ret != 0) + return ret; + + atomic_inc(&stor_device->num_outstanding_req); + + put_stor_device(device); + return ret; +} + +/* + * The channel properties uniquely specify how the device is to be + * presented to the guest. Map this information for use by the block + * driver. For Linux guests on Hyper-V, we emulate a scsi HBA in the guest + * (storvsc_drv) and so scsi devices in the guest are handled by + * native upper level Linux drivers. Consequently, Hyper-V + * block driver, while being a generic block driver, presently does not + * deal with anything other than devices that would need to be presented + * to the guest as an IDE disk. + * + * This function maps the channel properties as embedded in the input + * parameter device_info onto information necessary to register the + * corresponding block device. + * + * Currently, there is no way to stop the emulation of the block device + * on the host side. And so, to prevent the native IDE drivers in Linux + * from taking over these devices (to be managedby Hyper-V block + * driver), we will take over if need be the major of the IDE controllers. + * + */ + +int storvsc_get_major_info(struct storvsc_device_info *device_info, + struct storvsc_major_info *major_info) +{ + static bool ide0_registered; + static bool ide1_registered; + + /* + * For now we only support IDE disks. + */ + major_info->devname = "ide"; + major_info->diskname = "hd"; + + if (device_info->path_id) { + major_info->major = 22; + if (!ide1_registered) { + major_info->do_register = true; + ide1_registered = true; + } else + major_info->do_register = false; + + if (device_info->target_id) + major_info->index = 3; + else + major_info->index = 2; + + return 0; + } else { + major_info->major = 3; + if (!ide0_registered) { + major_info->do_register = true; + ide0_registered = true; + } else + major_info->do_register = false; + + if (device_info->target_id) + major_info->index = 1; + else + major_info->index = 0; + + return 0; + } + + return -ENODEV; +} static int storvsc_ringbuffer_size = STORVSC_RING_BUFFER_SIZE; module_param(storvsc_ringbuffer_size, int, S_IRUGO); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 102/117] Staging: hv: storvsc: Cleanup storvsc_drv.c after adding the contents of storvsc.c
Cleanup storvsc_drv.c after adding the contents of storvsc.c. 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 | 107 +++----------------------------------- 1 files changed, 7 insertions(+), 100 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 3ce43a3..5c06f5d 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -19,11 +19,17 @@ * Hank Janssen <hjanssen at microsoft.com> * K. Y. Srinivasan <kys at microsoft.com> */ + +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/completion.h> +#include <linux/string.h> +#include <linux/mm.h> +#include <linux/delay.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/device.h> -#include <linux/blkdev.h> #include <scsi/scsi.h> #include <scsi/scsi_cmnd.h> #include <scsi/scsi_host.h> @@ -37,40 +43,6 @@ #include "hyperv_storage.h" -/* - * Copyright (c) 2009, Microsoft Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307 USA. - * - * Authors: - * Haiyang Zhang <haiyangz at microsoft.com> - * Hank Janssen <hjanssen at microsoft.com> - * K. Y. Srinivasan <kys at microsoft.com> - * - */ -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/completion.h> -#include <linux/string.h> -#include <linux/slab.h> -#include <linux/mm.h> -#include <linux/delay.h> - -#include "hyperv.h" -#include "hyperv_storage.h" - - static inline struct storvsc_device *alloc_stor_device(struct hv_device *device) { struct storvsc_device *stor_device; @@ -498,71 +470,6 @@ int storvsc_do_io(struct hv_device *device, return ret; } -/* - * The channel properties uniquely specify how the device is to be - * presented to the guest. Map this information for use by the block - * driver. For Linux guests on Hyper-V, we emulate a scsi HBA in the guest - * (storvsc_drv) and so scsi devices in the guest are handled by - * native upper level Linux drivers. Consequently, Hyper-V - * block driver, while being a generic block driver, presently does not - * deal with anything other than devices that would need to be presented - * to the guest as an IDE disk. - * - * This function maps the channel properties as embedded in the input - * parameter device_info onto information necessary to register the - * corresponding block device. - * - * Currently, there is no way to stop the emulation of the block device - * on the host side. And so, to prevent the native IDE drivers in Linux - * from taking over these devices (to be managedby Hyper-V block - * driver), we will take over if need be the major of the IDE controllers. - * - */ - -int storvsc_get_major_info(struct storvsc_device_info *device_info, - struct storvsc_major_info *major_info) -{ - static bool ide0_registered; - static bool ide1_registered; - - /* - * For now we only support IDE disks. - */ - major_info->devname = "ide"; - major_info->diskname = "hd"; - - if (device_info->path_id) { - major_info->major = 22; - if (!ide1_registered) { - major_info->do_register = true; - ide1_registered = true; - } else - major_info->do_register = false; - - if (device_info->target_id) - major_info->index = 3; - else - major_info->index = 2; - - return 0; - } else { - major_info->major = 3; - if (!ide0_registered) { - major_info->do_register = true; - ide0_registered = true; - } else - major_info->do_register = false; - - if (device_info->target_id) - major_info->index = 1; - else - major_info->index = 0; - - return 0; - } - - return -ENODEV; -} static int storvsc_ringbuffer_size = STORVSC_RING_BUFFER_SIZE; module_param(storvsc_ringbuffer_size, int, S_IRUGO); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 104/117] Staging: hv: storvsc: Cleanup storvsc_drv.c after adding the contents of hyperv_storage.h
Cleanup storvsc_drv.c after adding the contents of hyperv_storage.h. 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 | 30 +----------------------------- 1 files changed, 1 insertions(+), 29 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 463b428..02f9c1e 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -22,6 +22,7 @@ #include <linux/kernel.h> #include <linux/sched.h> +#include <linux/wait.h> #include <linux/completion.h> #include <linux/string.h> #include <linux/mm.h> @@ -42,32 +43,6 @@ #include "hyperv.h" -/* - * - * Copyright (c) 2011, Microsoft Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307 USA. - * - * Authors: - * Haiyang Zhang <haiyangz at microsoft.com> - * Hank Janssen <hjanssen at microsoft.com> - * K. Y. Srinivasan <kys at microsoft.com> - * - */ - - - /* vstorage.w revision number. This is used in the case of a version match, */ /* to alert the user that structure sizes may be mismatched even though the */ /* protocol versions match. */ @@ -240,9 +215,6 @@ struct vstor_packet { #define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG) -#include <linux/kernel.h> -#include <linux/wait.h> -#include "hyperv.h" /* Defines */ #define STORVSC_RING_BUFFER_SIZE (20*PAGE_SIZE) -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 105/117] Staging: hv: storvsc: Make some non static functions, static functions
Make some non static functions, static 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 | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 02f9c1e..a1e8d6a 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -645,7 +645,7 @@ static int storvsc_connect_to_vsp(struct hv_device *device, u32 ring_size) return ret; } -int storvsc_dev_add(struct hv_device *device, +static int storvsc_dev_add(struct hv_device *device, void *additional_info) { struct storvsc_device *stor_device; @@ -680,7 +680,7 @@ int storvsc_dev_add(struct hv_device *device, return ret; } -int storvsc_dev_remove(struct hv_device *device) +static int storvsc_dev_remove(struct hv_device *device) { struct storvsc_device *stor_device; unsigned long flags; @@ -714,7 +714,7 @@ int storvsc_dev_remove(struct hv_device *device) return 0; } -int storvsc_do_io(struct hv_device *device, +static int storvsc_do_io(struct hv_device *device, struct hv_storvsc_request *request) { struct storvsc_device *stor_device; -- 1.7.4.1
Fix a typo in a function name. 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 | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 9c2bb56..2d7bb41 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -1163,9 +1163,9 @@ static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd) /* - * storvsc_commmand_completion - Command completion processing + * storvsc_command_completion - Command completion processing */ -static void storvsc_commmand_completion(struct hv_storvsc_request *request) +static void storvsc_command_completion(struct hv_storvsc_request *request) { struct storvsc_cmd_request *cmd_request (struct storvsc_cmd_request *)request->context; @@ -1273,7 +1273,7 @@ static int storvsc_queuecommand_lck(struct scsi_cmnd *scmnd, break; } - request->on_io_completion = storvsc_commmand_completion; + request->on_io_completion = storvsc_command_completion; request->context = cmd_request;/* scmnd; */ vm_srb->port_number = host_dev->port; -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 108/117] Staging: hv: storvsc: In case of scsi errors offline the device
When we do get fatal errors from the host, offline the device since the host has already tried all possible recovery actions. 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 | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 2d7bb41..8756cdf 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -1187,7 +1187,15 @@ static void storvsc_command_completion(struct hv_storvsc_request *request) } } - scmnd->result = vm_srb->scsi_status; + /* + * If there is an error; offline the device since all + * error recovery strategies would have already been + * deployed on the host side. + */ + if (vm_srb->srb_status == 0x4) + scmnd->result = DID_TARGET_FAILURE << 16; + else + scmnd->result = vm_srb->scsi_status; if (scmnd->result) { if (scsi_normalize_sense(scmnd->sense_buffer, -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 109/117] Staging: hv: storvsc: No need to copy from bounce buffer in case of a failure
No need to copy from bounce buffer in case of a failure; cleanup the code accordingly. 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 | 12 ++---------- 1 files changed, 2 insertions(+), 10 deletions(-) diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 8756cdf..ba27b51 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -1348,17 +1348,9 @@ retry_request: if (ret == -EAGAIN) { /* no more space */ - if (cmd_request->bounce_sgl_count) { - /* - * FIXME: We can optimize on writes by just skipping - * this - */ - copy_from_bounce_buffer(scsi_sglist(scmnd), - cmd_request->bounce_sgl, - scsi_sg_count(scmnd)); + if (cmd_request->bounce_sgl_count) destroy_bounce_buffer(cmd_request->bounce_sgl, - cmd_request->bounce_sgl_count); - } + cmd_request->bounce_sgl_count); kmem_cache_free(host_dev->request_pool, cmd_request); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 110/117] Staging: hv: vmbus: Change the signature of vmbus_child_driver_register()
Change the signature of vmbus_child_driver_register() to conform to the Linux driver model. 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 | 2 +- drivers/staging/hv/hv_util.c | 2 +- drivers/staging/hv/hyperv.h | 2 +- drivers/staging/hv/netvsc_drv.c | 2 +- drivers/staging/hv/storvsc_drv.c | 2 +- drivers/staging/hv/vmbus_drv.c | 3 ++- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index 6e1c4ce..0dfaa6a 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -948,7 +948,7 @@ static int __init mousevsc_init(void) drv->driver.name = driver_name; /* The driver belongs to vmbus */ - vmbus_child_driver_register(&drv->driver); + vmbus_child_driver_register(drv); return 0; } diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c index 26693dd..a4320dc 100644 --- a/drivers/staging/hv/hv_util.c +++ b/drivers/staging/hv/hv_util.c @@ -300,7 +300,7 @@ static int __init init_hyperv_utils(void) util_drv.driver.name = driver_name; - return vmbus_child_driver_register(&util_drv.driver); + return vmbus_child_driver_register(&util_drv); } static void exit_hyperv_utils(void) diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h index 82ba110..a760e89 100644 --- a/drivers/staging/hv/hyperv.h +++ b/drivers/staging/hv/hyperv.h @@ -846,7 +846,7 @@ static inline struct hv_driver *drv_to_hv_drv(struct device_driver *d) /* Vmbus interface */ -int vmbus_child_driver_register(struct device_driver *drv); +int vmbus_child_driver_register(struct hv_driver *hv_drv); void vmbus_child_driver_unregister(struct device_driver *drv); /* diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 94c5abc..a204ea7 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -452,7 +452,7 @@ static int __init netvsc_drv_init(void) drv->driver.name = driver_name; /* The driver belongs to vmbus */ - ret = vmbus_child_driver_register(&drv->driver); + ret = vmbus_child_driver_register(drv); return ret; } diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index ba27b51..149ef00 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -1552,7 +1552,7 @@ static int __init storvsc_drv_init(void) /* The driver belongs to vmbus */ - ret = vmbus_child_driver_register(&drv->driver); + ret = vmbus_child_driver_register(drv); return ret; } diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 29c1712..bd5a5a7 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -525,9 +525,10 @@ static int vmbus_bus_init(int irq) * * Mainly used by Hyper-V drivers. */ -int vmbus_child_driver_register(struct device_driver *drv) +int vmbus_child_driver_register(struct hv_driver *hv_drv) { int ret; + struct device_driver *drv = &hv_drv->driver; pr_info("child driver registering - name %s\n", drv->name); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 111/117] Staging: hv: vmbus: Change the signature of vmbus_child_driver_unregister()
Change the signature of vmbus_child_driver_unregister() to conform to the Linux driver model. 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 | 2 +- drivers/staging/hv/hv_util.c | 2 +- drivers/staging/hv/hyperv.h | 2 +- drivers/staging/hv/netvsc_drv.c | 2 +- drivers/staging/hv/storvsc_drv.c | 2 +- drivers/staging/hv/vmbus_drv.c | 7 ++++--- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index 0dfaa6a..28bd2c5 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -936,7 +936,7 @@ static struct hv_driver mousevsc_drv = { static void mousevsc_drv_exit(void) { - vmbus_child_driver_unregister(&mousevsc_drv.driver); + vmbus_child_driver_unregister(&mousevsc_drv); } static int __init mousevsc_init(void) diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c index a4320dc..4712d22 100644 --- a/drivers/staging/hv/hv_util.c +++ b/drivers/staging/hv/hv_util.c @@ -332,7 +332,7 @@ static void exit_hyperv_utils(void) kfree(shut_txf_buf); kfree(time_txf_buf); kfree(hbeat_txf_buf); - vmbus_child_driver_unregister(&util_drv.driver); + vmbus_child_driver_unregister(&util_drv); } module_init(init_hyperv_utils); diff --git a/drivers/staging/hv/hyperv.h b/drivers/staging/hv/hyperv.h index a760e89..9b9ff71 100644 --- a/drivers/staging/hv/hyperv.h +++ b/drivers/staging/hv/hyperv.h @@ -847,7 +847,7 @@ static inline struct hv_driver *drv_to_hv_drv(struct device_driver *d) /* Vmbus interface */ int vmbus_child_driver_register(struct hv_driver *hv_drv); -void vmbus_child_driver_unregister(struct device_driver *drv); +void vmbus_child_driver_unregister(struct hv_driver *hv_drv); /* * Common header for Hyper-V ICs diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index a204ea7..474c5f0 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -438,7 +438,7 @@ static struct hv_driver netvsc_drv = { static void __exit netvsc_drv_exit(void) { - vmbus_child_driver_unregister(&netvsc_drv.driver); + vmbus_child_driver_unregister(&netvsc_drv); } diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 149ef00..6fbe146 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -1559,7 +1559,7 @@ static int __init storvsc_drv_init(void) static void __exit storvsc_drv_exit(void) { - vmbus_child_driver_unregister(&storvsc_drv.driver); + vmbus_child_driver_unregister(&storvsc_drv); } MODULE_LICENSE("GPL"); diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index bd5a5a7..f271e8d 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -553,11 +553,12 @@ EXPORT_SYMBOL(vmbus_child_driver_register); * * Mainly used by Hyper-V drivers. */ -void vmbus_child_driver_unregister(struct device_driver *drv) +void vmbus_child_driver_unregister(struct hv_driver *hv_drv) { - pr_info("child driver unregistering - name %s\n", drv->name); + pr_info("child driver unregistering - name %s\n", + hv_drv->driver.name); - driver_unregister(drv); + driver_unregister(&hv_drv->driver); } EXPORT_SYMBOL(vmbus_child_driver_unregister); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 112/117] Staging: hv: util: Forcefully shutdown when shutdown is requested
When the host requests a "shutdown", make sure we shutdown! 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 | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c index 4712d22..070e61f 100644 --- a/drivers/staging/hv/hv_util.c +++ b/drivers/staging/hv/hv_util.c @@ -91,7 +91,7 @@ static void shutdown_onchannelcallback(void *context) } if (execute_shutdown == true) - orderly_poweroff(false); + orderly_poweroff(true); } /* -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 113/117] Staging: hv: util: Adjust guest time in a process context
The current code was adjusting guest time in interrupt context; do this in process context since we may have to initiate cross-processor interrupts as part of setting time. 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 | 30 ++++++++++++++++++++++++++++-- 1 files changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c index 070e61f..d3fb017 100644 --- a/drivers/staging/hv/hv_util.c +++ b/drivers/staging/hv/hv_util.c @@ -109,6 +109,24 @@ static inline void do_adj_guesttime(u64 hosttime) } /* + * Set the host time in a process context. + */ + +struct adj_time_work { + struct work_struct work; + u64 host_time; +}; + +static void hv_set_host_time(struct work_struct *work) +{ + struct adj_time_work *wrk; + + wrk = container_of(work, struct adj_time_work, work); + do_adj_guesttime(wrk->host_time); + kfree(wrk); +} + +/* * Synchronize time with host after reboot, restore, etc. * * ICTIMESYNCFLAG_SYNC flag bit indicates reboot, restore events of the VM. @@ -121,16 +139,24 @@ static inline void do_adj_guesttime(u64 hosttime) */ static inline void adj_guesttime(u64 hosttime, u8 flags) { + struct adj_time_work *wrk; static s32 scnt = 50; + wrk = kmalloc(sizeof(struct adj_time_work), GFP_ATOMIC); + if (wrk == NULL) + return; + + wrk->host_time = hosttime; if ((flags & ICTIMESYNCFLAG_SYNC) != 0) { - do_adj_guesttime(hosttime); + INIT_WORK(&wrk->work, hv_set_host_time); + schedule_work(&wrk->work); return; } if ((flags & ICTIMESYNCFLAG_SAMPLE) != 0 && scnt > 0) { scnt--; - do_adj_guesttime(hosttime); + INIT_WORK(&wrk->work, hv_set_host_time); + schedule_work(&wrk->work); } } -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 114/117] Staging: hv: vmbus: Check before invoking the channel callback
When we close a channel, we set the corresponding callback function to NULL. Check before invoking the channel callback. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> --- drivers/staging/hv/connection.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/connection.c b/drivers/staging/hv/connection.c index a88ad70..7a3ec75 100644 --- a/drivers/staging/hv/connection.c +++ b/drivers/staging/hv/connection.c @@ -222,7 +222,7 @@ static void process_chn_event(u32 relid) */ channel = relid2channel(relid); - if (channel) { + if (channel && (channel->onchannel_callback != NULL)) { channel->onchannel_callback(channel->channel_callback_context); } else { pr_err("channel not found for relid - %u\n", relid); -- 1.7.4.1
K. Y. Srinivasan
2011-Jul-15 17:47 UTC
[PATCH 116/117] Staging: hv: vmbus: Add code to display modalias attribute
Add code to display modalias attribute. 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 | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index f271e8d..433be51 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -113,6 +113,14 @@ static ssize_t vmbus_show_device_attr(struct device *dev, if (!strcmp(dev_attr->attr.name, "class_id")) { return sprintf(buf, "%s\n", hv_get_devtype_name(&device_info.chn_type)); + } else if (!strcmp(dev_attr->attr.name, "modalias")) { + int i; + char alias_name[((sizeof(struct hv_vmbus_device_id) + 1)) * 2]; + + for (i = 0; i < (sizeof(struct hv_vmbus_device_id) * 2); i += 2) + sprintf(&alias_name[i], "%02x", + hv_dev->dev_type.b[i/2]); + return sprintf("vmbus:%s\n", alias_name); } else if (!strcmp(dev_attr->attr.name, "state")) { return sprintf(buf, "%d\n", device_info.chn_state); } else if (!strcmp(dev_attr->attr.name, "id")) { @@ -167,6 +175,7 @@ static struct device_attribute vmbus_device_attrs[] = { __ATTR(id, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(state, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(class_id, S_IRUGO, vmbus_show_device_attr, NULL), + __ATTR(modalias, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(monitor_id, S_IRUGO, vmbus_show_device_attr, NULL), __ATTR(server_monitor_pending, S_IRUGO, vmbus_show_device_attr, NULL), -- 1.7.4.1
Michael Witten
2011-Jul-15 18:25 UTC
Large Patch Series in Email (was Re: [PATCH 0000/0117] Staging: hv: Driver cleanup)
On Fri, 15 Jul 2011 10:47:04 -0700, K. Y. Srinivasan wrote:> Subject: [PATCH 0000/0117] Staging: hv: Driver cleanupNow, admittedly, I'm a nobody. However, when I had a patch series of considerable size, I noted that Documentation/SubmittingPatches has stated the following since 2006: If you cannot condense your patch set into a smaller set of patches, then only post say 15 or so at a time and wait for review and integration. ... Do not send more than 15 patches at once to the vger mailing lists!!! and, accordingly, I went to the trouble of setting up a GitHub account to host a repo from which I could issue *one* single PULL request email; I get a little miffed every time my inbox gets blasted with hundreds of patches when others don't do similarly. Surely Microsoft can host a public repo for you (and anybody else, for that matter). Sincerely, Michael Witten
KY Srinivasan
2011-Jul-15 18:50 UTC
Large Patch Series in Email (was Re: [PATCH 0000/0117] Staging: hv: Driver cleanup)
> -----Original Message----- > From: Michael Witten [mailto:mfwitten at gmail.com] > Sent: Friday, July 15, 2011 2:26 PM > To: KY Srinivasan > Cc: Greg Kroah-Hartman; linux-kernel at vger.kernel.org; > devel at linuxdriverproject.org; virtualization at lists.osdl.org > Subject: Large Patch Series in Email (was Re: [PATCH 0000/0117] Staging: hv: > Driver cleanup) > > On Fri, 15 Jul 2011 10:47:04 -0700, K. Y. Srinivasan wrote: > > > Subject: [PATCH 0000/0117] Staging: hv: Driver cleanup > > Now, admittedly, I'm a nobody.You and I have something in common! I am sorry for flooding your mailbox. In the past Greg had indicated that he could handle large patch-sets and so, I sent out this large patch-set. Perhaps I should not have included the vger mailing list. Regards, K. Y
Christoph Hellwig
2011-Jul-16 02:02 UTC
[PATCH 020/117] Staging: hv: vmbus: Support the notion of id tables in vmbus_match()
On Fri, Jul 15, 2011 at 10:46:08AM -0700, K. Y. Srinivasan wrote:> +static bool is_not_null_guid(const __u8 *guid) > +{ > + int i; > + > + for (i = 0; i < (sizeof(struct hv_vmbus_device_id)); i++) > + if (guid[i] != 0) > + return true; > + return false; > +}would be nice to add uuid_{le,be}_is_nil helpers to uuid.h. I also think simply using a memcpy might be more efficient than the hand-rolled loop.
Christoph Hellwig
2011-Jul-16 02:05 UTC
[PATCH 098/117] Staging: hv: storvsc: Handle IDE devices using the storvsc driver
On Fri, Jul 15, 2011 at 10:47:26AM -0700, K. Y. Srinivasan wrote:> Now, enable handling of all IDE devices by extending the storvsc > device id table to handle IDE guid. As part of this cleanup Kconfig > and Hyper-V Makefile to not build the IDE driver (blkvsc).I think this should be part of the previous patch.
Dan Carpenter
2011-Jul-16 10:33 UTC
[PATCH 088/117] Staging: hv: netvsc: Inline the code for free_net_device()
On Fri, Jul 15, 2011 at 10:47:16AM -0700, K. Y. Srinivasan wrote:> -static void free_net_device(struct netvsc_device *device) > -{ > - WARN_ON(atomic_read(&device->refcnt) != 0); > - device->dev->ext = NULL;device->dev->ext points to device. We set it NULL here to prevent a use after free bug. What prevents that in the new code?> - kfree(device); > -}regards, dan carpenter
KY Srinivasan
2011-Jul-16 13:09 UTC
[PATCH 088/117] Staging: hv: netvsc: Inline the code for free_net_device()
> -----Original Message----- > From: Dan Carpenter [mailto:error27 at gmail.com] > Sent: Saturday, July 16, 2011 6:34 AM > 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 088/117] Staging: hv: netvsc: Inline the code for > free_net_device() > > On Fri, Jul 15, 2011 at 10:47:16AM -0700, K. Y. Srinivasan wrote: > > -static void free_net_device(struct netvsc_device *device) > > -{ > > - WARN_ON(atomic_read(&device->refcnt) != 0); > > - device->dev->ext = NULL; > > device->dev->ext points to device. We set it NULL here to prevent > a use after free bug. What prevents that in the new code? > > > - kfree(device); > > -}This function is called in only two places; a) during adding a device when we have a failure (netvsc_device_add()) and during device removal (netvsc_device_remove()). I have handled both these cases. In any event when we are freeing the containing object via kfree(), if somebody is accessing the ext field via freed object, we have bigger problems to deal with. Regards, K. Y> > regards, > dan carpenter > >
Greg KH
2011-Aug-23 22:45 UTC
[PATCH 006/117] Staging: hv: blkvsc: Use the newly introduced vmbus ID in the blockvsc driver
On Fri, Jul 15, 2011 at 10:45:54AM -0700, K. Y. Srinivasan wrote:> Use the newly introduced vmbus ID in the blockvsc driver. > > Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> > Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> > --- > drivers/staging/hv/blkvsc_drv.c | 16 ++++++++++++++++ > 1 files changed, 16 insertions(+), 0 deletions(-) > > diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c > index 018b293..38117d96 100644 > --- a/drivers/staging/hv/blkvsc_drv.c > +++ b/drivers/staging/hv/blkvsc_drv.c > @@ -802,10 +802,26 @@ static void blkvsc_request(struct request_queue *queue) > } > } > > +static const struct hv_vmbus_device_id id_table[] = { > + { > + /* IDE guid */ > + .guid = { > + 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, > + 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 > + } > + }, > + { > + .guid = { > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 > + }No, just zero terminate the list with a simple { } entry, not the whole thing spelled for every individual byte. Same goes for the other patches that added this id_table, please fix those. thanks, greg k-h
Greg KH
2011-Aug-23 22:46 UTC
[PATCH 012/117] Staging: hv: blkvsc: Add the MODULE_DEVICE_TABLE() line
On Fri, Jul 15, 2011 at 10:46:00AM -0700, K. Y. Srinivasan wrote:> Add the MODULE_DEVICE_TABLE() line in blkvsc_drv.c. > > Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> > Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> > --- > drivers/staging/hv/blkvsc_drv.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c > index 38117d96..8e4c206 100644 > --- a/drivers/staging/hv/blkvsc_drv.c > +++ b/drivers/staging/hv/blkvsc_drv.c > @@ -818,6 +818,7 @@ static const struct hv_vmbus_device_id id_table[] = { > }, > }; > > +MODULE_DEVICE_TABLE(vmbus, id_table);Please merge this back into the patch that added the id_table to the driver, having it separate like this is just ridiculous. greg k-h
Greg KH
2011-Aug-23 22:46 UTC
[PATCH 011/117] Staging: hv: util: Use the newly introduced vmbus ID in util driver
On Fri, Jul 15, 2011 at 10:45:59AM -0700, K. Y. Srinivasan wrote:> Use the newly introduced vmbus ID in util driver. > > 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 | 38 ++++++++++++++++++++++++++++++++++++++ > 1 files changed, 38 insertions(+), 0 deletions(-) > > diff --git a/drivers/staging/hv/hv_util.c b/drivers/staging/hv/hv_util.c > index e72bfe0..35540f5 100644 > --- a/drivers/staging/hv/hv_util.c > +++ b/drivers/staging/hv/hv_util.c > @@ -226,9 +226,47 @@ static int util_remove(struct hv_device *dev) > return 0; > } > > +static const struct hv_vmbus_device_id id_table[] = { > + { > + /* Shutdown guid */ > + .guid = { > + 0x31, 0x60, 0x0B, 0X0E, 0x13, 0x52, 0x34, 0x49, > + 0x81, 0x8B, 0x38, 0XD9, 0x0C, 0xED, 0x39, 0xDB > + } > + }, > + { > + /* Time synch guid */ > + .guid = { > + 0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49, > + 0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf > + } > + }, > + { > + /* Heartbeat guid */ > + .guid = { > + 0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e, > + 0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d > + } > + }, > + { > + /* KVP guid */ > + .guid = { > + 0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d, > + 0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6 > + } > + }, > + { > + .guid = { > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 > + } > + }, > +}; > +Merge this into the previous patch please. greg k-h
Greg KH
2011-Aug-23 22:47 UTC
[PATCH 017/117] Staging: hv: mouse: Do not auto-load the mouse driver
On Fri, Jul 15, 2011 at 10:46:05AM -0700, K. Y. Srinivasan wrote:> The mouse driver is not functional and so, prevent auto-loading > of this driver. Earlier we added the MODULE_DEVICE_TABLE() line > to verify that the appropriate module alias was generated. > > 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 | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) > > diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c > index d6441d6..95986fb 100644 > --- a/drivers/staging/hv/hv_mouse.c > +++ b/drivers/staging/hv/hv_mouse.c > @@ -931,7 +931,10 @@ static const struct hv_vmbus_device_id id_table[] = { > }, > }; > > -MODULE_DEVICE_TABLE(vmbus, id_table); > +/* > + * The mouse driver is not functional; do not auto-load it. > + */ > +/* MODULE_DEVICE_TABLE(vmbus, id_table); */Then you should not have caused it to be autoloaded on the previous patch. Please merge this with the previous patch, which would be merged with the previous patch to that, smushing them all into a smaller patch series. greg k-h
Greg KH
2011-Aug-23 22:52 UTC
[PATCH 027/117] Staging: hv: blkvsc: Get rid of the dev_type guid from blkvsc_drv.c
On Fri, Jul 15, 2011 at 10:46:15AM -0700, K. Y. Srinivasan wrote:> Get rid of the dev_type guid from blkvsc_drv.c as it is no longer used. > > Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> > Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> > --- > drivers/staging/hv/blkvsc_drv.c | 9 --------- > 1 files changed, 0 insertions(+), 9 deletions(-) > > diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c > index 8e4c206..cb61598 100644 > --- a/drivers/staging/hv/blkvsc_drv.c > +++ b/drivers/staging/hv/blkvsc_drv.c > @@ -111,14 +111,6 @@ struct block_device_context { > > static const char *drv_name = "blkvsc"; > > -/* {32412632-86cb-44a2-9b5c-50d1417354f5} */ > -static const uuid_le dev_type = { > - .b = { > - 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, > - 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 > - } > -};Could be merged with the previous patch that added the guid in the other format, right? greg k-h
Greg KH
2011-Aug-23 22:56 UTC
[PATCH 031/117] Staging: hv: netvsc: Get rid of the driver name initialization in netvsc.c
On Fri, Jul 15, 2011 at 10:46:19AM -0700, K. Y. Srinivasan wrote:> Now, get rid of the driver name initialization in int netvsc_initialize(). > > 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 ----- > 1 files changed, 0 insertions(+), 5 deletions(-) > > diff --git a/drivers/staging/hv/netvsc.c b/drivers/staging/hv/netvsc.c > index 6f4541b..d085018 100644 > --- a/drivers/staging/hv/netvsc.c > +++ b/drivers/staging/hv/netvsc.c > @@ -32,9 +32,6 @@ > #include "hyperv_net.h" > > > -/* Globals */ > -static const char *driver_name = "netvsc"; > - > static struct netvsc_device *alloc_net_device(struct hv_device *device) > { > struct netvsc_device *net_device; > @@ -999,7 +996,5 @@ cleanup: > int netvsc_initialize(struct hv_driver *drv) > { > > - drv->name = driver_name; > -Please merge this with the previous patch. greg k-h
Greg KH
2011-Aug-23 23:01 UTC
[PATCH 035/117] Staging: hv: vmbus: Introduce a function to map the dev_type guid to a name
On Fri, Jul 15, 2011 at 10:46:23AM -0700, K. Y. Srinivasan wrote:> To support "human readable" sysfs attribute, introduce a function to map the > dev_type guid to a string. > > 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 | 36 ++++++++++++++++++++++++++++++++++++ > drivers/staging/hv/hyperv.h | 2 +- > 2 files changed, 37 insertions(+), 1 deletions(-) > > diff --git a/drivers/staging/hv/channel_mgmt.c b/drivers/staging/hv/channel_mgmt.c > index 11beb41..926bc87 100644 > --- a/drivers/staging/hv/channel_mgmt.c > +++ b/drivers/staging/hv/channel_mgmt.c > @@ -112,6 +112,42 @@ static const uuid_le > > }; > > +static const char *blk_dev_type = "hv_block"; > +static const char *net_dev_type = "hv_net"; > +static const char *scsi_dev_type = "hv_scsi"; > +static const char *mouse_dev_type = "hv_mouse"; > +static const char *util_dev_type = "hv_util";Ick, no. There should never be any type of "central" knowledge of the different driver names or types like this. It should all be self-contained within the individual drivers. You will note that no other bus type has this type of thing, which should have been a hint that you should not have done this... greg k-h
Greg KH
2011-Aug-23 23:04 UTC
[PATCH 040/117] Staging: hv: vmbus: Cleanup error handling in hv_init()
On Fri, Jul 15, 2011 at 10:46:28AM -0700, K. Y. Srinivasan wrote:> Use standard Linux error codes. > > Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> > Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> > --- > drivers/staging/hv/hv.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/staging/hv/hv.c b/drivers/staging/hv/hv.c > index 2f94880..e733173 100644 > --- a/drivers/staging/hv/hv.c > +++ b/drivers/staging/hv/hv.c > @@ -225,8 +225,8 @@ cleanup: > > vfree(virtaddr); > } > - ret = -1; > - return ret; > + > + return -ENOTSUPP;The ret variable is no longer needed here, so just remove it entirely in this patch. greg k-h
On Fri, Jul 15, 2011 at 10:47:04AM -0700, K. Y. Srinivasan wrote:> Further cleanup of the hv drivers. Back in June I had sent two patch > sets to address these issues. I have addressed the comments I got from > the community on my earlier patches here: > > 1) Implement code for autoloading the vmbus drivers without using PCI or DMI > signatures. I have implemented this based on Greg's feedback on my earlier > implementation. > > 2) Cleanup error handling across the board and use standard Linux error codes. > > 3) General cleanup > > 4) Some bug fixes. > > 5) Cleanup the reference counting mess for both stor and net devices. > > 6) Handle all block devices using the storvsc driver. I have modified > the implementation here based on Christoph's feedback on my earlier > implementation. > > 7) Accomodate some host side scsi emulation bugs. > > 8) In case of scsi errors off-line the device.Care to respin this patch series based on my comments? thanks, greg k-h