public inbox for glibc-cvs@sourceware.org help / color / mirror / Atom feed
From: Adhemerval Zanella <azanella@sourceware.org> To: glibc-cvs@sourceware.org Subject: [glibc/azanella/bz23960] linux: Simplify opendir buffer allocation Date: Wed, 15 Apr 2020 14:14:30 +0000 (GMT) [thread overview] Message-ID: <20200415141430.A11C8384A01D@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=85030d0a99ac6fa42049ff001485959e125ee264 commit 85030d0a99ac6fa42049ff001485959e125ee264 Author: Adhemerval Zanella <adhemerval.zanella@linaro.org> Date: Sun Apr 12 17:42:35 2020 -0300 linux: Simplify opendir buffer allocation THe fallback allocation is removed, so the possible size constraint should be analized just once; __alloc_dir assumes that 'statp' argument is non-null, and the max_buffer_size move to close its used. Checked on x86_64-linux-gnu and i686-linux-gnu. Diff: --- include/dirent.h | 3 ++- sysdeps/unix/sysv/linux/opendir.c | 45 +++++++++++++++------------------------ 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/include/dirent.h b/include/dirent.h index 2b1cdcf8bd..fdf4c4a2f1 100644 --- a/include/dirent.h +++ b/include/dirent.h @@ -48,7 +48,8 @@ extern int __versionsort64 (const struct dirent64 **a, const struct dirent64 **b) __attribute_pure__; extern DIR *__alloc_dir (int fd, bool close_fd, int flags, - const struct stat64 *statp) attribute_hidden; + const struct stat64 *statp) + __nonnull (4) attribute_hidden; extern __typeof (rewinddir) __rewinddir; extern __typeof (seekdir) __seekdir; extern __typeof (dirfd) __dirfd; diff --git a/sysdeps/unix/sysv/linux/opendir.c b/sysdeps/unix/sysv/linux/opendir.c index c6ab79246c..5469e2e18f 100644 --- a/sysdeps/unix/sysv/linux/opendir.c +++ b/sysdeps/unix/sysv/linux/opendir.c @@ -23,12 +23,6 @@ #include <not-cancel.h> -/* The st_blksize value of the directory is used as a hint for the - size of the buffer which receives struct dirent values from the - kernel. st_blksize is limited to MAX_DIR_BUFFER_SIZE, in case the - file system provides a bogus value. */ -#define MAX_DIR_BUFFER_SIZE 1048576U - enum { opendir_oflags = O_RDONLY|O_NDELAY|O_DIRECTORY|O_LARGEFILE|O_CLOEXEC }; @@ -102,34 +96,29 @@ __alloc_dir (int fd, bool close_fd, int flags, const struct stat64 *statp) && __glibc_unlikely (__fcntl64_nocancel (fd, F_SETFD, FD_CLOEXEC) < 0)) goto lose; - const size_t default_allocation = (4 * BUFSIZ < sizeof (struct dirent64) - ? sizeof (struct dirent64) : 4 * BUFSIZ); - const size_t small_allocation = (BUFSIZ < sizeof (struct dirent64) - ? sizeof (struct dirent64) : BUFSIZ); - size_t allocation = default_allocation; -#ifdef _STATBUF_ST_BLKSIZE + /* The st_blksize value of the directory is used as a hint for the + size of the buffer which receives struct dirent values from the + kernel. st_blksize is limited to max_buffer_size, in case the + file system provides a bogus value. */ + enum { max_buffer_size = 1U << 20 }; + + const size_t allocation_size = 4 * BUFSIZ; + _Static_assert (allocation_size >= sizeof (struct dirent64), + "allocation_size < sizeof (struct dirent64)"); + /* Increase allocation if requested, but not if the value appears to - be bogus. */ - if (statp != NULL) - allocation = MIN (MAX ((size_t) statp->st_blksize, default_allocation), - MAX_DIR_BUFFER_SIZE); -#endif + be bogus. It will be between 32Kb (for blocksizes smaller than BUFSIZ) + up to 1Mb. */ + size_t allocation = MIN (MAX ((size_t) statp->st_blksize, allocation_size), + max_buffer_size); DIR *dirp = (DIR *) malloc (sizeof (DIR) + allocation); if (dirp == NULL) { - allocation = small_allocation; - dirp = (DIR *) malloc (sizeof (DIR) + allocation); - - if (dirp == NULL) - lose: + lose: + if (close_fd) { - if (close_fd) - { - int save_errno = errno; - __close_nocancel_nostatus (fd); - __set_errno (save_errno); - } + INTERNAL_SYSCALL_CALL (close, fd); return NULL; } }
next reply other threads:[~2020-04-15 14:14 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-15 14:14 Adhemerval Zanella [this message] -- strict thread matches above, loose matches on Subject: below -- 2020-10-02 13:53 Adhemerval Zanella 2020-04-17 13:22 Adhemerval Zanella 2020-04-16 13:20 Adhemerval Zanella 2020-04-14 21:09 Adhemerval Zanella 2020-04-13 21:28 Adhemerval Zanella
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200415141430.A11C8384A01D@sourceware.org \ --to=azanella@sourceware.org \ --cc=glibc-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).