ibmvscsi: driver enablement for CMO

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 <rcj@linux.vnet.ibm.com>
Acked by: Brian King <brking@linux.vnet.ibm.com>
Acked-by: Paul Mackerras <paulus@samba.org>
Acked-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

authored by

Robert Jennings and committed by
Benjamin Herrenschmidt
7912a0ac 1096d63d

+40 -7
+38 -7
drivers/scsi/ibmvscsi/ibmvscsi.c
··· 72 #include <linux/delay.h> 73 #include <asm/firmware.h> 74 #include <asm/vio.h> 75 #include <scsi/scsi.h> 76 #include <scsi/scsi_cmnd.h> 77 #include <scsi/scsi_host.h> ··· 427 SG_ALL * sizeof(struct srp_direct_buf), 428 &evt_struct->ext_list_token, 0); 429 if (!evt_struct->ext_list) { 430 - sdev_printk(KERN_ERR, cmd->device, 431 - "Can't allocate memory for indirect table\n"); 432 return 0; 433 } 434 } ··· 746 srp_cmd->lun = ((u64) lun) << 48; 747 748 if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata->dev)) { 749 - sdev_printk(KERN_ERR, cmnd->device, "couldn't convert cmd to srp_cmd\n"); 750 free_event_struct(&hostdata->pool, evt_struct); 751 return SCSI_MLQUEUE_HOST_BUSY; 752 } ··· 860 DMA_BIDIRECTIONAL); 861 862 if (dma_mapping_error(req->buffer)) { 863 - dev_err(hostdata->dev, "Unable to map request_buffer for adapter_info!\n"); 864 free_event_struct(&hostdata->pool, evt_struct); 865 return; 866 } ··· 1408 DMA_BIDIRECTIONAL); 1409 1410 if (dma_mapping_error(host_config->buffer)) { 1411 - dev_err(hostdata->dev, "dma_mapping error getting host config\n"); 1412 free_event_struct(&hostdata->pool, evt_struct); 1413 return -1; 1414 } ··· 1614 .eh_host_reset_handler = ibmvscsi_eh_host_reset_handler, 1615 .slave_configure = ibmvscsi_slave_configure, 1616 .change_queue_depth = ibmvscsi_change_queue_depth, 1617 - .cmd_per_lun = 16, 1618 .can_queue = IBMVSCSI_MAX_REQUESTS_DEFAULT, 1619 .this_id = -1, 1620 .sg_tablesize = SG_ALL, 1621 .use_clustering = ENABLE_CLUSTERING, 1622 .shost_attrs = ibmvscsi_attrs, 1623 }; 1624 1625 /** 1626 * Called by bus code for each adapter ··· 1671 hostdata->host = host; 1672 hostdata->dev = dev; 1673 atomic_set(&hostdata->request_limit, -1); 1674 - hostdata->host->max_sectors = 32 * 8; /* default max I/O 32 pages */ 1675 1676 rc = ibmvscsi_ops->init_crq_queue(&hostdata->queue, hostdata, max_requests); 1677 if (rc != 0 && rc != H_RESOURCE) { ··· 1765 .id_table = ibmvscsi_device_table, 1766 .probe = ibmvscsi_probe, 1767 .remove = ibmvscsi_remove, 1768 .driver = { 1769 .name = "ibmvscsi", 1770 .owner = THIS_MODULE,
··· 72 #include <linux/delay.h> 73 #include <asm/firmware.h> 74 #include <asm/vio.h> 75 + #include <asm/firmware.h> 76 #include <scsi/scsi.h> 77 #include <scsi/scsi_cmnd.h> 78 #include <scsi/scsi_host.h> ··· 426 SG_ALL * sizeof(struct srp_direct_buf), 427 &evt_struct->ext_list_token, 0); 428 if (!evt_struct->ext_list) { 429 + if (!firmware_has_feature(FW_FEATURE_CMO)) 430 + sdev_printk(KERN_ERR, cmd->device, 431 + "Can't allocate memory " 432 + "for indirect table\n"); 433 return 0; 434 } 435 } ··· 743 srp_cmd->lun = ((u64) lun) << 48; 744 745 if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata->dev)) { 746 + if (!firmware_has_feature(FW_FEATURE_CMO)) 747 + sdev_printk(KERN_ERR, cmnd->device, 748 + "couldn't convert cmd to srp_cmd\n"); 749 free_event_struct(&hostdata->pool, evt_struct); 750 return SCSI_MLQUEUE_HOST_BUSY; 751 } ··· 855 DMA_BIDIRECTIONAL); 856 857 if (dma_mapping_error(req->buffer)) { 858 + if (!firmware_has_feature(FW_FEATURE_CMO)) 859 + dev_err(hostdata->dev, 860 + "Unable to map request_buffer for " 861 + "adapter_info!\n"); 862 free_event_struct(&hostdata->pool, evt_struct); 863 return; 864 } ··· 1400 DMA_BIDIRECTIONAL); 1401 1402 if (dma_mapping_error(host_config->buffer)) { 1403 + if (!firmware_has_feature(FW_FEATURE_CMO)) 1404 + dev_err(hostdata->dev, 1405 + "dma_mapping error getting host config\n"); 1406 free_event_struct(&hostdata->pool, evt_struct); 1407 return -1; 1408 } ··· 1604 .eh_host_reset_handler = ibmvscsi_eh_host_reset_handler, 1605 .slave_configure = ibmvscsi_slave_configure, 1606 .change_queue_depth = ibmvscsi_change_queue_depth, 1607 + .cmd_per_lun = IBMVSCSI_CMDS_PER_LUN_DEFAULT, 1608 .can_queue = IBMVSCSI_MAX_REQUESTS_DEFAULT, 1609 .this_id = -1, 1610 .sg_tablesize = SG_ALL, 1611 .use_clustering = ENABLE_CLUSTERING, 1612 .shost_attrs = ibmvscsi_attrs, 1613 }; 1614 + 1615 + /** 1616 + * ibmvscsi_get_desired_dma - Calculate IO memory desired by the driver 1617 + * 1618 + * @vdev: struct vio_dev for the device whose desired IO mem is to be returned 1619 + * 1620 + * Return value: 1621 + * Number of bytes of IO data the driver will need to perform well. 1622 + */ 1623 + static unsigned long ibmvscsi_get_desired_dma(struct vio_dev *vdev) 1624 + { 1625 + /* iu_storage data allocated in initialize_event_pool */ 1626 + unsigned long desired_io = max_requests * sizeof(union viosrp_iu); 1627 + 1628 + /* add io space for sg data */ 1629 + desired_io += (IBMVSCSI_MAX_SECTORS_DEFAULT * 1630 + IBMVSCSI_CMDS_PER_LUN_DEFAULT); 1631 + 1632 + return desired_io; 1633 + } 1634 1635 /** 1636 * Called by bus code for each adapter ··· 1641 hostdata->host = host; 1642 hostdata->dev = dev; 1643 atomic_set(&hostdata->request_limit, -1); 1644 + hostdata->host->max_sectors = IBMVSCSI_MAX_SECTORS_DEFAULT; 1645 1646 rc = ibmvscsi_ops->init_crq_queue(&hostdata->queue, hostdata, max_requests); 1647 if (rc != 0 && rc != H_RESOURCE) { ··· 1735 .id_table = ibmvscsi_device_table, 1736 .probe = ibmvscsi_probe, 1737 .remove = ibmvscsi_remove, 1738 + .get_desired_dma = ibmvscsi_get_desired_dma, 1739 .driver = { 1740 .name = "ibmvscsi", 1741 .owner = THIS_MODULE,
+2
drivers/scsi/ibmvscsi/ibmvscsi.h
··· 45 #define MAX_INDIRECT_BUFS 10 46 47 #define IBMVSCSI_MAX_REQUESTS_DEFAULT 100 48 #define IBMVSCSI_MAX_CMDS_PER_LUN 64 49 50 /* ------------------------------------------------------------
··· 45 #define MAX_INDIRECT_BUFS 10 46 47 #define IBMVSCSI_MAX_REQUESTS_DEFAULT 100 48 + #define IBMVSCSI_CMDS_PER_LUN_DEFAULT 16 49 + #define IBMVSCSI_MAX_SECTORS_DEFAULT 256 /* 32 * 8 = default max I/O 32 pages */ 50 #define IBMVSCSI_MAX_CMDS_PER_LUN 64 51 52 /* ------------------------------------------------------------