Date: Mon, 6 Dec 2004 03:53:56 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 66512 for review Message-ID: <200412060353.iB63ruCl040984@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 */ };
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200412060353.iB63ruCl040984>