From 6d68eec474cd4f3a1ce83211d9bd75025c3a62a9 Mon Sep 17 00:00:00 2001 From: iedowse Date: Mon, 2 Aug 2004 13:59:02 +0000 Subject: [PATCH] When searching for a suitable block of memory on the free list, skip blocks that are too big by a factor of two or greater. This avoids some cases of extremely inefficient memory use that can occur when large (e.g. 64k) blocks on the free list get used when allocating a 4k chunk of 64-byte fragments. Because fragments have their own free list, the 60k difference got lost forever every time. --- sys/dev/usb/usb_mem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/dev/usb/usb_mem.c b/sys/dev/usb/usb_mem.c index 73b309db4b1c..82b678e82b5c 100644 --- a/sys/dev/usb/usb_mem.c +++ b/sys/dev/usb/usb_mem.c @@ -142,7 +142,8 @@ usb_block_allocmem(bus_dma_tag_t tag, size_t size, size_t align, s = splusb(); /* First check the free list. */ for (p = LIST_FIRST(&usb_blk_freelist); p; p = LIST_NEXT(p, next)) { - if (p->tag == tag && p->size >= size && p->align >= align) { + if (p->tag == tag && p->size >= size && p->size < size * 2 && + p->align >= align) { LIST_REMOVE(p, next); usb_blk_nfree--; splx(s);