diff options
author | 2021-01-13 01:04:49 +0000 | |
---|---|---|
committer | 2021-01-13 01:04:49 +0000 | |
commit | 1673f09a40940493856db8f67271437f4f6e82d2 (patch) | |
tree | 7aaf380d87696a68c3dfd132be2834668ea51fb6 /sys/dev/pci/drm/drm_linux.c | |
parent | Add pflog(4) tests for IPv6. (diff) | |
download | wireguard-openbsd-1673f09a40940493856db8f67271437f4f6e82d2.tar.xz wireguard-openbsd-1673f09a40940493856db8f67271437f4f6e82d2.zip |
revert drm vmalloc changes
It is suspected they were to blame for a machine with inteldrm running X
(xterms and chromium) running out of resources after a few days.
ok kettenis@
Diffstat (limited to 'sys/dev/pci/drm/drm_linux.c')
-rw-r--r-- | sys/dev/pci/drm/drm_linux.c | 111 |
1 files changed, 1 insertions, 110 deletions
diff --git a/sys/dev/pci/drm/drm_linux.c b/sys/dev/pci/drm/drm_linux.c index a893c4de89b..55462ad34a7 100644 --- a/sys/dev/pci/drm/drm_linux.c +++ b/sys/dev/pci/drm/drm_linux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: drm_linux.c,v 1.75 2021/01/08 23:02:09 kettenis Exp $ */ +/* $OpenBSD: drm_linux.c,v 1.76 2021/01/13 01:04:49 jsg Exp $ */ /* * Copyright (c) 2013 Jonathan Gray <jsg@openbsd.org> * Copyright (c) 2015, 2016 Mark Kettenis <kettenis@openbsd.org> @@ -430,111 +430,6 @@ dmi_check_system(const struct dmi_system_id *sysid) return (num); } -struct vmalloc_entry { - const void *addr; - size_t size; - RBT_ENTRY(vmalloc_entry) vmalloc_node; -}; - -struct pool vmalloc_pool; -RBT_HEAD(vmalloc_tree, vmalloc_entry) vmalloc_tree; - -RBT_PROTOTYPE(vmalloc_tree, vmalloc_entry, vmalloc_node, vmalloc_compare); - -static inline int -vmalloc_compare(const struct vmalloc_entry *a, const struct vmalloc_entry *b) -{ - vaddr_t va = (vaddr_t)a->addr; - vaddr_t vb = (vaddr_t)b->addr; - - return va < vb ? -1 : va > vb; -} - -RBT_GENERATE(vmalloc_tree, vmalloc_entry, vmalloc_node, vmalloc_compare); - -bool -is_vmalloc_addr(const void *addr) -{ - struct vmalloc_entry key; - struct vmalloc_entry *entry; - - key.addr = addr; - entry = RBT_FIND(vmalloc_tree, &vmalloc_tree, &key); - return (entry != NULL); -} - -void * -vmalloc(unsigned long size) -{ - struct vmalloc_entry *entry; - void *addr; - - size = round_page(size); - addr = km_alloc(size, &kv_any, &kp_dirty, &kd_waitok); - if (addr) { - entry = pool_get(&vmalloc_pool, PR_WAITOK); - entry->addr = addr; - entry->size = size; - RBT_INSERT(vmalloc_tree, &vmalloc_tree, entry); - } - - return addr; -} - -void * -vzalloc(unsigned long size) -{ - struct vmalloc_entry *entry; - void *addr; - - size = round_page(size); - addr = km_alloc(size, &kv_any, &kp_zero, &kd_waitok); - if (addr) { - entry = pool_get(&vmalloc_pool, PR_WAITOK); - entry->addr = addr; - entry->size = size; - RBT_INSERT(vmalloc_tree, &vmalloc_tree, entry); - } - - return addr; -} - -void -vfree(const void *addr) -{ - struct vmalloc_entry key; - struct vmalloc_entry *entry; - - key.addr = addr; - entry = RBT_FIND(vmalloc_tree, &vmalloc_tree, &key); - if (entry == NULL) - panic("%s: non vmalloced addr %p", __func__, addr); - - RBT_REMOVE(vmalloc_tree, &vmalloc_tree, entry); - km_free((void *)addr, entry->size, &kv_any, &kp_dirty); - pool_put(&vmalloc_pool, entry); -} - -void * -kvmalloc(size_t size, gfp_t flags) -{ - if ((flags & M_NOWAIT) || size < PAGE_SIZE) - return malloc(size, M_DRM, flags); - if (flags & M_ZERO) - return vzalloc(size); - else - return vmalloc(size); -} - -void -kvfree(const void *addr) -{ - if (is_vmalloc_addr(addr)) - vfree(addr); - else - free((void *)addr, M_DRM, 0); -} - struct vm_page * alloc_pages(unsigned int gfp_mask, unsigned int order) { @@ -2044,10 +1939,6 @@ drm_linux_init(void) pool_init(&idr_pool, sizeof(struct idr_entry), 0, IPL_TTY, 0, "idrpl", NULL); - - pool_init(&vmalloc_pool, sizeof(struct vmalloc_entry), 0, IPL_NONE, 0, - "vmallocpl", NULL); - RBT_INIT(vmalloc_tree, &vmalloc_tree); } void |