[PATCH v4 01/16] staging: unisys: Move channel creation up the stack

Benjamin Romer benjamin.romer at unisys.com
Mon Jun 1 17:00:26 UTC 2015


From: Don Zickus <dzickus at redhat.com>

Instead of creating a channel struct to temporarily hold the channel
info and passing it through multiple functions until the device is
created, just create the channel from the start.

This allows us to remove the channel_info struct.

I noticed 'chan_info.addr_type' was not being used, so I just deleted it.

Signed-off-by: Don Zickus <dzickus at redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer at unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c    | 88 +++++++---------------
 drivers/staging/unisys/visorbus/visorbus_private.h | 16 +---
 drivers/staging/unisys/visorbus/visorchipset.c     | 54 ++++++++-----
 3 files changed, 63 insertions(+), 95 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index a898896..49a34bb 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -1010,11 +1010,9 @@ EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts);
 static int
 create_visor_device(struct visorbus_devdata *devdata,
 		    struct visorchipset_device_info *dev_info,
-		    struct visorchipset_channel_info chan_info,
 		    u64 partition_handle)
 {
 	int rc = -1;
-	struct visorchannel *visorchannel = NULL;
 	struct visor_device *dev = NULL;
 	bool gotten = false, registered1 = false, registered2 = false;
 	u32 chipset_bus_no = dev_info->bus_no;
@@ -1022,16 +1020,6 @@ create_visor_device(struct visorbus_devdata *devdata,
 
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, chipset_dev_no, chipset_bus_no,
 			 POSTCODE_SEVERITY_INFO);
-	/* prepare chan_hdr (abstraction to read/write channel memory) */
-	visorchannel = visorchannel_create(chan_info.channel_addr,
-					   chan_info.n_channel_bytes,
-					   GFP_KERNEL,
-					   chan_info.channel_type_uuid);
-	if (!visorchannel) {
-		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, chipset_dev_no,
-				 DIAG_SEVERITY_ERR);
-		goto away;
-	}
 	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
 	if (!dev) {
 		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, chipset_dev_no,
@@ -1040,9 +1028,8 @@ create_visor_device(struct visorbus_devdata *devdata,
 	}
 
 	memset(dev, 0, sizeof(struct visor_device));
-	dev->visorchannel = visorchannel;
-	dev->channel_type_guid = chan_info.channel_type_uuid;
-	dev->channel_bytes = chan_info.n_channel_bytes;
+	dev->visorchannel = dev_info->visorchannel;
+	dev->channel_type_guid = dev_info->channel_type_guid;
 	dev->chipset_bus_no = chipset_bus_no;
 	dev->chipset_dev_no = chipset_dev_no;
 	dev->device.parent = &devdata->dev;
@@ -1114,8 +1101,6 @@ away:
 			unregister_devmajorminor_attributes(dev);
 		if (gotten)
 			put_device(&dev->device);
-		if (visorchannel)
-			visorchannel_destroy(visorchannel);
 		kfree(dev);
 	} else {
 		total_devices_created++;
@@ -1134,7 +1119,7 @@ remove_visor_device(struct visor_device *dev)
 }
 
 static struct visor_device *
-find_visor_device_by_channel(u64 channel_physaddr)
+find_visor_device_by_channel(struct visorchannel *channel)
 {
 	struct list_head *listentry, *listtmp;
 
@@ -1142,8 +1127,7 @@ find_visor_device_by_channel(u64 channel_physaddr)
 		struct visor_device *dev = list_entry(listentry,
 						      struct visor_device,
 						      list_all);
-		if (visorchannel_get_physaddr(dev->visorchannel) ==
-		    channel_physaddr)
+		if (dev->visorchannel == channel)
 			return dev;
 	}
 	return NULL;
@@ -1363,41 +1347,23 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 		goto away;
 	}
 	devdata->devno = id;
-	if ((bus_info->chan_info.channel_addr > 0) &&
-	    (bus_info->chan_info.n_channel_bytes > 0)) {
-		u64 channel_addr = bus_info->chan_info.channel_addr;
-		unsigned long n_channel_bytes =
-				(unsigned long)
-				bus_info->chan_info.n_channel_bytes;
-		uuid_le channel_type_guid =
-				bus_info->chan_info.channel_type_uuid;
-
-		devdata->chan = visorchannel_create(channel_addr,
-						    n_channel_bytes,
-						    GFP_KERNEL,
-						    channel_type_guid);
-		if (!devdata->chan) {
-			POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, channel_addr,
-					 POSTCODE_SEVERITY_ERR);
-		} else {
-			if (bus_info->flags.server) {
-				init_vbus_channel(devdata->chan);
-			} else {
-				if (get_vbus_header_info(devdata->chan,
-							 &devdata->
-							 vbus_hdr_info) >= 0) {
-					devdata->vbus_valid = true;
-					write_vbus_chp_info(devdata->chan,
-							    &devdata->
-							    vbus_hdr_info,
-							    &chipset_driverinfo
-							    );
-					write_vbus_bus_info(devdata->chan,
-							    &devdata->
-								vbus_hdr_info,
-							&clientbus_driverinfo);
-				}
-			}
+	devdata->chan = bus_info->visorchannel;
+	if (bus_info->flags.server) {
+		init_vbus_channel(devdata->chan);
+	} else {
+		if (get_vbus_header_info(devdata->chan,
+					 &devdata->
+					 vbus_hdr_info) >= 0) {
+			devdata->vbus_valid = true;
+			write_vbus_chp_info(devdata->chan,
+					    &devdata->
+					    vbus_hdr_info,
+					    &chipset_driverinfo
+					    );
+			write_vbus_bus_info(devdata->chan,
+					    &devdata->
+						vbus_hdr_info,
+					&clientbus_driverinfo);
 		}
 	}
 	bus_count++;
@@ -1468,7 +1434,7 @@ remove_all_visor_devices(void)
 }
 
 static bool entered_testing_mode;
-static struct visorchipset_channel_info test_channel_infos[MAXDEVICETEST];
+static struct visorchannel *test_channel_infos[MAXDEVICETEST];
 static unsigned long test_bus_nos[MAXDEVICETEST];
 static unsigned long test_dev_nos[MAXDEVICETEST];
 
@@ -1538,7 +1504,7 @@ chipset_device_create(struct visorchipset_device_info *dev_info)
 	if (visorbus_devicetest)
 		if (total_devices_created < MAXDEVICETEST) {
 			test_channel_infos[total_devices_created] =
-			    dev_info->chan_info;
+			    dev_info->visorchannel;
 			test_bus_nos[total_devices_created] = bus_no;
 			test_dev_nos[total_devices_created] = dev_no;
 		}
@@ -1552,9 +1518,7 @@ away:
 		return;
 	}
 	devdata = (struct visorbus_devdata *)(bus_info.bus_driver_context);
-	rc = create_visor_device(devdata, dev_info,
-				 dev_info->chan_info,
-				 bus_info.partition_handle);
+	rc = create_visor_device(devdata, dev_info, bus_info.partition_handle);
 	POSTCODE_LINUX_4(DEVICE_CREATE_SUCCESS_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 	if (rc < 0)
@@ -1570,7 +1534,7 @@ chipset_device_destroy(struct visorchipset_device_info *dev_info)
 
 	if (entered_testing_mode)
 		return;
-	dev = find_visor_device_by_channel(dev_info->chan_info.channel_addr);
+	dev = find_visor_device_by_channel(dev_info->visorchannel);
 	if (!dev)
 		goto away;
 	rc = 0;
@@ -1650,7 +1614,7 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 	if (!notify_func)
 			goto away;
 
-	dev = find_visor_device_by_channel(dev_info->chan_info.channel_addr);
+	dev = find_visor_device_by_channel(dev_info->visorchannel);
 	if (!dev)
 			goto away;
 
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index 81e4e8c..912b6cd 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -40,17 +40,6 @@ enum visorchipset_addresstype {
 	ADDRTYPE_LOCALTEST,
 };
 
-/** Attributes for a particular Supervisor channel.
- */
-struct visorchipset_channel_info {
-	enum visorchipset_addresstype addr_type;
-	u64 channel_addr;
-	struct irq_info intr;
-	u64 n_channel_bytes;
-	uuid_le channel_type_uuid;
-	uuid_le channel_inst_uuid;
-};
-
 /** Attributes for a particular Supervisor device.
  *  Any visorchipset client can query these attributes using
  *  visorchipset_get_client_device_info() or
@@ -62,7 +51,8 @@ struct visorchipset_device_info {
 	u32 dev_no;
 	uuid_le dev_inst_uuid;
 	struct visorchipset_state state;
-	struct visorchipset_channel_info chan_info;
+	struct visorchannel *visorchannel;
+	uuid_le channel_type_guid;
 	u32 reserved1;		/* control_vm_id */
 	u64 reserved2;
 	u32 switch_no;		/* when devState.attached==1 */
@@ -82,7 +72,7 @@ struct visorchipset_bus_info {
 	struct list_head entry;
 	u32 bus_no;
 	struct visorchipset_state state;
-	struct visorchipset_channel_info chan_info;
+	struct visorchannel *visorchannel;
 	uuid_le partition_uuid;
 	u64 partition_handle;
 	u8 *name;		/* UTF8 */
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 9bbc080..3d08661 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -1197,6 +1197,7 @@ bus_create(struct controlvm_message *inmsg)
 	u32 bus_no = cmd->create_bus.bus_no;
 	int rc = CONTROLVM_RESP_SUCCESS;
 	struct visorchipset_bus_info *bus_info;
+	struct visorchannel *visorchannel;
 
 	bus_info = bus_find(&bus_info_list, bus_no);
 	if (bus_info && (bus_info->state.created == 1)) {
@@ -1218,18 +1219,22 @@ bus_create(struct controlvm_message *inmsg)
 
 	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
 
-	if (inmsg->hdr.flags.test_message == 1)
-		bus_info->chan_info.addr_type = ADDRTYPE_LOCALTEST;
-	else
-		bus_info->chan_info.addr_type = ADDRTYPE_LOCALPHYSICAL;
-
 	bus_info->flags.server = inmsg->hdr.flags.server;
-	bus_info->chan_info.channel_addr = cmd->create_bus.channel_addr;
-	bus_info->chan_info.n_channel_bytes = cmd->create_bus.channel_bytes;
-	bus_info->chan_info.channel_type_uuid =
-			cmd->create_bus.bus_data_type_uuid;
-	bus_info->chan_info.channel_inst_uuid = cmd->create_bus.bus_inst_uuid;
 
+	visorchannel = visorchannel_create(cmd->create_bus.channel_addr,
+					   cmd->create_bus.channel_bytes,
+					   GFP_KERNEL,
+					   cmd->create_bus.bus_data_type_uuid);
+
+	if (!visorchannel) {
+		POSTCODE_LINUX_3(BUS_CREATE_FAILURE_PC, bus_no,
+				 POSTCODE_SEVERITY_ERR);
+		rc = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
+		kfree(bus_info);
+		bus_info = NULL;
+		goto cleanup;
+	}
+	bus_info->visorchannel = visorchannel;
 	list_add(&bus_info->entry, &bus_info_list);
 
 	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
@@ -1285,7 +1290,8 @@ bus_configure(struct controlvm_message *inmsg,
 				 POSTCODE_SEVERITY_ERR);
 		rc = -CONTROLVM_RESP_ERROR_MESSAGE_ID_INVALID_FOR_CLIENT;
 	} else {
-		bus_info->partition_handle = cmd->configure_bus.guest_handle;
+		visorchannel_set_clientpartition(bus_info->visorchannel,
+				cmd->configure_bus.guest_handle);
 		bus_info->partition_uuid = parser_id_get(parser_ctx);
 		parser_param_start(parser_ctx, PARSERSTRING_NAME);
 		bus_info->name = parser_string_get(parser_ctx);
@@ -1306,6 +1312,7 @@ my_device_create(struct controlvm_message *inmsg)
 	u32 dev_no = cmd->create_device.dev_no;
 	struct visorchipset_device_info *dev_info;
 	struct visorchipset_bus_info *bus_info;
+	struct visorchannel *visorchannel;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
 	dev_info = device_find(&dev_info_list, bus_no, dev_no);
@@ -1343,21 +1350,28 @@ my_device_create(struct controlvm_message *inmsg)
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
-	if (inmsg->hdr.flags.test_message == 1)
-		dev_info->chan_info.addr_type = ADDRTYPE_LOCALTEST;
-	else
-		dev_info->chan_info.addr_type = ADDRTYPE_LOCALPHYSICAL;
-	dev_info->chan_info.channel_addr = cmd->create_device.channel_addr;
-	dev_info->chan_info.n_channel_bytes = cmd->create_device.channel_bytes;
-	dev_info->chan_info.channel_type_uuid =
-			cmd->create_device.data_type_uuid;
+	visorchannel = visorchannel_create(cmd->create_device.channel_addr,
+					   cmd->create_device.channel_bytes,
+					   GFP_KERNEL,
+					   cmd->create_device.data_type_uuid);
+
+	if (!visorchannel) {
+		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
+				 POSTCODE_SEVERITY_ERR);
+		rc = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
+		kfree(dev_info);
+		dev_info = NULL;
+		goto cleanup;
+	}
+	dev_info->visorchannel = visorchannel;
+	dev_info->channel_type_guid = cmd->create_device.data_type_uuid;
 	list_add(&dev_info->entry, &dev_info_list);
 	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 cleanup:
 	/* get the bus and devNo for DiagPool channel */
 	if (dev_info &&
-	    is_diagpool_channel(dev_info->chan_info.channel_type_uuid)) {
+	    is_diagpool_channel(cmd->create_device.data_type_uuid)) {
 		g_diagpool_bus_no = bus_no;
 		g_diagpool_dev_no = dev_no;
 	}
-- 
2.1.4



More information about the devel mailing list