void *freelist_get_dma(struct freelist *list, BUS_ADDRESS *busaddr) { void *result; HPT_ASSERT(list->dma); result = freelist_get(list); if (result) *busaddr = *(BUS_ADDRESS *)((void **)result+1); return result; }
void freelist_to_bitarray (unsigned char *s, char const *freelist, unsigned int sp, unsigned int max) { register unsigned int i = 0 ; bitarray_setn(s, 0, max) ; for (; i < sp ; i++) { register unsigned int j = freelist_get(freelist, max, i) ; bitarray_clear(s, j) ; } }
unsigned int freelist_pop (char const *s, unsigned int *sp, unsigned int max) { register unsigned int esize = freelist_size(max) ; #ifdef DEBUG lolprintf("Entering freelist_pop: %u numbers of size %u, max is %u\n", *sp/esize, esize, max) ; buffer_flush(buffer_1) ; #endif if (!*sp) return max ; *sp -= esize ; return freelist_get(s, max, *sp / esize) ; }
static void hpt_free_mem(PVBUS_EXT vbus_ext) { struct freelist *f; void *p; int i; BUS_ADDRESS bus; for (f=vbus_ext->freelist_head; f; f=f->next) { #if DBG if (f->count!=f->reserved_count) { KdPrint(("memory leak for freelist %s (%d/%d)", f->tag, f->count, f->reserved_count)); } #endif while ((p=freelist_get(f))) free(p, M_DEVBUF); } for (i=0; i<os_max_cache_pages; i++) { p = dmapool_get_page((PVBUS)vbus_ext->vbus, &bus); HPT_ASSERT(p); free_pages(p, 0); } for (f=vbus_ext->freelist_dma_head; f; f=f->next) { int order, size; #if DBG if (f->count!=f->reserved_count) { KdPrint(("memory leak for dma freelist %s (%d/%d)", f->tag, f->count, f->reserved_count)); } #endif for (order=0, size=PAGE_SIZE; size<f->size; order++, size<<=1) ; while ((p=freelist_get_dma(f, &bus))) { if (order) free_pages(p, order); else { /* can't free immediately since other blocks in this page may still be in the list */ if (((HPT_UPTR)p & (PAGE_SIZE-1))==0) dmapool_put_page((PVBUS)vbus_ext->vbus, p, bus); } } } while ((p = dmapool_get_page((PVBUS)vbus_ext->vbus, &bus))) free_pages(p, 0); }
static HANDLE fe_get_event() { return (HANDLE)freelist_get(&event_freelist); }