|
@@ -2263,7 +2263,18 @@ struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lport,
|
|
mp->class = class;
|
|
mp->class = class;
|
|
/* adjust em exch xid range for offload */
|
|
/* adjust em exch xid range for offload */
|
|
mp->min_xid = min_xid;
|
|
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);
|
|
mp->ep_pool = mempool_create_slab_pool(2, fc_em_cachep);
|
|
if (!mp->ep_pool)
|
|
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
|
|
* divided across all cpus. The exch pointers array memory is
|
|
* allocated for exch range per pool.
|
|
* 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;
|
|
mp->pool_max_index = pool_exch_range - 1;
|
|
|
|
|
|
/*
|
|
/*
|