Reserving offload xids(DDP) range within single exchange manger (EM)
instance of a lport won't allow full DDP xid range sharing on demand
across multiple VN_PORT on a eth device, in case of libfc the
VN_PORT is the lport.

These multiple VN_PORT could be for either NPIV or FCoE over VLAN
and in that case same offload xids range tied to their eth device
need to be shared by all VN_PORTs, for that this patch series
allocates a dedicated EM instance for offload xids and then have it
shared by all VN_PORTs on demand using exch_get interface of libfc.

This patch removes offload xids range related code from libfc
from func fc_exch_mgr_alloc and completely removes related func
fc_em_alloc_xid earlier needed for selecting a xid from two ranges
of xids within a EM instance, which is no loner required after
dedicated EM instance in this patch series.

Instead of fc_em_alloc_xid, adds simple logic to allocate xid
which also make use of xid zero, xid zero was unused before, also
removes redundant fp and xid args to fc_exch_alloc.

Also removes unconditionally called to func fc_fcp_ddp_setup for
now and this patch series will add this again to exch_get once
dedicated EM instance for offload xid(DDP) range is done.

Signed-off-by: Vasu Dev <[email protected]>
---

 drivers/scsi/libfc/fc_exch.c |   97 +++++++++---------------------------------
 include/scsi/libfc.h         |    5 --
 2 files changed, 21 insertions(+), 81 deletions(-)

diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
index 992af05..9869820 100644
--- a/drivers/scsi/libfc/fc_exch.c
+++ b/drivers/scsi/libfc/fc_exch.c
@@ -71,9 +71,7 @@ struct fc_exch_mgr {
        u16             last_xid;       /* last allocated exchange ID */
        u16             min_xid;        /* min exchange ID */
        u16             max_xid;        /* max exchange ID */
-       u16             max_read;       /* max exchange ID for read */
-       u16             last_read;      /* last xid allocated for read */
-       u32     total_exches;           /* total allocated exchanges */
+       u32             total_exches;   /* total allocated exchanges */
        struct list_head        ex_list;        /* allocated exchanges list */
        struct fc_lport *lp;            /* fc device instance */
        mempool_t       *ep_pool;       /* reserve ep's */
@@ -472,64 +470,15 @@ static struct fc_seq *fc_seq_alloc(struct fc_exch *ep, u8 
seq_id)
 }
 
 /*
- * fc_em_alloc_xid - returns an xid based on request type
- * @lp : ptr to associated lport
- * @fp : ptr to the assocated frame
- *
- * check the associated fc_fsp_pkt to get scsi command type and
- * command direction to decide from which range this exch id
- * will be allocated from.
- *
- * Returns : 0 or an valid xid
- */
-static u16 fc_em_alloc_xid(struct fc_exch_mgr *mp, const struct fc_frame *fp)
-{
-       u16 xid, min, max;
-       u16 *plast;
-       struct fc_exch *ep = NULL;
-
-       if (mp->max_read) {
-               if (fc_fcp_is_read(fr_fsp(fp))) {
-                       min = mp->min_xid;
-                       max = mp->max_read;
-                       plast = &mp->last_read;
-               } else {
-                       min = mp->max_read + 1;
-                       max = mp->max_xid;
-                       plast = &mp->last_xid;
-               }
-       } else {
-               min = mp->min_xid;
-               max = mp->max_xid;
-               plast = &mp->last_xid;
-       }
-       xid = *plast;
-       do {
-               xid = (xid == max) ? min : xid + 1;
-               ep = mp->exches[xid - mp->min_xid];
-       } while ((ep != NULL) && (xid != *plast));
-
-       if (unlikely(ep))
-               xid = 0;
-       else
-               *plast = xid;
-
-       return xid;
-}
-
-/*
- * fc_exch_alloc - allocate an exchange.
+ * fc_exch_alloc - allocate an exchange and its exchange id.
  * @mp : ptr to the exchange manager
- * @xid: input xid
  *
- * if xid is supplied zero then assign next free exchange ID
- * from exchange manager, otherwise use supplied xid.
  * Returns with exch lock held.
  */
-struct fc_exch *fc_exch_alloc(struct fc_exch_mgr *mp,
-                             struct fc_frame *fp, u16 xid)
+struct fc_exch *fc_exch_alloc(struct fc_exch_mgr *mp)
 {
        struct fc_exch *ep;
+       u16 min, max, xid;
 
        /* allocate memory for exchange */
        ep = mempool_alloc(mp->ep_pool, GFP_ATOMIC);
@@ -539,16 +488,23 @@ struct fc_exch *fc_exch_alloc(struct fc_exch_mgr *mp,
        }
        memset(ep, 0, sizeof(*ep));
 
+       min = mp->min_xid;
+       max = mp->max_xid;
+
        spin_lock_bh(&mp->em_lock);
-       /* alloc xid if input xid 0 */
-       if (!xid) {
-               /* alloc a new xid */
-               xid = fc_em_alloc_xid(mp, fp);
-               if (!xid) {
-                       printk(KERN_ERR "fc_em_alloc_xid() failed\n");
+
+       xid = mp->last_xid;
+       /* alloc a new xid */
+       while (mp->exches[xid - min]) {
+               xid = (xid == max) ? min : xid + 1;
+               if (xid == mp->last_xid) {
+                       printk(KERN_ERR "out of free exch ids on em:"
+                               "%p, min xid:%x and max xid:%x\n",
+                               mp, min, max);
                        goto err;
                }
        }
+       mp->last_xid = xid;
 
        fc_exch_hold(ep);       /* hold for exch in mp */
        spin_lock_init(&ep->ex_lock);
@@ -1735,7 +1691,7 @@ struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lp,
        struct fc_exch_mgr *mp;
        size_t len;
 
-       if (max_xid <= min_xid || min_xid == 0 || max_xid == FC_XID_UNKNOWN) {
+       if (max_xid <= min_xid || max_xid == FC_XID_UNKNOWN) {
                FC_DBG("Invalid min_xid 0x:%x and max_xid 0x:%x\n",
                       min_xid, max_xid);
                return NULL;
@@ -1744,7 +1700,6 @@ struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *lp,
        /*
         * Memory need for EM
         */
-#define xid_ok(i, m1, m2) (((i) >= (m1)) && ((i) <= (m2)))
        len = (max_xid - min_xid + 1) * (sizeof(struct fc_exch *));
        len += sizeof(struct fc_exch_mgr);
 
@@ -1759,17 +1714,7 @@ struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport 
*lp,
        /* adjust em exch xid range for offload */
        mp->min_xid = min_xid;
        mp->max_xid = max_xid;
-       mp->last_xid = min_xid - 1;
-       mp->max_read = 0;
-       mp->last_read = 0;
-       if (lp->lro_enabled && xid_ok(lp->lro_xid, min_xid, max_xid)) {
-               mp->max_read = lp->lro_xid;
-               mp->last_read = min_xid - 1;
-               mp->last_xid = mp->max_read;
-       } else {
-               /* disable lro if no xid control over read */
-               lp->lro_enabled = 0;
-       }
+       mp->last_xid = min_xid;
 
        INIT_LIST_HEAD(&mp->ex_list);
        spin_lock_init(&mp->em_lock);
@@ -1804,7 +1749,7 @@ struct fc_exch *fc_exch_get(struct fc_lport *lp, struct 
fc_frame *fp)
        if (!lp || !lp->emp)
                return NULL;
 
-       return fc_exch_alloc(lp->emp, fp, 0);
+       return fc_exch_alloc(lp->emp);
 }
 EXPORT_SYMBOL(fc_exch_get);
 
@@ -1841,8 +1786,6 @@ struct fc_seq *fc_exch_seq_send(struct fc_lport *lp,
        fc_exch_setup_hdr(ep, fp, ep->f_ctl);
        sp->cnt++;
 
-       fc_fcp_ddp_setup(fr_fsp(fp), ep->xid);
-
        if (unlikely(lp->tt.frame_send(lp, fp)))
                goto err;
 
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h
index 45f9cc6..fc2cbb9 100644
--- a/include/scsi/libfc.h
+++ b/include/scsi/libfc.h
@@ -988,11 +988,8 @@ struct fc_exch *fc_exch_get(struct fc_lport *lp, struct 
fc_frame *fp);
 
 /*
  * Allocate a new exchange and sequence pair.
- * if ex_id is zero then next free exchange id
- * from specified exchange manger mp will be assigned.
  */
-struct fc_exch *fc_exch_alloc(struct fc_exch_mgr *mp,
-                             struct fc_frame *fp, u16 ex_id);
+struct fc_exch *fc_exch_alloc(struct fc_exch_mgr *mp);
 /*
  * Start a new sequence on the same exchange as the supplied sequence.
  */

_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel

Reply via email to