Starting fcoe fails at fcoe_transport_create when attempting to allocate a pool 
of 4K exchanges on a 
64-bit single-CPU environment because the call  to __alloc_percpu() is greater 
than the max of 32K.
This patch reduces the number of exchanges to fit within the maximum allowed 
space.

Signed-off-by:  Steven Clark <scl...@crossbeam.com>
---
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 588060f..8508c5e 100644
--- a/drivers/scsi/libfc/fc_exch.c
+++ b/drivers/scsi/libfc/fc_exch.c
@@ -2284,8 +2284,19 @@ 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)
                goto free_mp;
@@ -2295,7 +2306,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;
 
        /*

_______________________________________________
devel mailing list
devel@open-fcoe.org
https://lists.open-fcoe.org/mailman/listinfo/devel

Reply via email to