summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2013-08-07 06:21:20 +0000
committerjeff <jeff@FreeBSD.org>2013-08-07 06:21:20 +0000
commitde4ecca21340ce4d0bf9182cac133c14e031218e (patch)
tree950bad07f0aeeeae78036d82b9aa11ae998c3654 /sys/dev
parente141f5c0bac3839e4886a26e1ba796f4e46e6455 (diff)
downloadFreeBSD-src-de4ecca21340ce4d0bf9182cac133c14e031218e.zip
FreeBSD-src-de4ecca21340ce4d0bf9182cac133c14e031218e.tar.gz
Replace kernel virtual address space allocation with vmem. This provides
transparent layering and better fragmentation. - Normalize functions that allocate memory to use kmem_* - Those that allocate address space are named kva_* - Those that operate on maps are named kmap_* - Implement recursive allocation handling for kmem_arena in vmem. Reviewed by: alc Tested by: pho Sponsored by: EMC / Isilon Storage Division
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/bktr/bktr_core.c7
-rw-r--r--sys/dev/drm/drm_scatter.c4
-rw-r--r--sys/dev/drm2/drm_scatter.c4
-rw-r--r--sys/dev/drm2/i915/intel_ringbuffer.c9
-rw-r--r--sys/dev/drm2/ttm/ttm_bo_util.c5
-rw-r--r--sys/dev/xen/blkback/blkback.c4
-rw-r--r--sys/dev/xen/netback/netback.c4
-rw-r--r--sys/dev/xen/xenpci/xenpci.c2
8 files changed, 20 insertions, 19 deletions
diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c
index bc5bdcf..bb2ae33 100644
--- a/sys/dev/bktr/bktr_core.c
+++ b/sys/dev/bktr/bktr_core.c
@@ -109,6 +109,7 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/fcntl.h>
#include <sys/lock.h>
+#include <sys/malloc.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/signalvar.h>
@@ -1801,8 +1802,10 @@ video_ioctl( bktr_ptr_t bktr, int unit, ioctl_cmd_t cmd, caddr_t arg, struct thr
#else
buf = get_bktr_mem(unit, temp*PAGE_SIZE);
if (buf != 0) {
- kmem_free(kernel_map, bktr->bigbuf,
- (bktr->alloc_pages * PAGE_SIZE));
+ contigfree(
+ (void *)(uintptr_t)bktr->bigbuf,
+ (bktr->alloc_pages * PAGE_SIZE),
+ M_DEVBUF);
#endif
bktr->bigbuf = buf;
diff --git a/sys/dev/drm/drm_scatter.c b/sys/dev/drm/drm_scatter.c
index 9a1a4b1..1a78616 100644
--- a/sys/dev/drm/drm_scatter.c
+++ b/sys/dev/drm/drm_scatter.c
@@ -52,7 +52,7 @@ drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather *request)
entry->busaddr = malloc(entry->pages * sizeof(*entry->busaddr),
DRM_MEM_SGLISTS, M_WAITOK | M_ZERO);
- entry->vaddr = kmem_alloc_attr(kernel_map, size, M_WAITOK | M_ZERO,
+ entry->vaddr = kmem_alloc_attr(kernel_arena, size, M_WAITOK | M_ZERO,
0, BUS_SPACE_MAXADDR_32BIT, VM_MEMATTR_WRITE_COMBINING);
if (entry->vaddr == 0) {
drm_sg_cleanup(entry);
@@ -99,7 +99,7 @@ drm_sg_cleanup(struct drm_sg_mem *entry)
return;
if (entry->vaddr != 0)
- kmem_free(kernel_map, entry->vaddr, IDX_TO_OFF(entry->pages));
+ kmem_free(kernel_arena, entry->vaddr, IDX_TO_OFF(entry->pages));
free(entry->busaddr, DRM_MEM_SGLISTS);
free(entry, DRM_MEM_DRIVER);
diff --git a/sys/dev/drm2/drm_scatter.c b/sys/dev/drm2/drm_scatter.c
index ecf231f..3ff923c 100644
--- a/sys/dev/drm2/drm_scatter.c
+++ b/sys/dev/drm2/drm_scatter.c
@@ -52,7 +52,7 @@ drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather *request)
entry->busaddr = malloc(entry->pages * sizeof(*entry->busaddr),
DRM_MEM_SGLISTS, M_WAITOK | M_ZERO);
- entry->vaddr = kmem_alloc_attr(kernel_map, size, M_WAITOK | M_ZERO,
+ entry->vaddr = kmem_alloc_attr(kernel_arena, size, M_WAITOK | M_ZERO,
0, BUS_SPACE_MAXADDR_32BIT, VM_MEMATTR_WRITE_COMBINING);
if (entry->vaddr == 0) {
drm_sg_cleanup(entry);
@@ -99,7 +99,7 @@ drm_sg_cleanup(struct drm_sg_mem *entry)
return;
if (entry->vaddr != 0)
- kmem_free(kernel_map, entry->vaddr, IDX_TO_OFF(entry->pages));
+ kmem_free(kernel_arena, entry->vaddr, IDX_TO_OFF(entry->pages));
free(entry->busaddr, DRM_MEM_SGLISTS);
free(entry, DRM_MEM_DRIVER);
diff --git a/sys/dev/drm2/i915/intel_ringbuffer.c b/sys/dev/drm2/i915/intel_ringbuffer.c
index 107a211..7d6bd94 100644
--- a/sys/dev/drm2/i915/intel_ringbuffer.c
+++ b/sys/dev/drm2/i915/intel_ringbuffer.c
@@ -361,7 +361,7 @@ init_pipe_control(struct intel_ring_buffer *ring)
goto err_unref;
pc->gtt_offset = obj->gtt_offset;
- pc->cpu_page = (uint32_t *)kmem_alloc_nofault(kernel_map, PAGE_SIZE);
+ pc->cpu_page = (uint32_t *)kva_alloc(PAGE_SIZE);
if (pc->cpu_page == NULL)
goto err_unpin;
pmap_qenter((uintptr_t)pc->cpu_page, &obj->pages[0], 1);
@@ -392,7 +392,7 @@ cleanup_pipe_control(struct intel_ring_buffer *ring)
obj = pc->obj;
pmap_qremove((vm_offset_t)pc->cpu_page, 1);
- kmem_free(kernel_map, (uintptr_t)pc->cpu_page, PAGE_SIZE);
+ kva_free((uintptr_t)pc->cpu_page, PAGE_SIZE);
i915_gem_object_unpin(obj);
drm_gem_object_unreference(&obj->base);
@@ -968,7 +968,7 @@ static void cleanup_status_page(struct intel_ring_buffer *ring)
return;
pmap_qremove((vm_offset_t)ring->status_page.page_addr, 1);
- kmem_free(kernel_map, (vm_offset_t)ring->status_page.page_addr,
+ kva_free((vm_offset_t)ring->status_page.page_addr,
PAGE_SIZE);
i915_gem_object_unpin(obj);
drm_gem_object_unreference(&obj->base);
@@ -999,8 +999,7 @@ static int init_status_page(struct intel_ring_buffer *ring)
}
ring->status_page.gfx_addr = obj->gtt_offset;
- ring->status_page.page_addr = (void *)kmem_alloc_nofault(kernel_map,
- PAGE_SIZE);
+ ring->status_page.page_addr = (void *)kva_alloc(PAGE_SIZE);
if (ring->status_page.page_addr == NULL) {
memset(&dev_priv->hws_map, 0, sizeof(dev_priv->hws_map));
goto err_unpin;
diff --git a/sys/dev/drm2/ttm/ttm_bo_util.c b/sys/dev/drm2/ttm/ttm_bo_util.c
index b977acb..43b9d68 100644
--- a/sys/dev/drm2/ttm/ttm_bo_util.c
+++ b/sys/dev/drm2/ttm/ttm_bo_util.c
@@ -498,8 +498,7 @@ static int ttm_bo_kmap_ttm(struct ttm_buffer_object *bo,
ttm_io_prot(mem->placement);
map->bo_kmap_type = ttm_bo_map_vmap;
map->num_pages = num_pages;
- map->virtual = (void *)kmem_alloc_nofault(kernel_map,
- num_pages * PAGE_SIZE);
+ map->virtual = (void *)kva_alloc(num_pages * PAGE_SIZE);
if (map->virtual != NULL) {
for (i = 0; i < num_pages; i++) {
/* XXXKIB hack */
@@ -561,7 +560,7 @@ void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map)
break;
case ttm_bo_map_vmap:
pmap_qremove((vm_offset_t)(map->virtual), map->num_pages);
- kmem_free(kernel_map, (vm_offset_t)map->virtual,
+ kva_free((vm_offset_t)map->virtual,
map->num_pages * PAGE_SIZE);
break;
case ttm_bo_map_kmap:
diff --git a/sys/dev/xen/blkback/blkback.c b/sys/dev/xen/blkback/blkback.c
index 9c92309..4208702 100644
--- a/sys/dev/xen/blkback/blkback.c
+++ b/sys/dev/xen/blkback/blkback.c
@@ -2775,7 +2775,7 @@ xbb_free_communication_mem(struct xbb_softc *xbb)
{
if (xbb->kva != 0) {
#ifndef XENHVM
- kmem_free(kernel_map, xbb->kva, xbb->kva_size);
+ kva_free(xbb->kva, xbb->kva_size);
#else
if (xbb->pseudo_phys_res != NULL) {
bus_release_resource(xbb->dev, SYS_RES_MEMORY,
@@ -3014,7 +3014,7 @@ xbb_alloc_communication_mem(struct xbb_softc *xbb)
device_get_nameunit(xbb->dev), xbb->kva_size,
xbb->reqlist_kva_size);
#ifndef XENHVM
- xbb->kva = kmem_alloc_nofault(kernel_map, xbb->kva_size);
+ xbb->kva = kva_alloc(xbb->kva_size);
if (xbb->kva == 0)
return (ENOMEM);
xbb->gnt_base_addr = xbb->kva;
diff --git a/sys/dev/xen/netback/netback.c b/sys/dev/xen/netback/netback.c
index 4c78113..80a1d61 100644
--- a/sys/dev/xen/netback/netback.c
+++ b/sys/dev/xen/netback/netback.c
@@ -621,7 +621,7 @@ xnb_free_communication_mem(struct xnb_softc *xnb)
{
if (xnb->kva != 0) {
#ifndef XENHVM
- kmem_free(kernel_map, xnb->kva, xnb->kva_size);
+ kva_free(xnb->kva, xnb->kva_size);
#else
if (xnb->pseudo_phys_res != NULL) {
bus_release_resource(xnb->dev, SYS_RES_MEMORY,
@@ -811,7 +811,7 @@ xnb_alloc_communication_mem(struct xnb_softc *xnb)
xnb->kva_size += xnb->ring_configs[i].ring_pages * PAGE_SIZE;
}
#ifndef XENHVM
- xnb->kva = kmem_alloc_nofault(kernel_map, xnb->kva_size);
+ xnb->kva = kva_alloc(xnb->kva_size);
if (xnb->kva == 0)
return (ENOMEM);
xnb->gnt_base_addr = xnb->kva;
diff --git a/sys/dev/xen/xenpci/xenpci.c b/sys/dev/xen/xenpci/xenpci.c
index f4c9f73..2d74676 100644
--- a/sys/dev/xen/xenpci/xenpci.c
+++ b/sys/dev/xen/xenpci/xenpci.c
@@ -383,7 +383,7 @@ xenpci_attach(device_t dev)
if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
panic("HYPERVISOR_memory_op failed");
- shared_va = kmem_alloc_nofault(kernel_map, PAGE_SIZE);
+ shared_va = kva_alloc(PAGE_SIZE);
pmap_kenter(shared_va, shared_info_pa);
HYPERVISOR_shared_info = (void *) shared_va;
OpenPOWER on IntegriCloud