[Open-FCoE] [RFC PATCH 2/6] libfc, fcoe: adds em_list towards having more than one EM instance for a lport

Vasu Dev vasu.dev at intel.com
Wed Apr 29 15:15:03 UTC 2009


This is to have another dedicated EM instance for offload xids, the
fc_exch_mgr_alloc adds new em to the added em_list and fc_exch_mgr_free
removed em from the list, this required fcoe_em_config calling moved
down so that em_list is initialized since fcoe_em_config allocates
new em by calling fc_exch_mgr_alloc.

Modifies fc_exch_mgr_reset to reset all em from em_list.

Signed-off-by: Vasu Dev <vasu.dev at intel.com>
---

 drivers/scsi/fcoe/fcoe.c     |   14 ++++++-------
 drivers/scsi/libfc/fc_exch.c |   46 +++++++++++++++++++++++++-----------------
 include/scsi/libfc.h         |    1 +
 3 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index f84775a..e829630 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -572,13 +572,6 @@ static int fcoe_if_create(struct net_device *netdev)
 		goto out_host_put;
 	}
 
-	/* lport exch manager allocation */
-	rc = fcoe_em_config(lp);
-	if (rc) {
-		FC_DBG("Could not configure em for lport\n");
-		goto out_host_put;
-	}
-
 	/* Initialize the library */
 	rc = fcoe_libfc_config(lp, &fcoe_libfc_fcn_templ);
 	if (rc) {
@@ -586,6 +579,13 @@ static int fcoe_if_create(struct net_device *netdev)
 		goto out_lp_destroy;
 	}
 
+	/* lport exch manager allocation */
+	rc = fcoe_em_config(lp);
+	if (rc) {
+		FC_DBG("Could not configure em for lport\n");
+		goto out_lp_destroy;
+	}
+
 	/* add to lports list */
 	fcoe_hostlist_add(lp);
 
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
index 9869820..bf50fc2 100644
--- a/drivers/scsi/libfc/fc_exch.c
+++ b/drivers/scsi/libfc/fc_exch.c
@@ -73,6 +73,7 @@ struct fc_exch_mgr {
 	u16		max_xid;	/* max exchange ID */
 	u32		total_exches;	/* total allocated exchanges */
 	struct list_head	ex_list;	/* allocated exchanges list */
+	struct list_head	em_list;	/* fc_exch_mgr list */
 	struct fc_lport	*lp;		/* fc device instance */
 	mempool_t	*ep_pool;	/* reserve ep's */
 
@@ -1425,29 +1426,31 @@ void fc_exch_mgr_reset(struct fc_lport *lp, u32 sid, u32 did)
 {
 	struct fc_exch *ep;
 	struct fc_exch *next;
-	struct fc_exch_mgr *mp = lp->emp;
+	struct fc_exch_mgr *mp;
 
-	spin_lock_bh(&mp->em_lock);
+	list_for_each_entry(mp, &lp->em_list, em_list) {
+		spin_lock_bh(&mp->em_lock);
 restart:
-	list_for_each_entry_safe(ep, next, &mp->ex_list, ex_list) {
-		if ((sid == 0 || sid == ep->sid) &&
-		    (did == 0 || did == ep->did)) {
-			fc_exch_hold(ep);
-			spin_unlock_bh(&mp->em_lock);
-
-			fc_exch_reset(ep);
-
-			fc_exch_release(ep);
-			spin_lock_bh(&mp->em_lock);
-
-			/*
-			 * must restart loop incase while lock was down
-			 * multiple eps were released.
-			 */
-			goto restart;
+		list_for_each_entry_safe(ep, next, &mp->ex_list, ex_list) {
+			if ((sid == 0 || sid == ep->sid) &&
+			    (did == 0 || did == ep->did)) {
+				fc_exch_hold(ep);
+				spin_unlock_bh(&mp->em_lock);
+
+				fc_exch_reset(ep);
+
+				fc_exch_release(ep);
+				spin_lock_bh(&mp->em_lock);
+
+				/*
+				 * must restart loop incase while lock
+				 * was down multiple eps were released.
+				 */
+				goto restart;
+			}
 		}
+		spin_unlock_bh(&mp->em_lock);
 	}
-	spin_unlock_bh(&mp->em_lock);
 }
 EXPORT_SYMBOL(fc_exch_mgr_reset);
 
@@ -1723,6 +1726,8 @@ struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lp,
 	if (!mp->ep_pool)
 		goto free_mp;
 
+	/* add em to the em_list */
+	list_add_tail(&mp->em_list, &lp->em_list);
 	return mp;
 
 free_mp:
@@ -1739,6 +1744,8 @@ void fc_exch_mgr_free(struct fc_exch_mgr *mp)
 	 * before freeing exchange manager.
 	 */
 	WARN_ON(mp->total_exches != 0);
+	/* remove em from the em_list */
+	list_del(&mp->em_list);
 	mempool_destroy(mp->ep_pool);
 	kfree(mp);
 }
@@ -1882,6 +1889,7 @@ int fc_exch_init(struct fc_lport *lp)
 	if (!lp->tt.seq_exch_abort)
 		lp->tt.seq_exch_abort = fc_seq_exch_abort;
 
+	INIT_LIST_HEAD(&lp->em_list);
 	return 0;
 }
 EXPORT_SYMBOL(fc_exch_init);
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h
index fc2cbb9..edfd9da 100644
--- a/include/scsi/libfc.h
+++ b/include/scsi/libfc.h
@@ -650,6 +650,7 @@ struct fc_lport {
 	/* Associations */
 	struct Scsi_Host	*host;
 	struct fc_exch_mgr	*emp;
+	struct list_head	em_list;
 	struct fc_rport		*dns_rp;
 	struct fc_rport		*ptp_rp;
 	void			*scsi_priv;




More information about the devel mailing list