2008/12/3 Mark Tinguely <[EMAIL PROTECTED]>
> > 2008/12/3 Mark Tinguely <[EMAIL PROTECTED]> > > > > > on 3 Dec 2008 15:35:27, Alexej Sokolov <[EMAIL PROTECTED]> > asked: > > > > > > > Hello, > > > > If I allocate memory from a kernel module: > > > > MALLOC(addr, vm_offset_t, PAGE_SIZE, M_DEVBUF, M_WAITOK | M_ZERO); > > > > > > > > how can I get a pointer to vm_map_entry structure which describes > the > > > memory > > > > region where "addr" is ? > > > > > > > > Thanks, > > > > Alexey > > > > > > MALLOC is a macro for malloc() which returns a kernel virtual address > into > > > the variable addr in this case. > > > > > > You want to find the vm_map_entry, use something like: > > > > > > vm_map_entry_t *result; > > > if (vm_map_lookup_entry(kernel_map, addr, result)) { > > > /* found */ > > > } else { > > > /* not found */ > > > } > > > > > > 1. Should i use any locks or mutex for doing it ? > > Good question, it really should be: > > vm_map_lock(map); > > > 2. What map is used by MALLOC? It can be a some submap. Should i use > then a > > submap for searching entry? > > I thought originally that malloc() allocated memory from kernel map > (kernel_map), but on closer inspection, malloc() seems to use the > default UMA zone allocator [page_alloc()] which takes the memory from > the kmem_map. Which I should have know, big mallocs fill the kmem space. > sooo I guess the more correct code would be: > > vm_map_entry_t result; > vm_map_lock(kmem_map); > if (vm_map_lookup_entry(kmem_map, addr, &result)) { > /* found */ > } else { > /* not found */ > } > vm_map_unlock(kmem_map); > > Ok, thanks a lot! _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"