Deleted Added
full compact
29c29
< __FBSDID("$FreeBSD: head/sys/vm/memguard.c 238502 2012-07-15 20:29:48Z mdf $");
---
> __FBSDID("$FreeBSD: head/sys/vm/memguard.c 254025 2013-08-07 06:21:20Z jeff $");
50a51
> #include <sys/vmem.h>
102c103
< static vm_map_t memguard_map = NULL;
---
> static vmem_t *memguard_map = NULL;
103a105
> static vm_offset_t memguard_base;
115c117
< &memguard_mapsize, 0, "MemGuard private vm_map size");
---
> &memguard_mapsize, 0, "MemGuard private arena size");
203c205
< memguard_init(vm_map_t parent_map)
---
> memguard_init(vmem_t *parent)
205c207
< vm_offset_t base, limit;
---
> vm_offset_t base;
207,212c209,211
< memguard_map = kmem_suballoc(parent_map, &base, &limit,
< memguard_mapsize, FALSE);
< memguard_map->system_map = 1;
< KASSERT(memguard_mapsize == limit - base,
< ("Expected %lu, got %lu", (u_long)memguard_mapsize,
< (u_long)(limit - base)));
---
> vmem_alloc(parent, memguard_mapsize, M_WAITOK, &base);
> memguard_map = vmem_create("memguard arena", base, memguard_mapsize,
> PAGE_SIZE, 0, M_WAITOK);
213a213
> memguard_base = base;
217d216
< printf("\tMEMGUARD map limit: 0x%lx\n", (u_long)limit);
233c232
< &memguard_map->min_offset, "MemGuard KVA base");
---
> &memguard_base, "MemGuard KVA base");
235c234,235
< &memguard_map->max_offset, "MemGuard KVA end");
---
> &memguard_mapsize, "MemGuard KVA size");
> #if 0
237a238
> #endif
265a267,281
> static u_long *
> v2sizev(vm_offset_t va)
> {
> vm_paddr_t pa;
> struct vm_page *p;
>
> pa = pmap_kextract(va);
> if (pa == 0)
> panic("MemGuard detected double-free of %p", (void *)va);
> p = PHYS_TO_VM_PAGE(pa);
> KASSERT(p->wire_count != 0 && p->queue == PQ_NONE,
> ("MEMGUARD: Expected wired page %p in vtomgfifo!", p));
> return ((u_long *)&p->pageq.tqe_prev);
> }
>
292d307
< vm_map_lock(memguard_map);
299c314
< if (memguard_map->size >= memguard_physlimit &&
---
> if (vmem_size(memguard_map, VMEM_ALLOC) >= memguard_physlimit &&
316,318c331,332
< rv = vm_map_findspace(memguard_map, memguard_cursor,
< size_v, &addr);
< if (rv == KERN_SUCCESS)
---
> if (vmem_xalloc(memguard_map, size_v, 0, 0, 0, memguard_cursor,
> VMEM_ADDR_MAX, M_BESTFIT | M_NOWAIT, &addr) == 0)
325c339
< if (memguard_cursor == vm_map_min(memguard_map)) {
---
> if (memguard_cursor == memguard_base) {
331c345
< memguard_cursor = vm_map_min(memguard_map);
---
> memguard_cursor = memguard_base;
335c349
< rv = kmem_back(memguard_map, addr, size_p, flags);
---
> rv = kmem_back(kmem_object, addr, size_p, flags);
336a351
> vmem_xfree(memguard_map, addr, size_v);
341c356
< memguard_cursor = addr + size_p;
---
> memguard_cursor = addr + size_v;
342a358
> *v2sizev(trunc_page(addr)) = size_v;
357d372
< vm_map_unlock(memguard_map);
366c381
< return (a >= memguard_map->min_offset && a < memguard_map->max_offset);
---
> return (a >= memguard_base && a < memguard_base + memguard_mapsize);
376c391
< u_long req_size, size;
---
> u_long req_size, size, sizev;
381a397
> sizev = *v2sizev(addr);
403c419,422
< vm_map_lock(memguard_map);
---
> kmem_unback(kmem_object, addr, size);
> if (sizev > size)
> addr -= PAGE_SIZE;
> vmem_xfree(memguard_map, addr, sizev);
406,407d424
< (void)vm_map_delete(memguard_map, addr, addr + size);
< vm_map_unlock(memguard_map);