diff options
Diffstat (limited to 'drivers/scsi/libfc/fc_exch.c')
| -rw-r--r-- | drivers/scsi/libfc/fc_exch.c | 14 | 
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c index 630291f0182..aceffadb21c 100644 --- a/drivers/scsi/libfc/fc_exch.c +++ b/drivers/scsi/libfc/fc_exch.c @@ -2263,7 +2263,18 @@ struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lport,  	mp->class = class;  	/* adjust em exch xid range for offload */  	mp->min_xid = min_xid; -	mp->max_xid = max_xid; + +       /* reduce range so per cpu pool fits into PCPU_MIN_UNIT_SIZE pool */ +	pool_exch_range = (PCPU_MIN_UNIT_SIZE - sizeof(*pool)) / +		sizeof(struct fc_exch *); +	if ((max_xid - min_xid + 1) / (fc_cpu_mask + 1) > pool_exch_range) { +		mp->max_xid = pool_exch_range * (fc_cpu_mask + 1) + +			min_xid - 1; +	} else { +		mp->max_xid = max_xid; +		pool_exch_range = (mp->max_xid - mp->min_xid + 1) / +			(fc_cpu_mask + 1); +	}  	mp->ep_pool = mempool_create_slab_pool(2, fc_em_cachep);  	if (!mp->ep_pool) @@ -2274,7 +2285,6 @@ struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lport,  	 * divided across all cpus. The exch pointers array memory is  	 * allocated for exch range per pool.  	 */ -	pool_exch_range = (mp->max_xid - mp->min_xid + 1) / (fc_cpu_mask + 1);  	mp->pool_max_index = pool_exch_range - 1;  	/*  |