We want to get rid of the uvm_km_valloc() interfaces in favour of
km_alloc(). This changes the calls in drm(4) over. The kv_physwait
struct is made static to prevent collission with a symbol in
vm_machdep.c on some architectures. The goal is to move this into
uvm/uvm_km.c eventually.
Just to make sure I didn't screw the conversion up somehow a few tests
on a mix of inteldrm(4) and amdgpu(4) systems would be good.
ok?
Index: dev/pci/drm/drm_linux.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v
retrieving revision 1.89
diff -u -p -r1.89 drm_linux.c
--- dev/pci/drm/drm_linux.c 21 Jan 2022 23:49:36 -0000 1.89
+++ dev/pci/drm/drm_linux.c 5 Feb 2022 10:40:22 -0000
@@ -564,6 +564,11 @@ __pagevec_release(struct pagevec *pvec)
pagevec_reinit(pvec);
}
+static struct kmem_va_mode kv_physwait = {
+ .kv_map = &phys_map,
+ .kv_wait = 1,
+};
+
void *
kmap(struct vm_page *pg)
{
@@ -572,7 +577,7 @@ kmap(struct vm_page *pg)
#if defined (__HAVE_PMAP_DIRECT)
va = pmap_map_direct(pg);
#else
- va = uvm_km_valloc_wait(phys_map, PAGE_SIZE);
+ va = (vaddr_t)km_alloc(PAGE_SIZE, &kv_physwait, &kp_none, &kd_waitok);
pmap_kenter_pa(va, VM_PAGE_TO_PHYS(pg), PROT_READ | PROT_WRITE);
pmap_update(pmap_kernel());
#endif
@@ -589,7 +594,7 @@ kunmap_va(void *addr)
#else
pmap_kremove(va, PAGE_SIZE);
pmap_update(pmap_kernel());
- uvm_km_free_wakeup(phys_map, va, PAGE_SIZE);
+ km_free((void *)va, PAGE_SIZE, &kv_physwait, &kp_none);
#endif
}
@@ -624,7 +629,8 @@ vmap(struct vm_page **pages, unsigned in
paddr_t pa;
int i;
- va = uvm_km_valloc(kernel_map, PAGE_SIZE * npages);
+ va = (vaddr_t)km_alloc(PAGE_SIZE * npages, &kv_any, &kp_none,
+ &kd_nowait);
if (va == 0)
return NULL;
for (i = 0; i < npages; i++) {
@@ -645,7 +651,7 @@ vunmap(void *addr, size_t size)
pmap_remove(pmap_kernel(), va, va + size);
pmap_update(pmap_kernel());
- uvm_km_free(kernel_map, va, size);
+ km_free((void *)va, size, &kv_any, &kp_none);
}
bool