svn commit: r300875 - head/sys/dev/cxgbe/iw_cxgbe

Navdeep Parhar np at FreeBSD.org
Fri May 27 21:26:27 UTC 2016


Author: np
Date: Fri May 27 21:26:26 2016
New Revision: 300875
URL: https://svnweb.freebsd.org/changeset/base/300875

Log:
  iw_cxgbe: Use vmem(9) to manage PBL and RQT allocations.
  
  Submitted by:	Krishnamraju Eraparaju at Chelsio
  Reviewed by:	Steve Wise
  Sponsored by:	Chelsio Communications

Modified:
  head/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
  head/sys/dev/cxgbe/iw_cxgbe/resource.c

Modified: head/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h
==============================================================================
--- head/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h	Fri May 27 21:12:25 2016	(r300874)
+++ head/sys/dev/cxgbe/iw_cxgbe/iw_cxgbe.h	Fri May 27 21:26:26 2016	(r300875)
@@ -45,6 +45,7 @@
 #include <linux/kref.h>
 #include <linux/timer.h>
 #include <linux/io.h>
+#include <sys/vmem.h>
 
 #include <asm/byteorder.h>
 
@@ -144,8 +145,8 @@ struct c4iw_rdev {
 	unsigned long cqshift;
 	u32 cqmask;
 	struct c4iw_dev_ucontext uctx;
-	struct gen_pool *pbl_pool;
-	struct gen_pool *rqt_pool;
+	vmem_t          *rqt_arena;
+	vmem_t          *pbl_arena;
 	u32 flags;
 	struct c4iw_stats stats;
 };
@@ -929,75 +930,6 @@ extern struct cxgb4_client t4c_client;
 extern c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS];
 extern int c4iw_max_read_depth;
 
-#include <sys/blist.h>
-struct gen_pool {
-        blist_t         gen_list;
-        daddr_t         gen_base;
-        int             gen_chunk_shift;
-        struct mutex      gen_lock;
-};
-
-static __inline struct gen_pool *
-gen_pool_create(daddr_t base, u_int chunk_shift, u_int len)
-{
-        struct gen_pool *gp;
-
-        gp = malloc(sizeof(struct gen_pool), M_DEVBUF, M_NOWAIT);
-        if (gp == NULL)
-                return (NULL);
-
-        memset(gp, 0, sizeof(struct gen_pool));
-        gp->gen_list = blist_create(len >> chunk_shift, M_NOWAIT);
-        if (gp->gen_list == NULL) {
-                free(gp, M_DEVBUF);
-                return (NULL);
-        }
-        blist_free(gp->gen_list, 0, len >> chunk_shift);
-        gp->gen_base = base;
-        gp->gen_chunk_shift = chunk_shift;
-        //mutex_init(&gp->gen_lock, "genpool", NULL, MTX_DUPOK|MTX_DEF);
-        mutex_init(&gp->gen_lock);
-
-        return (gp);
-}
-
-static __inline unsigned long
-gen_pool_alloc(struct gen_pool *gp, int size)
-{
-        int chunks;
-        daddr_t blkno;
-
-        chunks = (size + (1<<gp->gen_chunk_shift) - 1) >> gp->gen_chunk_shift;
-        mutex_lock(&gp->gen_lock);
-        blkno = blist_alloc(gp->gen_list, chunks);
-        mutex_unlock(&gp->gen_lock);
-
-        if (blkno == SWAPBLK_NONE)
-                return (0);
-
-        return (gp->gen_base + ((1 << gp->gen_chunk_shift) * blkno));
-}
-
-static __inline void
-gen_pool_free(struct gen_pool *gp, daddr_t address, int size)
-{
-        int chunks;
-        daddr_t blkno;
-
-        chunks = (size + (1<<gp->gen_chunk_shift) - 1) >> gp->gen_chunk_shift;
-        blkno = (address - gp->gen_base) / (1 << gp->gen_chunk_shift);
-        mutex_lock(&gp->gen_lock);
-        blist_free(gp->gen_list, blkno, chunks);
-        mutex_unlock(&gp->gen_lock);
-}
-
-static __inline void
-gen_pool_destroy(struct gen_pool *gp)
-{
-        blist_destroy(gp->gen_list);
-        free(gp, M_DEVBUF);
-}
-
 #if defined(__i386__) || defined(__amd64__)
 #define L1_CACHE_BYTES 128
 #else

Modified: head/sys/dev/cxgbe/iw_cxgbe/resource.c
==============================================================================
--- head/sys/dev/cxgbe/iw_cxgbe/resource.c	Fri May 27 21:12:25 2016	(r300874)
+++ head/sys/dev/cxgbe/iw_cxgbe/resource.c	Fri May 27 21:26:26 2016	(r300875)
@@ -248,13 +248,17 @@ void c4iw_destroy_resource(struct c4iw_r
 	c4iw_id_table_free(&rscp->pdid_table);
 }
 
-/* PBL Memory Manager.  Uses Linux generic allocator. */
+/* PBL Memory Manager. */
 
-#define MIN_PBL_SHIFT 8			/* 256B == min PBL size (32 entries) */
+#define MIN_PBL_SHIFT 5			/* 32B == min PBL size (4 entries) */
 
 u32 c4iw_pblpool_alloc(struct c4iw_rdev *rdev, int size)
 {
-	unsigned long addr = gen_pool_alloc(rdev->pbl_pool, size);
+	unsigned long addr;
+
+	vmem_xalloc(rdev->pbl_arena, roundup(size, (1 << MIN_PBL_SHIFT)),
+			4, 0, 0, VMEM_ADDR_MIN, VMEM_ADDR_MAX,
+			M_FIRSTFIT|M_NOWAIT, &addr);
 	CTR3(KTR_IW_CXGBE, "%s addr 0x%x size %d", __func__, (u32)addr, size);
 	mutex_lock(&rdev->stats.lock);
 	if (addr) {
@@ -273,15 +277,16 @@ void c4iw_pblpool_free(struct c4iw_rdev 
 	mutex_lock(&rdev->stats.lock);
 	rdev->stats.pbl.cur -= roundup(size, 1 << MIN_PBL_SHIFT);
 	mutex_unlock(&rdev->stats.lock);
-	gen_pool_free(rdev->pbl_pool, (unsigned long)addr, size);
+	vmem_xfree(rdev->pbl_arena, addr, roundup(size,(1 << MIN_PBL_SHIFT)));
 }
 
 int c4iw_pblpool_create(struct c4iw_rdev *rdev)
 {
-	rdev->pbl_pool = gen_pool_create(rdev->adap->vres.pbl.start,
-					 MIN_PBL_SHIFT,
-					 rdev->adap->vres.pbl.size);
-	if (!rdev->pbl_pool)
+	rdev->pbl_arena = vmem_create("PBL_MEM_POOL",
+					rdev->adap->vres.pbl.start,
+					rdev->adap->vres.pbl.size,
+					1, 0, M_FIRSTFIT| M_NOWAIT);
+	if (!rdev->pbl_arena)
 		return -ENOMEM;
 
 	return 0;
@@ -289,16 +294,21 @@ int c4iw_pblpool_create(struct c4iw_rdev
 
 void c4iw_pblpool_destroy(struct c4iw_rdev *rdev)
 {
-	gen_pool_destroy(rdev->pbl_pool);
+	vmem_destroy(rdev->pbl_arena);
 }
 
-/* RQT Memory Manager.  Uses Linux generic allocator. */
+/* RQT Memory Manager. */
 
 #define MIN_RQT_SHIFT 10	/* 1KB == min RQT size (16 entries) */
 
 u32 c4iw_rqtpool_alloc(struct c4iw_rdev *rdev, int size)
 {
-	unsigned long addr = gen_pool_alloc(rdev->rqt_pool, size << 6);
+	unsigned long addr;
+
+	vmem_xalloc(rdev->rqt_arena,
+			roundup((size << 6),(1 << MIN_RQT_SHIFT)),
+			4, 0, 0, VMEM_ADDR_MIN, VMEM_ADDR_MAX,
+			M_FIRSTFIT|M_NOWAIT, &addr);
 	CTR3(KTR_IW_CXGBE, "%s addr 0x%x size %d", __func__, (u32)addr,
 	    size << 6);
 	if (!addr)
@@ -321,15 +331,17 @@ void c4iw_rqtpool_free(struct c4iw_rdev 
 	mutex_lock(&rdev->stats.lock);
 	rdev->stats.rqt.cur -= roundup(size << 6, 1 << MIN_RQT_SHIFT);
 	mutex_unlock(&rdev->stats.lock);
-	gen_pool_free(rdev->rqt_pool, (unsigned long)addr, size << 6);
+	vmem_xfree(rdev->rqt_arena, addr,
+		       roundup((size << 6),(1 << MIN_RQT_SHIFT)));
 }
 
 int c4iw_rqtpool_create(struct c4iw_rdev *rdev)
 {
-	rdev->rqt_pool = gen_pool_create(rdev->adap->vres.rq.start,
-					 MIN_RQT_SHIFT,
-					 rdev->adap->vres.rq.size);
-	if (!rdev->rqt_pool)
+	rdev->rqt_arena = vmem_create("RQT_MEM_POOL",
+					rdev->adap->vres.rq.start,
+					rdev->adap->vres.rq.size,
+					1, 0, M_FIRSTFIT| M_NOWAIT);
+	if (!rdev->rqt_arena)
 		return -ENOMEM;
 
 	return 0;
@@ -337,6 +349,6 @@ int c4iw_rqtpool_create(struct c4iw_rdev
 
 void c4iw_rqtpool_destroy(struct c4iw_rdev *rdev)
 {
-	gen_pool_destroy(rdev->rqt_pool);
+	vmem_destroy(rdev->rqt_arena);
 }
 #endif


More information about the svn-src-all mailing list