From owner-p4-projects@FreeBSD.ORG Mon Dec 6 03:53:57 2004 Return-Path: <owner-p4-projects@FreeBSD.ORG> Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4B90216A500; Mon, 6 Dec 2004 03:53:57 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E4CEF16A4D0 for <perforce@freebsd.org>; Mon, 6 Dec 2004 03:53:56 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id C77B443D31 for <perforce@freebsd.org>; Mon, 6 Dec 2004 03:53:56 +0000 (GMT) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id iB63ruhm040987 for <perforce@freebsd.org>; Mon, 6 Dec 2004 03:53:56 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id iB63ruCl040984 for perforce@freebsd.org; Mon, 6 Dec 2004 03:53:56 GMT (envelope-from sam@freebsd.org) Date: Mon, 6 Dec 2004 03:53:56 GMT Message-Id: <200412060353.iB63ruCl040984@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 66512 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes <p4-projects.freebsd.org> List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/p4-projects>, <mailto:p4-projects-request@freebsd.org?subject=unsubscribe> List-Archive: <http://lists.freebsd.org/pipermail/p4-projects> List-Post: <mailto:p4-projects@freebsd.org> List-Help: <mailto:p4-projects-request@freebsd.org?subject=help> List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/p4-projects>, <mailto:p4-projects-request@freebsd.org?subject=subscribe> X-List-Received-Date: Mon, 06 Dec 2004 03:53:58 -0000 http://perforce.freebsd.org/chv.cgi?CH=66512 Change 66512 by sam@sam_ebb on 2004/12/06 03:53:41 Fix memory allocation for dma descriptors: use a tag/descriptor block so we specify the proper size of memory to allocate instead of inheriting maxmem from the tag used for frame handling. This reduces memory use on i386 from ~900K to ~90K. Affected files ... .. //depot/projects/wifi/sys/dev/ath/if_ath.c#39 edit .. //depot/projects/wifi/sys/dev/ath/if_athvar.h#16 edit Differences ... ==== //depot/projects/wifi/sys/dev/ath/if_ath.c#39 (text+ko) ==== @@ -2114,32 +2114,52 @@ __func__, name, nbuf, ndesc); dd->dd_name = name; + dd->dd_desc_len = sizeof(struct ath_desc) * nbuf * ndesc; + + /* + * Setup DMA descriptor area. + */ + error = bus_dma_tag_create(NULL, /* parent */ + PAGE_SIZE, 0, /* alignment, bounds */ + BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + dd->dd_desc_len, /* maxsize */ + 1, /* nsegments */ + BUS_SPACE_MAXADDR, /* maxsegsize */ + BUS_DMA_ALLOCNOW, /* flags */ + NULL, /* lockfunc */ + NULL, /* lockarg */ + &dd->dd_dmat); + if (error != 0) { + if_printf(ifp, "cannot allocate %s DMA tag\n", dd->dd_name); + return error; + } /* allocate descriptors */ - dd->dd_desc_len = sizeof(struct ath_desc) * nbuf * ndesc; - error = bus_dmamap_create(sc->sc_dmat, BUS_DMA_NOWAIT, &dd->dd_dmamap); + error = bus_dmamap_create(dd->dd_dmat, BUS_DMA_NOWAIT, &dd->dd_dmamap); if (error != 0) { if_printf(ifp, "unable to create dmamap for %s descriptors, " "error %u\n", dd->dd_name, error); - return error; + goto fail0; } - error = bus_dmamem_alloc(sc->sc_dmat, (void**) &dd->dd_desc, + error = bus_dmamem_alloc(dd->dd_dmat, (void**) &dd->dd_desc, BUS_DMA_NOWAIT, &dd->dd_dmamap); if (error != 0) { if_printf(ifp, "unable to alloc memory for %u %s descriptors, " "error %u\n", nbuf * ndesc, dd->dd_name, error); - goto fail0; + goto fail1; } - error = bus_dmamap_load(sc->sc_dmat, dd->dd_dmamap, + error = bus_dmamap_load(dd->dd_dmat, dd->dd_dmamap, dd->dd_desc, dd->dd_desc_len, ath_load_cb, &dd->dd_desc_paddr, BUS_DMA_NOWAIT); if (error != 0) { if_printf(ifp, "unable to map %s descriptors, error %u\n", dd->dd_name, error); - goto fail1; + goto fail2; } ds = dd->dd_desc; @@ -2153,7 +2173,7 @@ if (bf == NULL) { if_printf(ifp, "malloc of %s buffers failed, size %u\n", dd->dd_name, bsize); - goto fail2; + goto fail3; } dd->dd_bufptr = bf; @@ -2172,12 +2192,14 @@ STAILQ_INSERT_TAIL(head, bf, bf_list); } return 0; +fail3: + bus_dmamap_unload(dd->dd_dmat, dd->dd_dmamap); fail2: - bus_dmamap_unload(sc->sc_dmat, dd->dd_dmamap); + bus_dmamem_free(dd->dd_dmat, dd->dd_desc, dd->dd_dmamap); fail1: - bus_dmamem_free(sc->sc_dmat, dd->dd_desc, dd->dd_dmamap); + bus_dmamap_destroy(dd->dd_dmat, dd->dd_dmamap); fail0: - bus_dmamap_destroy(sc->sc_dmat, dd->dd_dmamap); + bus_dma_tag_destroy(dd->dd_dmat); memset(dd, 0, sizeof(*dd)); return error; #undef DS2PHYS @@ -2190,9 +2212,10 @@ struct ath_buf *bf; struct ieee80211_node *ni; - bus_dmamap_unload(sc->sc_dmat, dd->dd_dmamap); - bus_dmamem_free(sc->sc_dmat, dd->dd_desc, dd->dd_dmamap); - bus_dmamap_destroy(sc->sc_dmat, dd->dd_dmamap); + bus_dmamap_unload(dd->dd_dmat, dd->dd_dmamap); + bus_dmamem_free(dd->dd_dmat, dd->dd_desc, dd->dd_dmamap); + bus_dmamap_destroy(dd->dd_dmat, dd->dd_dmamap); + bus_dma_tag_destroy(dd->dd_dmat); STAILQ_FOREACH(bf, head, bf_list) { if (bf->bf_m) { ==== //depot/projects/wifi/sys/dev/ath/if_athvar.h#16 (text+ko) ==== @@ -103,6 +103,7 @@ bus_addr_t dd_desc_paddr; /* physical addr of dd_desc */ bus_addr_t dd_desc_len; /* size of dd_desc */ bus_dma_segment_t dd_dseg; + bus_dma_tag_t dd_dmat; /* bus DMA tag */ bus_dmamap_t dd_dmamap; /* DMA map for descriptors */ struct ath_buf *dd_bufptr; /* associated buffers */ };