Re: [PATCH 14/16 v4] ibmvscsi: driver enablement for CMO

2008-07-24 Thread Benjamin Herrenschmidt
On Wed, 2008-07-23 at 13:35 -0500, Robert Jennings wrote:
 From: Robert Jennings [EMAIL PROTECTED]
 
 Enable the driver to function in a Cooperative Memory Overcommitment (CMO)
 environment.
 
 The following changes are made to enable the driver for CMO:
  * DMA mapping errors will not result in error messages if entitlement has
been exceeded and resources were not available.
  * The driver has a get_desired_dma function defined to function
in a CMO environment. It will indicate how much IO memory it would like
to function.
 
 Signed-off-by: Robert Jennings [EMAIL PROTECTED]
 Acked by: Brian King [EMAIL PROTECTED]
 
 ---
 We would like to take this patch through linuxppc-dev with the full
 change set for this feature.  We are copying linux-scsi for review and ack.

James, if you are ok with this patch, can you Ack it ? I'll merge it via
the powerpc tree along with all its dependencies.

Thanks in advance !

Cheers,
Ben.

 ---
  drivers/scsi/ibmvscsi/ibmvscsi.c |   45 
 +--
  drivers/scsi/ibmvscsi/ibmvscsi.h |2 ++
  2 files changed, 40 insertions(+), 7 deletions(-)
 
 Index: b/drivers/scsi/ibmvscsi/ibmvscsi.c
 ===
 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c
 +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
 @@ -72,6 +72,7 @@
  #include linux/delay.h
  #include asm/firmware.h
  #include asm/vio.h
 +#include asm/firmware.h
  #include scsi/scsi.h
  #include scsi/scsi_cmnd.h
  #include scsi/scsi_host.h
 @@ -426,8 +427,10 @@ static int map_sg_data(struct scsi_cmnd 
  SG_ALL * sizeof(struct 
 srp_direct_buf),
  evt_struct-ext_list_token, 0);
   if (!evt_struct-ext_list) {
 - sdev_printk(KERN_ERR, cmd-device,
 - Can't allocate memory for indirect 
 table\n);
 + if (!firmware_has_feature(FW_FEATURE_CMO))
 + sdev_printk(KERN_ERR, cmd-device,
 + Can't allocate memory 
 + for indirect table\n);
   return 0;
   }
   }
 @@ -743,7 +746,9 @@ static int ibmvscsi_queuecommand(struct 
   srp_cmd-lun = ((u64) lun)  48;
  
   if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata-dev)) {
 - sdev_printk(KERN_ERR, cmnd-device, couldn't convert cmd to 
 srp_cmd\n);
 + if (!firmware_has_feature(FW_FEATURE_CMO))
 + sdev_printk(KERN_ERR, cmnd-device,
 + couldn't convert cmd to srp_cmd\n);
   free_event_struct(hostdata-pool, evt_struct);
   return SCSI_MLQUEUE_HOST_BUSY;
   }
 @@ -855,7 +860,10 @@ static void send_mad_adapter_info(struct
   DMA_BIDIRECTIONAL);
  
   if (dma_mapping_error(req-buffer)) {
 - dev_err(hostdata-dev, Unable to map request_buffer for 
 adapter_info!\n);
 + if (!firmware_has_feature(FW_FEATURE_CMO))
 + dev_err(hostdata-dev,
 + Unable to map request_buffer for 
 + adapter_info!\n);
   free_event_struct(hostdata-pool, evt_struct);
   return;
   }
 @@ -1400,7 +1408,9 @@ static int ibmvscsi_do_host_config(struc
   DMA_BIDIRECTIONAL);
  
   if (dma_mapping_error(host_config-buffer)) {
 - dev_err(hostdata-dev, dma_mapping error getting host 
 config\n);
 + if (!firmware_has_feature(FW_FEATURE_CMO))
 + dev_err(hostdata-dev,
 + dma_mapping error getting host config\n);
   free_event_struct(hostdata-pool, evt_struct);
   return -1;
   }
 @@ -1604,7 +1614,7 @@ static struct scsi_host_template driver_
   .eh_host_reset_handler = ibmvscsi_eh_host_reset_handler,
   .slave_configure = ibmvscsi_slave_configure,
   .change_queue_depth = ibmvscsi_change_queue_depth,
 - .cmd_per_lun = 16,
 + .cmd_per_lun = IBMVSCSI_CMDS_PER_LUN_DEFAULT,
   .can_queue = IBMVSCSI_MAX_REQUESTS_DEFAULT,
   .this_id = -1,
   .sg_tablesize = SG_ALL,
 @@ -1613,6 +1623,26 @@ static struct scsi_host_template driver_
  };
  
  /**
 + * ibmvscsi_get_desired_dma - Calculate IO memory desired by the driver
 + *
 + * @vdev: struct vio_dev for the device whose desired IO mem is to be 
 returned
 + *
 + * Return value:
 + *   Number of bytes of IO data the driver will need to perform well.
 + */
 +static unsigned long ibmvscsi_get_desired_dma(struct vio_dev *vdev)
 +{
 + /* iu_storage data allocated in initialize_event_pool */
 + unsigned long desired_io = max_requests * sizeof(union viosrp_iu);
 +
 + /* add io space for sg data */
 + desired_io += 

[PATCH 14/16 v4] ibmvscsi: driver enablement for CMO

2008-07-23 Thread Robert Jennings
From: Robert Jennings [EMAIL PROTECTED]

Enable the driver to function in a Cooperative Memory Overcommitment (CMO)
environment.

The following changes are made to enable the driver for CMO:
 * DMA mapping errors will not result in error messages if entitlement has
   been exceeded and resources were not available.
 * The driver has a get_desired_dma function defined to function
   in a CMO environment. It will indicate how much IO memory it would like
   to function.

Signed-off-by: Robert Jennings [EMAIL PROTECTED]
Acked by: Brian King [EMAIL PROTECTED]

---
We would like to take this patch through linuxppc-dev with the full
change set for this feature.  We are copying linux-scsi for review and ack.

---
 drivers/scsi/ibmvscsi/ibmvscsi.c |   45 +--
 drivers/scsi/ibmvscsi/ibmvscsi.h |2 ++
 2 files changed, 40 insertions(+), 7 deletions(-)

Index: b/drivers/scsi/ibmvscsi/ibmvscsi.c
===
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -72,6 +72,7 @@
 #include linux/delay.h
 #include asm/firmware.h
 #include asm/vio.h
+#include asm/firmware.h
 #include scsi/scsi.h
 #include scsi/scsi_cmnd.h
 #include scsi/scsi_host.h
@@ -426,8 +427,10 @@ static int map_sg_data(struct scsi_cmnd 
   SG_ALL * sizeof(struct 
srp_direct_buf),
   evt_struct-ext_list_token, 0);
if (!evt_struct-ext_list) {
-   sdev_printk(KERN_ERR, cmd-device,
-   Can't allocate memory for indirect 
table\n);
+   if (!firmware_has_feature(FW_FEATURE_CMO))
+   sdev_printk(KERN_ERR, cmd-device,
+   Can't allocate memory 
+   for indirect table\n);
return 0;
}
}
@@ -743,7 +746,9 @@ static int ibmvscsi_queuecommand(struct 
srp_cmd-lun = ((u64) lun)  48;
 
if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata-dev)) {
-   sdev_printk(KERN_ERR, cmnd-device, couldn't convert cmd to 
srp_cmd\n);
+   if (!firmware_has_feature(FW_FEATURE_CMO))
+   sdev_printk(KERN_ERR, cmnd-device,
+   couldn't convert cmd to srp_cmd\n);
free_event_struct(hostdata-pool, evt_struct);
return SCSI_MLQUEUE_HOST_BUSY;
}
@@ -855,7 +860,10 @@ static void send_mad_adapter_info(struct
DMA_BIDIRECTIONAL);
 
if (dma_mapping_error(req-buffer)) {
-   dev_err(hostdata-dev, Unable to map request_buffer for 
adapter_info!\n);
+   if (!firmware_has_feature(FW_FEATURE_CMO))
+   dev_err(hostdata-dev,
+   Unable to map request_buffer for 
+   adapter_info!\n);
free_event_struct(hostdata-pool, evt_struct);
return;
}
@@ -1400,7 +1408,9 @@ static int ibmvscsi_do_host_config(struc
DMA_BIDIRECTIONAL);
 
if (dma_mapping_error(host_config-buffer)) {
-   dev_err(hostdata-dev, dma_mapping error getting host 
config\n);
+   if (!firmware_has_feature(FW_FEATURE_CMO))
+   dev_err(hostdata-dev,
+   dma_mapping error getting host config\n);
free_event_struct(hostdata-pool, evt_struct);
return -1;
}
@@ -1604,7 +1614,7 @@ static struct scsi_host_template driver_
.eh_host_reset_handler = ibmvscsi_eh_host_reset_handler,
.slave_configure = ibmvscsi_slave_configure,
.change_queue_depth = ibmvscsi_change_queue_depth,
-   .cmd_per_lun = 16,
+   .cmd_per_lun = IBMVSCSI_CMDS_PER_LUN_DEFAULT,
.can_queue = IBMVSCSI_MAX_REQUESTS_DEFAULT,
.this_id = -1,
.sg_tablesize = SG_ALL,
@@ -1613,6 +1623,26 @@ static struct scsi_host_template driver_
 };
 
 /**
+ * ibmvscsi_get_desired_dma - Calculate IO memory desired by the driver
+ *
+ * @vdev: struct vio_dev for the device whose desired IO mem is to be returned
+ *
+ * Return value:
+ * Number of bytes of IO data the driver will need to perform well.
+ */
+static unsigned long ibmvscsi_get_desired_dma(struct vio_dev *vdev)
+{
+   /* iu_storage data allocated in initialize_event_pool */
+   unsigned long desired_io = max_requests * sizeof(union viosrp_iu);
+
+   /* add io space for sg data */
+   desired_io += (IBMVSCSI_MAX_SECTORS_DEFAULT *
+IBMVSCSI_CMDS_PER_LUN_DEFAULT);
+
+   return desired_io;
+}
+
+/**
  * Called by bus code for each adapter
  */
 static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id