From: Oliver Kurth Date: Fri, 26 Oct 2018 17:44:57 +0000 (-0700) Subject: Accomodate kmem_malloc() and kmem_free() changes in FreeBSD 12 X-Git-Tag: stable-11.0.0~378 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=741a58d63943823568488080cc53b30c35e51530;p=thirdparty%2Fopen-vm-tools.git Accomodate kmem_malloc() and kmem_free() changes in FreeBSD 12 The kmem_alloc() and kmem_free() APIs have been changed in the upcoming FreeBSD 12.0 release. The change was to drop the now unused arena parameter from both functions. This fix defines and uses several macros whose definitions are specific to FreeBSD version 10, 11 and 12 kernel memory API changes. Github open-vm-tools pull request from Josh Paetzel. https://github.com/vmware/open-vm-tools/pull/286 --- diff --git a/open-vm-tools/AUTHORS b/open-vm-tools/AUTHORS index 9f433866a..6c64a5005 100644 --- a/open-vm-tools/AUTHORS +++ b/open-vm-tools/AUTHORS @@ -39,3 +39,6 @@ Steve Wills Fix vmmemctl.ko driver build for supported FreeBSD releases. John Eismeier Propose fix some spelling. - https://github.com/vmware/open-vm-tools/pull/264 + +Josh Paetzel Additional changes to vmmemctl.ko for FreeBSD 12.0 API changes. + - https://github.com/vmware/open-vm-tools/pull/286 diff --git a/open-vm-tools/modules/freebsd/vmmemctl/os.c b/open-vm-tools/modules/freebsd/vmmemctl/os.c index 0894abfb6..2cfdfa845 100644 --- a/open-vm-tools/modules/freebsd/vmmemctl/os.c +++ b/open-vm-tools/modules/freebsd/vmmemctl/os.c @@ -109,6 +109,36 @@ MALLOC_DEFINE(M_VMMEMCTL, BALLOON_NAME, "vmmemctl metadata"); #define VM_SYS_PAGES vm_cnt.v_page_count #endif +/* + * The kmem_malloc() and kmem_free() APIs changed at different times during + * the FreeBSD 12.0 ALPHA snapshot releases. The difference in the + * __FreeBSD_version values for FreeBSD 12.0 in the following macros are + * consistent with when each API was changed. + */ +#if __FreeBSD_version < 1000000 + #define KVA_ALLOC(size) kmem_alloc_nofault(kernel_map, size) + #define KVA_FREE(offset, size) kmem_free(kernel_map, offset, size) +#else + #define KVA_ALLOC(size) kva_alloc(size); + #define KVA_FREE(offset, size) kva_free(offset, size) +#endif + +#if __FreeBSD_version < 1000000 + #define KMEM_ALLOC(size) kmem_alloc(kernel_map, size) +#elif __FreeBSD_version < 1200080 + #define KMEM_ALLOC(size) kmem_malloc(kernel_arena, size, M_WAITOK | M_ZERO) +#else + #define KMEM_ALLOC(size) kmem_malloc(size, M_WAITOK | M_ZERO) +#endif + +#if __FreeBSD_version < 1000000 + #define KMEM_FREE(offset, size) kmem_free(kernel_map, offset, size) +#elif __FreeBSD_version < 1200083 + #define KMEM_FREE(offset, size) kmem_free(kernel_arena, offset, size) +#else + #define KMEM_FREE(offset, size) kmem_free(offset, size) +#endif + /* * Globals */ @@ -322,11 +352,7 @@ OS_ReservedPageGetHandle(PA64 pa) // IN Mapping OS_MapPageHandle(PageHandle handle) // IN { -#if __FreeBSD_version < 1000000 - vm_offset_t res = kmem_alloc_nofault(kernel_map, PAGE_SIZE); -#else - vm_offset_t res = kva_alloc(PAGE_SIZE); -#endif + vm_offset_t res = KVA_ALLOC(PAGE_SIZE); vm_page_t page = (vm_page_t)handle; @@ -384,11 +410,7 @@ void OS_UnmapPage(Mapping mapping) // IN { pmap_qremove((vm_offset_t)mapping, 1); -#if __FreeBSD_version < 1000000 - kmem_free(kernel_map, (vm_offset_t)mapping, PAGE_SIZE); -#else - kva_free((vm_offset_t)mapping, PAGE_SIZE); -#endif + KVA_FREE((vm_offset_t)mapping, PAGE_SIZE); } @@ -405,22 +427,14 @@ os_pmap_alloc(os_pmap *p) // IN p->size = (p->size + sizeof(unsigned long) - 1) & ~(sizeof(unsigned long) - 1); -#if __FreeBSD_version < 1000000 - p->bitmap = (unsigned long *)kmem_alloc(kernel_map, p->size); -#else - p->bitmap = (unsigned long *)kmem_malloc(kernel_arena, p->size, M_WAITOK | M_ZERO); -#endif + p->bitmap = (unsigned long *)KMEM_ALLOC(p->size); } static void os_pmap_free(os_pmap *p) // IN { -#if __FreeBSD_version < 1000000 - kmem_free(kernel_map, (vm_offset_t)p->bitmap, p->size); -#else - kmem_free(kernel_arena, (vm_offset_t)p->bitmap, p->size); -#endif + KMEM_FREE((vm_offset_t)p->bitmap, p->size); p->size = 0; p->bitmap = NULL; }