RE: [Open-FCoE] [PATCH 12/13] libfc: mv em exch cache to module

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




>-----Original Message-----
>From: devel-bounces@xxxxxxxxxxxxx [mailto:devel-bounces@xxxxxxxxxxxxx]
On
>Behalf Of michaelc@xxxxxxxxxxx
>Sent: Sunday, June 29, 2008 11:24 AM
>To: linux-scsi@xxxxxxxxxxxxxxx; devel@xxxxxxxxxxxxx
>Subject: [Open-FCoE] [PATCH 12/13] libfc: mv em exch cache to module
>
>From: Mike Christie <michaelc@xxxxxxxxxxx>
>
>A per host cache is overkill. For other storage drivers we do
>a cache per module. This moves the em exch cache to the module
>instead of per host.
>
Per EM cache would minimize locking contentions for exch alloc and free
if per CPU receive thread fcoe_percpu_receive_thread() have its own per
CPU EM instance. This patch won't impact ability to have EM instance
(struct fc_exch_mgr) per CPU for faster exch lookup within an EM but
having single EM cache means more contentions for exch allocation and
free once per CPU EM instance is created.  

The receive flow is already distributing all received frames of a
exchange to same received thread but transmit side need to come up with
efficient ex id and EM allocation when per CPU EM instance is
implemented in FCoE module.

Given current code has only one EM instance, so moving this cache per
module wouldn't make any difference in number of EM cache for now.

>Signed-off-by: Mike Christie <michaelc@xxxxxxxxxxx>
>---
> drivers/scsi/fcoe/fcoe_if.c  |    2 +-
> drivers/scsi/libfc/fc_exch.c |   35
+++++++++++++++++------------------
> drivers/scsi/libfc/fc_scsi.c |    9 ++++++++-
> include/scsi/libfc/libfc.h   |    7 ++++++-
> 4 files changed, 32 insertions(+), 21 deletions(-)
>
>diff --git a/drivers/scsi/fcoe/fcoe_if.c b/drivers/scsi/fcoe/fcoe_if.c
>index 3c21e05..fe9364f 100644
>--- a/drivers/scsi/fcoe/fcoe_if.c
>+++ b/drivers/scsi/fcoe/fcoe_if.c
>@@ -489,7 +489,7 @@ int fcoe_create_interface(const char *ifname)
> 	shost->max_channel = 0;
>
> 	/* Allocate an EM for this driver */
>-	lp->emp = fc_exch_mgr_alloc(FC_CLASS_3, 0, 0);
>+	lp->emp = fc_exch_mgr_alloc(FC_CLASS_3, 0);
> 	if (!lp->emp)
> 		goto out_host_put;
>
>diff --git a/drivers/scsi/libfc/fc_exch.c
b/drivers/scsi/libfc/fc_exch.c
>index d861963..5f2433c 100644
>--- a/drivers/scsi/libfc/fc_exch.c
>+++ b/drivers/scsi/libfc/fc_exch.c
>@@ -37,7 +37,7 @@
>  * fc_exch_debug can be set in debugger or at compile time to get more
logs.
>  */
> static int fc_exch_debug;
>-
>+static struct kmem_cache *em_cachep;	/* cache for exchanges */
>

Use fc_ prefix for global to easily identify libfc global symbols.
However few places are still using older openfc prefix and that need to
be fixed.

> /*
>  * Structure and function definitions for managing Fibre Channel
Exchanges
>@@ -115,8 +115,6 @@ struct fc_exch_mgr {
> 	enum fc_class	em_class;	/* default class for sequences
*/
> 	spinlock_t 	em_lock;	/* exchange manager lock */
> 	fc_xid_t	em_xid;		/* default initiator exchange
IDs */
>-	char em_name[16];		/* cache name string */
>-	struct 	kmem_cache	*em_cp;	/* cache for exchanges */
> 	void	*em_llddata;		/* Points to LLD privdate data
*/
> 	u32	em_exch_total;		/* total allocated exchanges */
> 	struct list_head	em_exch_list;	/* allocated exchanges
list */
>@@ -1662,7 +1660,6 @@ reject:
> }
>
> struct fc_exch_mgr *fc_exch_mgr_alloc(enum fc_class class,
>-				      u32 em_idx,
> 				      u32 privsize)
> {
> 	struct fc_exch_mgr *mp;
>@@ -1679,17 +1676,6 @@ struct fc_exch_mgr *fc_exch_mgr_alloc(enum
fc_class
>class,
> 		INIT_LIST_HEAD(&mp->em_exch_list);
>
> 		spin_lock_init(&mp->em_lock);
>-
>-		sprintf(mp->em_name, "libfcEM%d", em_idx);
>-		mp->em_cp = kmem_cache_create(mp->em_name,
>-					      sizeof(struct fc_exch),
>-					      0, SLAB_HWCACHE_ALIGN,
>-					      NULL);
>-
>-		if (!mp->em_cp) {
>-			kfree(mp);
>-			mp = NULL;
>-		}
> 	}
> 	return mp;
> }
>@@ -1699,7 +1685,6 @@ void fc_exch_mgr_free(struct fc_exch_mgr *mp)
> {
> 	WARN_ON(!mp);
>
>-	kmem_cache_destroy(mp->em_cp);
> 	kfree(mp);
> }
> EXPORT_SYMBOL(fc_exch_mgr_free);
>@@ -1708,7 +1693,7 @@ struct fc_exch *fc_exch_alloc(struct fc_exch_mgr
*mp,
>fc_xid_t ex_id)
> {
> 	struct fc_exch *ep = NULL;
>
>-	ep = kmem_cache_zalloc(mp->em_cp, GFP_ATOMIC);
>+	ep = kmem_cache_zalloc(em_cachep, GFP_ATOMIC);
> 	if (ep) {
> 		ep->ex_f_ctl = FC_FC_FIRST_SEQ;	/* next seq is first seq
*/
> 		ep->ex_rx_id = FC_XID_UNKNOWN;
>@@ -1752,7 +1737,7 @@ static void fc_exch_release(struct fc_exch *ep)
> 		mp->em_exch_total--;
> 		list_del(&ep->ex_list);
> 		spin_unlock_bh(&mp->em_lock);
>-		kmem_cache_free(mp->em_cp, ep);
>+		kmem_cache_free(em_cachep, ep);
> 	}
> }
>
>@@ -1984,3 +1969,17 @@ int fc_exch_init(struct fc_lport *lp,
> 	return 0;
> }
> EXPORT_SYMBOL(fc_exch_init);
>+
>+int fc_setup_exch_mgr(void)
>+{
>+	em_cachep = kmem_cache_create("libfc_em", sizeof(struct
fc_exch),
>+				      0, SLAB_HWCACHE_ALIGN, NULL);
>+	if (!em_cachep)
>+		return -ENOMEM;
>+	return 0;
>+}
>+
>+void fc_destroy_exch_mgr(void)
>+{
>+	kmem_cache_destroy(em_cachep);
>+}
>diff --git a/drivers/scsi/libfc/fc_scsi.c
b/drivers/scsi/libfc/fc_scsi.c
>index 257962a..2ca1db2 100644
>--- a/drivers/scsi/libfc/fc_scsi.c
>+++ b/drivers/scsi/libfc/fc_scsi.c
>@@ -2139,6 +2139,8 @@ EXPORT_SYMBOL(fc_scsi_init);
>
> static int __init libfc_init(void)
> {
>+	int rc;
>+
> 	scsi_pkt_cachep = kmem_cache_create("libfc_scsi_pkt",
> 					    sizeof(struct fc_scsi_pkt),
> 					    0, SLAB_HWCACHE_ALIGN,
NULL);
>@@ -2146,12 +2148,17 @@ static int __init libfc_init(void)
> 		FC_DBG("Unable to allocate SRB cache...module load
failed!");
> 		return -ENOMEM;
> 	}
>-	return 0;
>+
>+	rc = fc_setup_exch_mgr();
>+	if (rc)
>+		kmem_cache_destroy(scsi_pkt_cachep);
>+	return rc;
> }
>
> static void __exit libfc_exit(void)
> {
> 	kmem_cache_destroy(scsi_pkt_cachep);
>+	fc_destroy_exch_mgr();
> }
>
> module_init(libfc_init);
>diff --git a/include/scsi/libfc/libfc.h b/include/scsi/libfc/libfc.h
>index 49cabad..3014bb6 100644
>--- a/include/scsi/libfc/libfc.h
>+++ b/include/scsi/libfc/libfc.h
>@@ -750,7 +750,6 @@ int fc_exch_init(struct fc_lport *lp,
>  * help the LLD manage the exchange ID allocation.
>  */
> struct fc_exch_mgr *fc_exch_mgr_alloc(enum fc_class class,
>-				      u32 em_idx,
> 				      u32 privsize);
>
>
>@@ -854,4 +853,10 @@ void fc_get_rport_loss_tmo(struct fc_rport
*rport);
> void fc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout);
> struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *);
>
>+/*
>+ * module setup functions.
>+ */
>+int fc_setup_exch_mgr(void);
>+void fc_destroy_exch_mgr(void);
>+
> #endif /* _LIBFC_H_ */
>--
>1.5.4.1
>
>_______________________________________________
>devel mailing list
>devel@xxxxxxxxxxxxx
>http://www.open-fcoe.org/mailman/listinfo/devel
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux