From owner-freebsd-hackers@FreeBSD.ORG Mon Nov 12 18:49:52 2012 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 7B87A6BA; Mon, 12 Nov 2012 18:49:52 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) by mx1.freebsd.org (Postfix) with ESMTP id DAE808FC08; Mon, 12 Nov 2012 18:49:51 +0000 (UTC) Received: from tom.home (localhost [127.0.0.1]) by kib.kiev.ua (8.14.5/8.14.5) with ESMTP id qACInkZF037131; Mon, 12 Nov 2012 20:49:46 +0200 (EET) (envelope-from kostikbel@gmail.com) X-DKIM: OpenDKIM Filter v2.5.2 kib.kiev.ua qACInkZF037131 Received: (from kostik@localhost) by tom.home (8.14.5/8.14.5/Submit) id qACInjI8037130; Mon, 12 Nov 2012 20:49:45 +0200 (EET) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Mon, 12 Nov 2012 20:49:45 +0200 From: Konstantin Belousov To: Alan Cox Subject: Re: Memory reserves or lack thereof Message-ID: <20121112184945.GE73505@kib.kiev.ua> References: <20121110132019.GP73505@kib.kiev.ua> <20121112133638.GZ73505@kib.kiev.ua> <50A1336E.5040401@rice.edu> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Gdkky/UkxKPTIP6j" Content-Disposition: inline In-Reply-To: <50A1336E.5040401@rice.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Spam-Status: No, score=0.2 required=5.0 tests=ALL_TRUSTED, DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,NML_ADSP_CUSTOM_MED autolearn=no version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on tom.home Cc: alc@freebsd.org, pho@freebsd.org, "Sears, Steven" , "freebsd-hackers@freebsd.org" X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 12 Nov 2012 18:49:52 -0000 --Gdkky/UkxKPTIP6j Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 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: >=20 > 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$"); =20 #include #include +#include #include #include #include @@ -48,12 +49,7 @@ uma_small_alloc(uma_zone_t zone, int bytes, u_int8_t *fl= ags, int wait) int pflags; =20 *flags =3D UMA_SLAB_PRIV; - if ((wait & (M_NOWAIT|M_USE_RESERVE)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED; - if (wait & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; + pflags =3D m2vm_flags(wait, VM_ALLOC_NOOBJ | VM_ALLOC_WIRED); for (;;) { m =3D vm_page_alloc(NULL, 0, pflags); if (m =3D=3D 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 =3D ((void *)kmem_malloc(kmem_map, bytes, M_NOWAIT)); return (ret); } - if ((wait & (M_NOWAIT|M_USE_RESERVE)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_WIRED; - if (wait & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; + pflags =3D m2vm_flags(wait, VM_ALLOC_WIRED); for (;;) { m =3D vm_page_alloc(NULL, 0, pflags | VM_ALLOC_NOOBJ); if (m =3D=3D 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; =20 - cdp =3D malloc(sizeof *cdp, M_CDEVP, M_USE_RESERVE | M_ZERO | + cdp =3D malloc(sizeof *cdp, M_CDEVP, M_ZERO | ((flags & MAKEDEV_NOWAIT) ? M_NOWAIT : M_WAITOK)); if (cdp =3D=3D 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 *fl= ags, int wait) int pflags; =20 *flags =3D UMA_SLAB_PRIV; - if ((wait & (M_NOWAIT|M_USE_RESERVE)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_WIRED; - if (wait & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; + pflags =3D m2vm_flags(wait, VM_ALLOC_WIRED); =20 for (;;) { m =3D 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 *fl= ags, int wait) void *va; =20 *flags =3D UMA_SLAB_PRIV; - - if ((wait & (M_NOWAIT|M_USE_RESERVE)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT; - else - pflags =3D VM_ALLOC_SYSTEM; + pflags =3D m2vm_flags(wait, 0); =20 for (;;) { m =3D 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 =3D UMA_SLAB_PRIV; needed_lock =3D !PMAP_LOCKED(kernel_pmap); =20 - if ((wait & (M_NOWAIT|M_USE_RESERVE)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_WIRED; - if (wait & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; + pflags =3D m2vm_flags(wait, VM_ALLOC_WIRED); =20 for (;;) { m =3D 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 =3D platform_real_maxaddr(); =20 *flags =3D UMA_SLAB_PRIV; - if ((wait & (M_NOWAIT | M_USE_RESERVE)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED; - if (wait & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; + pflags =3D m2vm_flags(wait, VM_ALLOC_NOOBJ | VM_ALLOC_WIRED); =20 for (;;) { m =3D 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 *fl= ags, int wait) int pflags; =09 *flags =3D UMA_SLAB_PRIV; - if ((wait & (M_NOWAIT|M_USE_RESERVE)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_WIRED; - if (wait & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; + pflags =3D m2vm_flags(wait, VM_ALLOC_WIRED); =20 for (;;) { m =3D vm_page_alloc(NULL, 0, pflags | VM_ALLOC_NOOBJ); diff --git a/sys/sparc64/sparc64/vm_machdep.c b/sys/sparc64/sparc64/vm_mach= dep.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); =20 *flags =3D UMA_SLAB_PRIV; - - if ((wait & (M_NOWAIT|M_USE_RESERVE)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_WIRED; - - if (wait & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; + pflags =3D m2vm_flags(wait, VM_ALLOC_WIRED); =20 for (;;) { m =3D 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 flag= s, 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)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_NOBUSY; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_NOBUSY; - if (flags & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; + pflags =3D m2vm_flags(flags, VM_ALLOC_NOBUSY); VM_OBJECT_LOCK(object); end_offset =3D offset + size; for (; offset < end_offset; offset +=3D PAGE_SIZE) { @@ -296,14 +291,7 @@ kmem_alloc_contig(vm_map_t map, vm_size_t size, int fl= ags, 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)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_NOBUSY; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_NOBUSY; - if (flags & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; - if (flags & M_NODUMP) - pflags |=3D VM_ALLOC_NODUMP; + pflags =3D m2vm_flags(flags, VM_ALLOC_NOBUSY); VM_OBJECT_LOCK(object); tries =3D 0; retry: @@ -487,15 +475,7 @@ kmem_back(vm_map_t map, vm_offset_t addr, vm_size_t si= ze, int flags) entry->wired_count =3D=3D 0 && (entry->eflags & MAP_ENTRY_IN_TRANSITI= ON) =3D=3D 0, ("kmem_back: entry not found or misaligned")); =20 - if ((flags & (M_NOWAIT|M_USE_RESERVE)) =3D=3D M_NOWAIT) - pflags =3D VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED; - else - pflags =3D VM_ALLOC_SYSTEM | VM_ALLOC_WIRED; - - if (flags & M_ZERO) - pflags |=3D VM_ALLOC_ZERO; - if (flags & M_NODUMP) - pflags |=3D VM_ALLOC_NODUMP; + pflags =3D m2vm_flags(flags, VM_ALLOC_WIRED); =20 VM_OBJECT_LOCK(kmem_object); for (i =3D 0; i < size; i +=3D 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) =20 +#ifdef M_NOWAIT +static inline int +m2vm_flags(int malloc_flags, int alloc_flags) +{ + int pflags; + + if ((malloc_flags & M_USE_RESERVE) !=3D 0) + pflags =3D VM_ALLOC_INTERRUPT | alloc_flags; + else + pflags =3D VM_ALLOC_SYSTEM | alloc_flags; + if (malloc_flags & M_ZERO) + pflags |=3D VM_ALLOC_ZERO; + if (malloc_flags & M_NODUMP) + pflags |=3D 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); --Gdkky/UkxKPTIP6j Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (FreeBSD) iEYEARECAAYFAlChRMkACgkQC3+MBN1Mb4jkDQCgtaeBjw0lhFY/urUbAZ8ymbb3 A0YAoPVimReG0ohpA1lWpP05t4QeKDXH =2UzS -----END PGP SIGNATURE----- --Gdkky/UkxKPTIP6j--