uma_machdep.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*-
  2. * Copyright (c) 2003 The FreeBSD Project
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions
  7. * are met:
  8. *
  9. * 1. Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  16. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  17. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  18. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  19. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  20. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  21. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  22. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  24. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #include <sys/cdefs.h>
  27. __FBSDID("$FreeBSD$");
  28. #include <sys/param.h>
  29. #include <sys/systm.h>
  30. #include <sys/malloc.h>
  31. #include <sys/sysctl.h>
  32. #include <vm/vm.h>
  33. #include <vm/vm_param.h>
  34. #include <vm/pmap.h>
  35. #include <vm/vm_page.h>
  36. #include <vm/vm_dumpset.h>
  37. #include <vm/uma.h>
  38. #include <vm/uma_int.h>
  39. #include <machine/md_var.h>
  40. static int hw_uma_mdpages;
  41. SYSCTL_INT(_hw, OID_AUTO, uma_mdpages, CTLFLAG_RD, &hw_uma_mdpages, 0,
  42. "UMA MD pages in use");
  43. void *
  44. uma_small_alloc(uma_zone_t zone, vm_size_t bytes, int domain, u_int8_t *flags,
  45. int wait)
  46. {
  47. void *va;
  48. vm_paddr_t pa;
  49. vm_page_t m;
  50. *flags = UMA_SLAB_PRIV;
  51. m = vm_page_alloc_domain(NULL, 0, domain,
  52. malloc2vm_flags(wait) | VM_ALLOC_WIRED | VM_ALLOC_NOOBJ);
  53. if (m == NULL)
  54. return (NULL);
  55. pa = VM_PAGE_TO_PHYS(m);
  56. #ifdef __powerpc64__
  57. if ((wait & M_NODUMP) == 0)
  58. dump_add_page(pa);
  59. #endif
  60. if (!hw_direct_map) {
  61. pmap_kenter(pa, pa);
  62. va = (void *)(vm_offset_t)pa;
  63. } else {
  64. va = (void *)(vm_offset_t)PHYS_TO_DMAP(pa);
  65. }
  66. if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0)
  67. bzero(va, PAGE_SIZE);
  68. atomic_add_int(&hw_uma_mdpages, 1);
  69. return (va);
  70. }
  71. void
  72. uma_small_free(void *mem, vm_size_t size, u_int8_t flags)
  73. {
  74. vm_page_t m;
  75. if (hw_direct_map)
  76. m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)mem));
  77. else {
  78. m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)mem));
  79. pmap_kremove((vm_offset_t)mem);
  80. }
  81. KASSERT(m != NULL,
  82. ("Freeing UMA block at %p with no associated page", mem));
  83. #ifdef __powerpc64__
  84. dump_drop_page(VM_PAGE_TO_PHYS(m));
  85. #endif
  86. vm_page_unwire_noq(m);
  87. vm_page_free(m);
  88. atomic_subtract_int(&hw_uma_mdpages, 1);
  89. }