@ -231,14 +231,16 @@ static int srp_create_target_ib(struct srp_target_port *target)
return - ENOMEM ;
recv_cq = ib_create_cq ( target - > srp_host - > srp_dev - > dev ,
srp_recv_completion , NULL , target , SRP_RQ_SIZE , 0 ) ;
srp_recv_completion , NULL , target , SRP_RQ_SIZE ,
target - > comp_vector ) ;
if ( IS_ERR ( recv_cq ) ) {
ret = PTR_ERR ( recv_cq ) ;
goto err ;
}
send_cq = ib_create_cq ( target - > srp_host - > srp_dev - > dev ,
srp_send_completion , NULL , target , SRP_SQ_SIZE , 0 ) ;
srp_send_completion , NULL , target , SRP_SQ_SIZE ,
target - > comp_vector ) ;
if ( IS_ERR ( send_cq ) ) {
ret = PTR_ERR ( send_cq ) ;
goto err_recv_cq ;
@ -1898,6 +1900,14 @@ static ssize_t show_local_ib_device(struct device *dev,
return sprintf ( buf , " %s \n " , target - > srp_host - > srp_dev - > dev - > name ) ;
}
static ssize_t show_comp_vector ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
struct srp_target_port * target = host_to_target ( class_to_shost ( dev ) ) ;
return sprintf ( buf , " %d \n " , target - > comp_vector ) ;
}
static ssize_t show_cmd_sg_entries ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
@ -1924,6 +1934,7 @@ static DEVICE_ATTR(req_lim, S_IRUGO, show_req_lim, NULL);
static DEVICE_ATTR ( zero_req_lim , S_IRUGO , show_zero_req_lim , NULL ) ;
static DEVICE_ATTR ( local_ib_port , S_IRUGO , show_local_ib_port , NULL ) ;
static DEVICE_ATTR ( local_ib_device , S_IRUGO , show_local_ib_device , NULL ) ;
static DEVICE_ATTR ( comp_vector , S_IRUGO , show_comp_vector , NULL ) ;
static DEVICE_ATTR ( cmd_sg_entries , S_IRUGO , show_cmd_sg_entries , NULL ) ;
static DEVICE_ATTR ( allow_ext_sg , S_IRUGO , show_allow_ext_sg , NULL ) ;
@ -1938,6 +1949,7 @@ static struct device_attribute *srp_host_attrs[] = {
& dev_attr_zero_req_lim ,
& dev_attr_local_ib_port ,
& dev_attr_local_ib_device ,
& dev_attr_comp_vector ,
& dev_attr_cmd_sg_entries ,
& dev_attr_allow_ext_sg ,
NULL
@ -2061,6 +2073,7 @@ enum {
SRP_OPT_CMD_SG_ENTRIES = 1 < < 9 ,
SRP_OPT_ALLOW_EXT_SG = 1 < < 10 ,
SRP_OPT_SG_TABLESIZE = 1 < < 11 ,
SRP_OPT_COMP_VECTOR = 1 < < 12 ,
SRP_OPT_ALL = ( SRP_OPT_ID_EXT |
SRP_OPT_IOC_GUID |
SRP_OPT_DGID |
@ -2081,6 +2094,7 @@ static const match_table_t srp_opt_tokens = {
{ SRP_OPT_CMD_SG_ENTRIES , " cmd_sg_entries=%u " } ,
{ SRP_OPT_ALLOW_EXT_SG , " allow_ext_sg=%u " } ,
{ SRP_OPT_SG_TABLESIZE , " sg_tablesize=%u " } ,
{ SRP_OPT_COMP_VECTOR , " comp_vector=%u " } ,
{ SRP_OPT_ERR , NULL }
} ;
@ -2236,6 +2250,14 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
target - > sg_tablesize = token ;
break ;
case SRP_OPT_COMP_VECTOR :
if ( match_int ( args , & token ) | | token < 0 ) {
pr_warn ( " bad comp_vector parameter '%s' \n " , p ) ;
goto out ;
}
target - > comp_vector = token ;
break ;
default :
pr_warn ( " unknown parameter or missing value '%s' in target creation request \n " ,
p ) ;