• Bug#1083159: mount: tmpfs size for /tmp is randomly ignored

    From Vincent Lefevre@21:1/5 to Vincent Lefevre on Tue May 6 13:00:01 2025
    XPost: linux.debian.kernel

    On 2025-05-06 12:13:24 +0200, Vincent Lefevre wrote:
    On 2025-02-21 20:33:21 +0100, Salvatore Bonaccorso wrote:
    [...]
    So size is only showed if sbinfo->max_blocks != shmem_default_max_blocks().

    Let's look at shmem_default_max_blocks():

    147 #ifdef CONFIG_TMPFS
    148 static unsigned long shmem_default_max_blocks(void)
    149 {
    150 return totalram_pages() / 2;
    151 }
    [...]

    The bug may be the use of totalram_pages(), while the documentation
    says:

    size=bytes
    [...]
    The size may also have a % suffix to limit this instance
    to a percentage of physical RAM.
    ^^^^^^^^^^^^

    According to https://stackoverflow.com/a/60882958/3782797 (and
    the answer given b MistralAI) it is get_num_physpages() that
    gives the whole physical memory.

    I suspect that totalram_pages() is not constant over the time,
    so using it is buggy as there is no way for the user to know
    what size is actually used for the 50% default.

    --
    Vincent Lefèvre <vincent@vinc17.net> - Web: <https://www.vinc17.net/>
    100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
    Work: CR INRIA - computer arithmetic / Pascaline project (LIP, ENS-Lyon)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Vincent Lefevre@21:1/5 to Salvatore Bonaccorso on Tue May 6 12:20:01 2025
    XPost: linux.debian.kernel

    Sorry, I forgot to reply...

    On 2025-02-21 20:33:21 +0100, Salvatore Bonaccorso wrote:
    Let's start from:

    https://www.kernel.org/doc/html/latest/filesystems/vfs.html#mount-options

    The important bits are:

    Showing options
    ---------------

    If a filesystem accepts mount options, it must define show_options() to
    show all the currently active options. The rules are:

    - options MUST be shown which are not default or their values differ
    from the default

    - options MAY be shown which are enabled by default or have their
    default value

    But, IMHO, a fixed choice should be made. This should not be random.
    Otherwise, this is confusing, and can break scripts that detect
    changes in the configuration.

    Now, with your analysis of the code...

    tmpfs is defined in "mm/shmem.c and we have (current mainline):

    5263 #ifdef CONFIG_TMPFS
    5264 .statfs = shmem_statfs,
    5265 .show_options = shmem_show_options,
    5266 #endif

    shmem_show_options() handles showming mount options for tmpfs:

    4878 static int shmem_show_options(struct seq_file *seq, struct dentry *root) 4879 {
    4880 struct shmem_sb_info *sbinfo = SHMEM_SB(root->d_sb);
    4881 struct mempolicy *mpol;
    4882
    4883 if (sbinfo->max_blocks != shmem_default_max_blocks())
    4884 seq_printf(seq, ",size=%luk", K(sbinfo->max_blocks)); [...]

    So size is only showed if sbinfo->max_blocks != shmem_default_max_blocks().

    Let's look at shmem_default_max_blocks():

    147 #ifdef CONFIG_TMPFS
    148 static unsigned long shmem_default_max_blocks(void)
    149 {
    150 return totalram_pages() / 2;
    151 }

    So this is 50% of ram as *default* which matches tmpfs(5):

    Mount options
    The tmpfs filesystem supports the following mount options:

    size=bytes
    Specify an upper limit on the size of the filesystem.
    The size is given in bytes, and rounded up to entire
    pages. The limit is removed if the size is 0.

    The size may have a k, m, or g suffix for Ki, Mi, Gi (biâ€
    nary kilo (kibi), binary mega (mebi), and binary giga
    (gibi)).

    The size may also have a % suffix to limit this instance
    to a percentage of physical RAM.

    The default, when neither size nor nr_blocks is speciâ€
    fied, is size=50%.

    So my undestanding would be that the code here is coherent with the specification that if size corresponds to the default value, the code
    may, but does not must show it.

    Does this make sense?

    According to the above code, the size is never shown for the default
    as the condition sbinfo->max_blocks != shmem_default_max_blocks() is
    false. But this is not what I observe: the size is shown randomly
    (more precisely, whether the size is shown is chosen at boot time),
    though it is always the default here.

    --
    Vincent Lefèvre <vincent@vinc17.net> - Web: <https://www.vinc17.net/>
    100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
    Work: CR INRIA - computer arithmetic / Pascaline project (LIP, ENS-Lyon)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)