Re: Making tmpfs reserved memory configurable

2014-06-06 Thread Martin Husemann
On Thu, Jun 05, 2014 at 11:04:06PM +, Eduardo Horvath wrote:
 Maybe.  It's set in uvmpd_tune(), which may be called by the page daemon 
 in some circumstances.  Take a look at sys/uvm/uvm_pdaemon.c.

Hmm, should this be made more explicit in the mount_tmpfs documentation?
Under such low memory conditions, an unbound tmpfs might not behave
completely deterministially any more.

Martin


Re: Making tmpfs reserved memory configurable

2014-06-05 Thread Martin Husemann
On Fri, May 30, 2014 at 04:56:01PM +0200, Martin Husemann wrote:
 I have been on a quest to make the stock vax install CD (-image) usable on
 VAX machines with 8 MB recently. (8 MB is the lowest I could persuade simh
 to emulate, for 4 MB we will need a custom kernel anyway and for smaller
 even a custom /boot - I will cover installing on those machines in an
 upcoming improvement of the install docs).

Ok, this (much simpler) patch makes tmpfs work on low memory machines.
Comments?

Martin
Index: tmpfs.h
===
RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs.h,v
retrieving revision 1.49
diff -u -p -r1.49 tmpfs.h
--- tmpfs.h 30 Apr 2014 01:33:51 -  1.49
+++ tmpfs.h 5 Jun 2014 13:40:19 -
@@ -307,13 +307,6 @@ bool   tmpfs_strname_neqlen(struct compon
 KASSERT((node)-tn_size % sizeof(tmpfs_dirent_t) == 0);
 
 /*
- * Memory management stuff.
- */
-
-/* Amount of memory pages to reserve for the system. */
-#defineTMPFS_PAGES_RESERVED(4 * 1024 * 1024 / PAGE_SIZE)
-
-/*
  * Routines to convert VFS structures to tmpfs internal ones.
  */
 
Index: tmpfs_mem.c
===
RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs_mem.c,v
retrieving revision 1.5
diff -u -p -r1.5 tmpfs_mem.c
--- tmpfs_mem.c 30 Apr 2014 01:33:51 -  1.5
+++ tmpfs_mem.c 5 Jun 2014 13:40:19 -
@@ -89,7 +89,7 @@ tmpfs_mntmem_set(struct tmpfs_mount *mp,
  * = If 'total' is true, then return _total_ amount of pages.
  * = If false, then return the amount of _free_ memory pages.
  *
- * Remember to remove TMPFS_PAGES_RESERVED from the returned value to avoid
+ * Remember to remove uvmexp.freemin from the returned value to avoid
  * excessive memory usage.
  */
 size_t
@@ -118,10 +118,10 @@ tmpfs_bytes_max(struct tmpfs_mount *mp)
size_t freepages = tmpfs_mem_info(false);
uint64_t avail_mem;
 
-   if (freepages  TMPFS_PAGES_RESERVED) {
+   if (freepages  uvmexp.freemin) {
freepages = 0;
} else {
-   freepages -= TMPFS_PAGES_RESERVED;
+   freepages -= uvmexp.freemin;
}
avail_mem = round_page(mp-tm_bytes_used) + (freepages  PAGE_SHIFT);
return MIN(mp-tm_mem_limit, avail_mem);
Index: tmpfs_vfsops.c
===
RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs_vfsops.c,v
retrieving revision 1.61
diff -u -p -r1.61 tmpfs_vfsops.c
--- tmpfs_vfsops.c  30 Apr 2014 01:59:30 -  1.61
+++ tmpfs_vfsops.c  5 Jun 2014 13:40:19 -
@@ -132,7 +132,7 @@ tmpfs_mount(struct mount *mp, const char
 
 
/* Prohibit mounts if there is not enough memory. */
-   if (tmpfs_mem_info(true)  TMPFS_PAGES_RESERVED)
+   if (tmpfs_mem_info(true)  uvmexp.freemin)
return EINVAL;
 
/* Get the memory usage limit for this file-system. */
Index: mount_tmpfs.8
===
RCS file: /cvsroot/src/sbin/mount_tmpfs/mount_tmpfs.8,v
retrieving revision 1.17
diff -u -r1.17 mount_tmpfs.8
--- mount_tmpfs.8   4 Dec 2013 18:05:21 -   1.17
+++ mount_tmpfs.8   5 Jun 2014 13:41:09 -
@@ -83,7 +83,7 @@
 Specifies the total file system size in bytes.
 If zero is given (the default), the available amount of memory (including
 main memory and swap space) will be used.
-Note that four megabytes are always reserved for the system and cannot
+Note that some memory is always reserved for the system and cannot
 be assigned to the file system.
 .Ar Size
 can alternatively be specified as a percentage of the available


Re: Making tmpfs reserved memory configurable

2014-06-05 Thread Eduardo Horvath
On Thu, 5 Jun 2014, Martin Husemann wrote:

 On Fri, May 30, 2014 at 04:56:01PM +0200, Martin Husemann wrote:
  I have been on a quest to make the stock vax install CD (-image) usable on
  VAX machines with 8 MB recently. (8 MB is the lowest I could persuade simh
  to emulate, for 4 MB we will need a custom kernel anyway and for smaller
  even a custom /boot - I will cover installing on those machines in an
  upcoming improvement of the install docs).
 
 Ok, this (much simpler) patch makes tmpfs work on low memory machines.
 Comments?

Have you tested this?

The way the old scanner used to work, it started when the number of free 
pages hit freemin, and continued scanning until the number of free pages 
hit freetarg.

Looking at the code, it appears now the page scanner starts running when 
the number of free pages goes below uvmpd.freetarg.  I'm a bit concerned 
that if tmpfs allocates enough pages to put the system permanently below 
the uvmpd.freetarg threshold, the page scanner will never stop running.  
I'm not sure if this would be a problem or not, so it would be good to put 
a system into that condition to know for sure.

Eduardo


Re: Making tmpfs reserved memory configurable

2014-06-05 Thread Matt Thomas

On Jun 5, 2014, at 8:47 AM, Martin Husemann mar...@duskware.de wrote:

 On Thu, Jun 05, 2014 at 03:36:37PM +, Eduardo Horvath wrote:
 Have you tested this?
 
 I ran an install on a 8 MB simh VAX, and it worked good enough for that.
 No, I wouldn't call that serious testing.

can you try using freetarg?


Re: Making tmpfs reserved memory configurable

2014-06-05 Thread Martin Husemann
On Thu, Jun 05, 2014 at 03:36:37PM +, Eduardo Horvath wrote:
 Have you tested this?

I ran an install on a 8 MB simh VAX, and it worked good enough for that.
No, I wouldn't call that serious testing.

Martin


Re: Making tmpfs reserved memory configurable

2014-06-05 Thread Martin Husemann
On Thu, Jun 05, 2014 at 08:50:07AM -0700, Matt Thomas wrote:
 
 can you try using freetarg?

Did that and it worked as well.

Does freetarg ever change after boot?

Martin


Re: Making tmpfs reserved memory configurable

2014-06-05 Thread Eduardo Horvath
On Thu, 5 Jun 2014, Martin Husemann wrote:

 On Thu, Jun 05, 2014 at 08:50:07AM -0700, Matt Thomas wrote:
  
  can you try using freetarg?
 
 Did that and it worked as well.
 
 Does freetarg ever change after boot?

Maybe.  It's set in uvmpd_tune(), which may be called by the page daemon 
in some circumstances.  Take a look at sys/uvm/uvm_pdaemon.c.

Eduardo


Making tmpfs reserved memory configurable

2014-05-30 Thread Martin Husemann
I have been on a quest to make the stock vax install CD (-image) usable on
VAX machines with 8 MB recently. (8 MB is the lowest I could persuade simh
to emulate, for 4 MB we will need a custom kernel anyway and for smaller
even a custom /boot - I will cover installing on those machines in an
upcoming improvement of the install docs).

After a few easy steps, I hit a hard wall: using MFS filesystem on the install
CD does not work well (we take too long to configure swap, the userland part
of MFS gets often killed way before). However, tmpfs does not work at all
under such low memory situations.

See mount_tmpfs(8), in the paragraph about the -s option:

   Note that four megabytes are always reserved for the system and cannot
   be assigned to the file system.

Now, with a 3.2 MB text GENERIC kernel and 8 MB RAM, we certainly don't have
4 MB available at all - so tmpfs is not usable.

But, on the other hand, the CD is not usable without tmpfs - so we are in a
deadlock. Simple way out: since we know the tmpfs is needed more than any
RAM, we could tell tmpfs to lower the amount of ram reserved for the system
via sysctl(8). This is what the first patch attached does.

The second patch updates the man page and adds a kauth decision to allow
this changes only for root.

Finally, the trivial third patch uses the new feature and makes VAX install
CDs work on an emulated VAX 11/780 with 8 MB total ram.

Any objections to the general aproach?
Reviews, especially of the kauth and sysctl code welcome (everything else
is mostly mechanical).

One open issue is the name - I somehow thought reservee would be a proper
noune for reserved memory, but apparently this does not work out well
for native speakers, so it probably should be named something else.
What about min_ram_free? Other suggestions?

Martin
Index: sys/fs/tmpfs/tmpfs.h
===
RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs.h,v
retrieving revision 1.49
diff -u -p -r1.49 tmpfs.h
--- sys/fs/tmpfs/tmpfs.h30 Apr 2014 01:33:51 -  1.49
+++ sys/fs/tmpfs/tmpfs.h30 May 2014 13:42:10 -
@@ -311,7 +311,7 @@ booltmpfs_strname_neqlen(struct compon
  */
 
 /* Amount of memory pages to reserve for the system. */
-#defineTMPFS_PAGES_RESERVED(4 * 1024 * 1024 / PAGE_SIZE)
+extern size_t tmpfs_pages_reserved;
 
 /*
  * Routines to convert VFS structures to tmpfs internal ones.
Index: sys/fs/tmpfs/tmpfs_mem.c
===
RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs_mem.c,v
retrieving revision 1.5
diff -u -p -r1.5 tmpfs_mem.c
--- sys/fs/tmpfs/tmpfs_mem.c30 Apr 2014 01:33:51 -  1.5
+++ sys/fs/tmpfs/tmpfs_mem.c30 May 2014 13:42:10 -
@@ -48,6 +48,8 @@ __KERNEL_RCSID(0, $NetBSD: tmpfs_mem.c,
 extern struct pool tmpfs_dirent_pool;
 extern struct pool tmpfs_node_pool;
 
+size_t tmpfs_pages_reserved = 4 * 1024 * 1024 / PAGE_SIZE;
+
 void
 tmpfs_mntmem_init(struct tmpfs_mount *mp, uint64_t memlimit)
 {
@@ -89,7 +91,7 @@ tmpfs_mntmem_set(struct tmpfs_mount *mp,
  * = If 'total' is true, then return _total_ amount of pages.
  * = If false, then return the amount of _free_ memory pages.
  *
- * Remember to remove TMPFS_PAGES_RESERVED from the returned value to avoid
+ * Remember to remove tmpfs_pages_reserved from the returned value to avoid
  * excessive memory usage.
  */
 size_t
@@ -118,10 +120,10 @@ tmpfs_bytes_max(struct tmpfs_mount *mp)
size_t freepages = tmpfs_mem_info(false);
uint64_t avail_mem;
 
-   if (freepages  TMPFS_PAGES_RESERVED) {
+   if (freepages  tmpfs_pages_reserved) {
freepages = 0;
} else {
-   freepages -= TMPFS_PAGES_RESERVED;
+   freepages -= tmpfs_pages_reserved;
}
avail_mem = round_page(mp-tm_bytes_used) + (freepages  PAGE_SHIFT);
return MIN(mp-tm_mem_limit, avail_mem);
Index: sys/fs/tmpfs/tmpfs_vfsops.c
===
RCS file: /cvsroot/src/sys/fs/tmpfs/tmpfs_vfsops.c,v
retrieving revision 1.61
diff -u -p -r1.61 tmpfs_vfsops.c
--- sys/fs/tmpfs/tmpfs_vfsops.c 30 Apr 2014 01:59:30 -  1.61
+++ sys/fs/tmpfs/tmpfs_vfsops.c 30 May 2014 13:42:10 -
@@ -49,9 +49,11 @@ __KERNEL_RCSID(0, $NetBSD: tmpfs_vfsops
 #include sys/kmem.h
 #include sys/mount.h
 #include sys/stat.h
+#include sys/sysctl.h
 #include sys/systm.h
 #include sys/vnode.h
 #include sys/module.h
+#include sys/kauth.h
 
 #include miscfs/genfs/genfs.h
 #include fs/tmpfs/tmpfs.h
@@ -59,6 +61,9 @@ __KERNEL_RCSID(0, $NetBSD: tmpfs_vfsops
 
 MODULE(MODULE_CLASS_VFS, tmpfs, NULL);
 
+static struct sysctllog *tmpfs_sysctl_log;
+static int tmpfs_pages_reservee(SYSCTLFN_PROTO);
+
 struct pooltmpfs_dirent_pool;
 struct pooltmpfs_node_pool;
 
@@ -132,7 +137,7 @@ tmpfs_mount(struct mount *mp, const char
 
 
/* Prohibit mounts if there is not enough memory. */
- 

Re: Making tmpfs reserved memory configurable

2014-05-30 Thread Rhialto
On Fri 30 May 2014 at 16:56:01 +0200, Martin Husemann wrote:
 One open issue is the name - I somehow thought reservee would be a proper
 noune for reserved memory, but apparently this does not work out well
 for native speakers, so it probably should be named something else.
 What about min_ram_free? Other suggestions?

I'm not a native speaker either, but it seems reserve (one fewer e)
would be good.

 --- sbin/mount_tmpfs/mount_tmpfs.84 Dec 2013 18:05:21 -   1.17
 +++ sbin/mount_tmpfs/mount_tmpfs.830 May 2014 13:42:46 -
 @@ -83,8 +83,12 @@
  Specifies the total file system size in bytes.
  If zero is given (the default), the available amount of memory (including
  main memory and swap space) will be used.
 -Note that four megabytes are always reserved for the system and cannot
 +Note that some memory (by default:
 +four megabytes) are always reserved for the system and cannot
  be assigned to the file system.

some memory (...) are - some memory is.

I'd split the lines as

| Note that some memory
| (by default: four megabytes)
| is always reserved for the system and cannot

-Olaf.
-- 
___ Olaf 'Rhialto' Seibert  -- The Doctor: No, 'eureka' is Greek for
\X/ rhialto/at/xs4all.nl-- 'this bath is too hot.'


pgprxAEQkY7q7.pgp
Description: PGP signature


Re: Making tmpfs reserved memory configurable

2014-05-30 Thread Eduardo Horvath
On Fri, 30 May 2014, Martin Husemann wrote:

 See mount_tmpfs(8), in the paragraph about the -s option:
 
Note that four megabytes are always reserved for the system and cannot
be assigned to the file system.
 
 Now, with a 3.2 MB text GENERIC kernel and 8 MB RAM, we certainly don't have
 4 MB available at all - so tmpfs is not usable.

This just doesn't sound right.  Why is tmpfs reserving a fixed amount of 
RAM?  Shouldn't it be using uvmexp.freemin?  That's basically what we're 
reserving for emergencies.

RAM scaling is always a pain in the posterior.  The choices made for a 
system with 16MB RAM don't make sense for a system with 16GB RAM, and visa 
versa.

Eduardo


Re: Making tmpfs reserved memory configurable

2014-05-30 Thread Mindaugas Rasiukevicius
Martin Husemann mar...@duskware.de wrote:
 ...
 
 See mount_tmpfs(8), in the paragraph about the -s option:
 
Note that four megabytes are always reserved for the system and cannot
be assigned to the file system.
 

This wording may be confusing.  tmpfs does not reserve the memory in a
sense of allocation.  It imposes a hard limit and, in addition, it checks
that there is at least 4MB left for the system (if not, it considers that
as hitting the limit and fails to allocate more memory).  Note that the
current mechanism of using the floating number of free memory is wrong.
It is not reliable and should not really be done that way.

The UVM itself has some reserved memory so that it could function if the
memory is exhausted (see reserve_pagedaemon and reserve_kernel in uvmexp).
I think that the assumptions about minimum memory requirements should be
made by UVM and if we want to keep a helper mechanism in tmpfs, then I
agree with Eduardo that it should rather be using uvmexp.freemin target.

-- 
Mindaugas