On Mon, Nov 12, 2012 at 11:35:42AM -0600, Alan Cox wrote:
> Agreed.  Most recently I eliminated several uses from the arm pmap
> implementations.  There is, however, one other use:
> 
> ofed/include/linux/gfp.h:#define        GFP_ATOMIC      (M_NOWAIT |
> M_USE_RESERVE)
Yes, I forgot to mention this. I have no idea about semantic  of
GFP_ATOMIC compat flag.

Below is the updated patch with two your notes applied.

diff --git a/sys/amd64/amd64/uma_machdep.c b/sys/amd64/amd64/uma_machdep.c
index dc9c307..ab1e869 100644
--- a/sys/amd64/amd64/uma_machdep.c
+++ b/sys/amd64/amd64/uma_machdep.c
@@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/lock.h>
+#include <sys/malloc.h>
 #include <sys/mutex.h>
 #include <sys/systm.h>
 #include <vm/vm.h>
@@ -48,12 +49,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, 
int wait)
        int pflags;
 
        *flags = UMA_SLAB_PRIV;
-       if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
-               pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED;
-       else
-               pflags = VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED;
-       if (wait & M_ZERO)
-               pflags |= VM_ALLOC_ZERO;
+       pflags = m2vm_flags(wait, VM_ALLOC_NOOBJ | VM_ALLOC_WIRED);
        for (;;) {
                m = vm_page_alloc(NULL, 0, pflags);
                if (m == NULL) {
diff --git a/sys/arm/arm/vm_machdep.c b/sys/arm/arm/vm_machdep.c
index f60cdb1..75366e3 100644
--- a/sys/arm/arm/vm_machdep.c
+++ b/sys/arm/arm/vm_machdep.c
@@ -651,12 +651,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t 
*flags, int wait)
                        ret = ((void *)kmem_malloc(kmem_map, bytes, M_NOWAIT));
                        return (ret);
                }
-               if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
-                       pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED;
-               else
-                       pflags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED;
-               if (wait & M_ZERO)
-                       pflags |= VM_ALLOC_ZERO;
+               pflags = m2vm_flags(wait, VM_ALLOC_WIRED);
                for (;;) {
                        m = vm_page_alloc(NULL, 0, pflags | VM_ALLOC_NOOBJ);
                        if (m == NULL) {
diff --git a/sys/fs/devfs/devfs_devs.c b/sys/fs/devfs/devfs_devs.c
index 71caa29..2ce1ca6 100644
--- a/sys/fs/devfs/devfs_devs.c
+++ b/sys/fs/devfs/devfs_devs.c
@@ -121,7 +121,7 @@ devfs_alloc(int flags)
        struct cdev *cdev;
        struct timespec ts;
 
-       cdp = malloc(sizeof *cdp, M_CDEVP, M_USE_RESERVE | M_ZERO |
+       cdp = malloc(sizeof *cdp, M_CDEVP, M_ZERO |
            ((flags & MAKEDEV_NOWAIT) ? M_NOWAIT : M_WAITOK));
        if (cdp == NULL)
                return (NULL);
diff --git a/sys/ia64/ia64/uma_machdep.c b/sys/ia64/ia64/uma_machdep.c
index 37353ff..9f77762 100644
--- a/sys/ia64/ia64/uma_machdep.c
+++ b/sys/ia64/ia64/uma_machdep.c
@@ -46,12 +46,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, 
int wait)
        int pflags;
 
        *flags = UMA_SLAB_PRIV;
-       if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
-               pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED;
-       else
-               pflags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED;
-       if (wait & M_ZERO)
-               pflags |= VM_ALLOC_ZERO;
+       pflags = m2vm_flags(wait, VM_ALLOC_WIRED);
 
        for (;;) {
                m = vm_page_alloc(NULL, 0, pflags | VM_ALLOC_NOOBJ);
diff --git a/sys/mips/mips/uma_machdep.c b/sys/mips/mips/uma_machdep.c
index 798e632..24baef0 100644
--- a/sys/mips/mips/uma_machdep.c
+++ b/sys/mips/mips/uma_machdep.c
@@ -48,11 +48,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, 
int wait)
        void *va;
 
        *flags = UMA_SLAB_PRIV;
-
-       if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
-               pflags = VM_ALLOC_INTERRUPT;
-       else
-               pflags = VM_ALLOC_SYSTEM;
+       pflags = m2vm_flags(wait, 0);
 
        for (;;) {
                m = pmap_alloc_direct_page(0, pflags);
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index a491680..3e320b9 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -1369,12 +1369,7 @@ moea64_uma_page_alloc(uma_zone_t zone, int bytes, 
u_int8_t *flags, int wait)
        *flags = UMA_SLAB_PRIV;
        needed_lock = !PMAP_LOCKED(kernel_pmap);
 
-        if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
-                pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED;
-        else
-                pflags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED;
-        if (wait & M_ZERO)
-                pflags |= VM_ALLOC_ZERO;
+       pflags = m2vm_flags(wait, VM_ALLOC_WIRED);
 
         for (;;) {
                 m = vm_page_alloc(NULL, 0, pflags | VM_ALLOC_NOOBJ);
diff --git a/sys/powerpc/aim/slb.c b/sys/powerpc/aim/slb.c
index 162c7fb..3882bfa 100644
--- a/sys/powerpc/aim/slb.c
+++ b/sys/powerpc/aim/slb.c
@@ -483,12 +483,7 @@ slb_uma_real_alloc(uma_zone_t zone, int bytes, u_int8_t 
*flags, int wait)
                realmax = platform_real_maxaddr();
 
        *flags = UMA_SLAB_PRIV;
-       if ((wait & (M_NOWAIT | M_USE_RESERVE)) == M_NOWAIT)
-               pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED;
-       else
-               pflags = VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED;
-       if (wait & M_ZERO)
-               pflags |= VM_ALLOC_ZERO;
+       pflags = m2vm_flags(wait, VM_ALLOC_NOOBJ | VM_ALLOC_WIRED);
 
        for (;;) {
                m = vm_page_alloc_contig(NULL, 0, pflags, 1, 0, realmax,
diff --git a/sys/powerpc/aim/uma_machdep.c b/sys/powerpc/aim/uma_machdep.c
index 39deb43..23a333f 100644
--- a/sys/powerpc/aim/uma_machdep.c
+++ b/sys/powerpc/aim/uma_machdep.c
@@ -56,12 +56,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *flags, 
int wait)
        int pflags;
        
        *flags = UMA_SLAB_PRIV;
-       if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
-               pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED;
-       else
-               pflags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED;
-       if (wait & M_ZERO)
-               pflags |= VM_ALLOC_ZERO;
+       pflags = m2vm_flags(wait, VM_ALLOC_WIRED);
 
        for (;;) {
                m = vm_page_alloc(NULL, 0, pflags | VM_ALLOC_NOOBJ);
diff --git a/sys/sparc64/sparc64/vm_machdep.c b/sys/sparc64/sparc64/vm_machdep.c
index cdb94c7..573ab3a 100644
--- a/sys/sparc64/sparc64/vm_machdep.c
+++ b/sys/sparc64/sparc64/vm_machdep.c
@@ -501,14 +501,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t 
*flags, int wait)
        PMAP_STATS_INC(uma_nsmall_alloc);
 
        *flags = UMA_SLAB_PRIV;
-
-       if ((wait & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
-               pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED;
-       else
-               pflags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED;
-
-       if (wait & M_ZERO)
-               pflags |= VM_ALLOC_ZERO;
+       pflags = m2vm_flags(wait, VM_ALLOC_WIRED);
 
        for (;;) {
                m = vm_page_alloc(NULL, 0, pflags | VM_ALLOC_NOOBJ);
diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c
index 46e7f1c..ad396f5 100644
--- a/sys/vm/vm_kern.c
+++ b/sys/vm/vm_kern.c
@@ -222,12 +222,7 @@ kmem_alloc_attr(vm_map_t map, vm_size_t size, int flags, 
vm_paddr_t low,
        vm_object_reference(object);
        vm_map_insert(map, object, offset, addr, addr + size, VM_PROT_ALL,
            VM_PROT_ALL, 0);
-       if ((flags & (M_NOWAIT | M_USE_RESERVE)) == M_NOWAIT)
-               pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_NOBUSY;
-       else
-               pflags = VM_ALLOC_SYSTEM | VM_ALLOC_NOBUSY;
-       if (flags & M_ZERO)
-               pflags |= VM_ALLOC_ZERO;
+       pflags = m2vm_flags(flags, VM_ALLOC_NOBUSY);
        VM_OBJECT_LOCK(object);
        end_offset = offset + size;
        for (; offset < end_offset; offset += PAGE_SIZE) {
@@ -296,14 +291,7 @@ kmem_alloc_contig(vm_map_t map, vm_size_t size, int flags, 
vm_paddr_t low,
        vm_object_reference(object);
        vm_map_insert(map, object, offset, addr, addr + size, VM_PROT_ALL,
            VM_PROT_ALL, 0);
-       if ((flags & (M_NOWAIT | M_USE_RESERVE)) == M_NOWAIT)
-               pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_NOBUSY;
-       else
-               pflags = VM_ALLOC_SYSTEM | VM_ALLOC_NOBUSY;
-       if (flags & M_ZERO)
-               pflags |= VM_ALLOC_ZERO;
-       if (flags & M_NODUMP)
-               pflags |= VM_ALLOC_NODUMP;
+       pflags = m2vm_flags(flags, VM_ALLOC_NOBUSY);
        VM_OBJECT_LOCK(object);
        tries = 0;
 retry:
@@ -487,15 +475,7 @@ kmem_back(vm_map_t map, vm_offset_t addr, vm_size_t size, 
int flags)
            entry->wired_count == 0 && (entry->eflags & MAP_ENTRY_IN_TRANSITION)
            == 0, ("kmem_back: entry not found or misaligned"));
 
-       if ((flags & (M_NOWAIT|M_USE_RESERVE)) == M_NOWAIT)
-               pflags = VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED;
-       else
-               pflags = VM_ALLOC_SYSTEM | VM_ALLOC_WIRED;
-
-       if (flags & M_ZERO)
-               pflags |= VM_ALLOC_ZERO;
-       if (flags & M_NODUMP)
-               pflags |= VM_ALLOC_NODUMP;
+       pflags = m2vm_flags(flags, VM_ALLOC_WIRED);
 
        VM_OBJECT_LOCK(kmem_object);
        for (i = 0; i < size; i += PAGE_SIZE) {
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
index 70b8416..ce23c51 100644
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -344,6 +344,24 @@ extern struct mtx_padalign vm_page_queue_mtx;
 #define        VM_ALLOC_COUNT_SHIFT    16
 #define        VM_ALLOC_COUNT(count)   ((count) << VM_ALLOC_COUNT_SHIFT)
 
+#ifdef M_NOWAIT
+static inline int
+m2vm_flags(int malloc_flags, int alloc_flags)
+{
+       int pflags;
+
+       if ((malloc_flags & M_USE_RESERVE) != 0)
+               pflags = VM_ALLOC_INTERRUPT | alloc_flags;
+       else
+               pflags = VM_ALLOC_SYSTEM | alloc_flags;
+       if (malloc_flags & M_ZERO)
+               pflags |= VM_ALLOC_ZERO;
+       if (malloc_flags & M_NODUMP)
+               pflags |= VM_ALLOC_NODUMP;
+       return (pflags);
+}
+#endif
+
 void vm_page_busy(vm_page_t m);
 void vm_page_flash(vm_page_t m);
 void vm_page_io_start(vm_page_t m);

Attachment: pgptaa17LGWlV.pgp
Description: PGP signature

Reply via email to