Date: Wed, 7 Jan 2015 06:20:34 +0000 (UTC) From: Navdeep Parhar <np@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r276775 - head/sys/dev/cxgbe/tom Message-ID: <201501070620.t076KYk5094175@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: np Date: Wed Jan 7 06:20:33 2015 New Revision: 276775 URL: https://svnweb.freebsd.org/changeset/base/276775 Log: cxgbe/tom: allocate page pod addresses instead of ppod#. MFC after: 2 weeks Modified: head/sys/dev/cxgbe/tom/t4_ddp.c head/sys/dev/cxgbe/tom/t4_tom.h Modified: head/sys/dev/cxgbe/tom/t4_ddp.c ============================================================================== --- head/sys/dev/cxgbe/tom/t4_ddp.c Wed Jan 7 01:51:02 2015 (r276774) +++ head/sys/dev/cxgbe/tom/t4_ddp.c Wed Jan 7 06:20:33 2015 (r276775) @@ -98,24 +98,26 @@ t4_dump_tcb(struct adapter *sc, int tid) #define MAX_DDP_BUFFER_SIZE (M_TCB_RX_DDP_BUF0_LEN) static int -alloc_ppods(struct tom_data *td, int n) +alloc_ppods(struct tom_data *td, int n, u_int *ppod_addr) { - vmem_addr_t ppod; + vmem_addr_t v; + int rc; MPASS(n > 0); - if (vmem_alloc(td->ppod_arena, n, M_NOWAIT | M_FIRSTFIT, &ppod) != 0) - return (-1); - return ((int)ppod); + rc = vmem_alloc(td->ppod_arena, PPOD_SZ(n), M_NOWAIT | M_FIRSTFIT, &v); + *ppod_addr = (u_int)v; + + return (rc); } static void -free_ppods(struct tom_data *td, int ppod, int n) +free_ppods(struct tom_data *td, u_int ppod_addr, int n) { MPASS(n > 0); - vmem_free(td->ppod_arena, ppod, n); + vmem_free(td->ppod_arena, (vmem_addr_t)ppod_addr, PPOD_SZ(n)); } static inline int @@ -137,7 +139,7 @@ free_ddp_buffer(struct tom_data *td, str free(db->pages, M_CXGBE); if (db->nppods > 0) - free_ppods(td, G_PPOD_TAG(db->tag), db->nppods); + free_ppods(td, db->ppod_addr, db->nppods); free(db, M_CXGBE); } @@ -652,6 +654,7 @@ alloc_ddp_buffer(struct tom_data *td, vm break; } have_pgsz: + MPASS(idx <= M_PPOD_PGSZ); db = malloc(sizeof(*db), M_CXGBE, M_NOWAIT); if (db == NULL) { @@ -660,16 +663,13 @@ have_pgsz: } nppods = pages_to_nppods(npages, t4_ddp_pgsz[idx]); - ppod = alloc_ppods(td, nppods); - if (ppod < 0) { + if (alloc_ppods(td, nppods, &db->ppod_addr) != 0) { free(db, M_CXGBE); CTR4(KTR_CXGBE, "%s: no pods, nppods %d, resid %d, pgsz %d", __func__, nppods, len, t4_ddp_pgsz[idx]); return (NULL); } - - KASSERT(idx <= M_PPOD_PGSZ && ppod <= M_PPOD_TAG, - ("%s: DDP pgsz_idx = %d, ppod = %d", __func__, idx, ppod)); + ppod = (db->ppod_addr - td->ppod_start) / PPOD_SIZE; db->tag = V_PPOD_PGSZ(idx) | V_PPOD_TAG(ppod); db->nppods = nppods; @@ -695,7 +695,8 @@ write_page_pods(struct adapter *sc, stru struct ulp_mem_io *ulpmc; struct ulptx_idata *ulpsc; struct pagepod *ppod; - int i, j, k, n, chunk, len, ddp_pgsz, idx, ppod_addr; + int i, j, k, n, chunk, len, ddp_pgsz, idx; + u_int ppod_addr; uint32_t cmd; cmd = htobe32(V_ULPTX_CMD(ULP_TX_MEM_WRITE)); @@ -704,7 +705,7 @@ write_page_pods(struct adapter *sc, stru else cmd |= htobe32(F_T5_ULP_MEMIO_IMM); ddp_pgsz = t4_ddp_pgsz[G_PPOD_PGSZ(db->tag)]; - ppod_addr = sc->vres.ddp.start + G_PPOD_TAG(db->tag) * PPOD_SIZE; + ppod_addr = db->ppod_addr; for (i = 0; i < db->nppods; ppod_addr += chunk) { /* How many page pods are we writing in this cycle */ @@ -937,10 +938,10 @@ no_ddp: void t4_init_ddp(struct adapter *sc, struct tom_data *td) { - int nppods = sc->vres.ddp.size / PPOD_SIZE; - td->ppod_arena = vmem_create("DDP page pods", 0, nppods, 1, 32, - M_FIRSTFIT | M_NOWAIT); + td->ppod_start = sc->vres.ddp.start; + td->ppod_arena = vmem_create("DDP page pods", sc->vres.ddp.start, + sc->vres.ddp.size, 1, 32, M_FIRSTFIT | M_NOWAIT); t4_register_cpl_handler(sc, CPL_RX_DATA_DDP, do_rx_data_ddp); t4_register_cpl_handler(sc, CPL_RX_DDP_COMPLETE, do_rx_ddp_complete); Modified: head/sys/dev/cxgbe/tom/t4_tom.h ============================================================================== --- head/sys/dev/cxgbe/tom/t4_tom.h Wed Jan 7 01:51:02 2015 (r276774) +++ head/sys/dev/cxgbe/tom/t4_tom.h Wed Jan 7 06:20:33 2015 (r276775) @@ -83,6 +83,7 @@ struct ofld_tx_sdesc { struct ddp_buffer { uint32_t tag; /* includes color, page pod addr, and DDP page size */ + u_int ppod_addr; int nppods; int offset; int len; @@ -192,6 +193,7 @@ struct tom_data { u_long listen_mask; int lctx_count; /* # of lctx in the hash table */ + u_int ppod_start; vmem_t *ppod_arena; struct mtx clip_table_lock;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201501070620.t076KYk5094175>