Hi Ian,
Please find attached a patch which disable the double mapping of
allocated DMA capable buffers in the USB stack for all drivers.
Can you test it and check out the total memory usage before and after
the patch? Also verify it if makes any difference on any platforms.
Thank you!
--HPS
Index: sys/dev/usb/usb_transfer.c
===================================================================
--- sys/dev/usb/usb_transfer.c (revision 277240)
+++ sys/dev/usb/usb_transfer.c (working copy)
@@ -237,7 +237,7 @@
n_obj = 1;
} else {
/* compute number of objects per page */
- n_obj = (USB_PAGE_SIZE / size);
+ n_obj = 1; /* (USB_PAGE_SIZE / size); */
/*
* Compute number of DMA chunks, rounded up
* to nearest one:
@@ -273,8 +273,11 @@
&parm->curr_xfer->xroot->dma_parent_tag;
}
- if (ppc) {
- *ppc = parm->xfer_page_cache_ptr;
+ if (ppc != NULL) {
+ if (n_obj != 1)
+ *ppc = parm->xfer_page_cache_ptr;
+ else
+ *ppc = parm->dma_page_cache_ptr;
}
r = count; /* set remainder count */
z = n_obj * size; /* set allocation size */
@@ -281,7 +284,18 @@
pc = parm->xfer_page_cache_ptr;
pg = parm->dma_page_ptr;
- for (x = 0; x != n_dma_pc; x++) {
+ if (n_obj == 1) {
+ for (x = 0; x != n_dma_pc; x++) {
+ if (usb_pc_alloc_mem(parm->dma_page_cache_ptr,
+ pg, z, align)) {
+ return (1); /* failure */
+ }
+ /* Make room for one DMA page cache and "n_dma_pg" pages */
+ parm->dma_page_cache_ptr++;
+ pg += n_dma_pg;
+ }
+ } else {
+ for (x = 0; x != n_dma_pc; x++) {
if (r < n_obj) {
/* compute last remainder */
@@ -294,7 +308,7 @@
}
/* Set beginning of current buffer */
buf = parm->dma_page_cache_ptr->buffer;
- /* Make room for one DMA page cache and one page */
+ /* Make room for one DMA page cache and "n_dma_pg" pages */
parm->dma_page_cache_ptr++;
pg += n_dma_pg;
@@ -314,6 +328,7 @@
}
mtx_unlock(pc->tag_parent->mtx);
}
+ }
}
parm->xfer_page_cache_ptr = pc;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to "[email protected]"