Page MenuHomeFreeBSD

D26041.id.diff
No OneTemporary

D26041.id.diff

Index: head/usr.bin/xinstall/xinstall.c
===================================================================
--- head/usr.bin/xinstall/xinstall.c
+++ head/usr.bin/xinstall/xinstall.c
@@ -148,7 +148,7 @@
const char *, const char *, off_t);
static int parseid(const char *, id_t *);
static int strip(const char *, int, const char *, char **);
-static int trymmap(int);
+static int trymmap(size_t);
static void usage(void);
int
@@ -1087,7 +1087,7 @@
if (do_digest)
digest_init(&ctx);
done_compare = 0;
- if (trymmap(from_fd) && trymmap(to_fd)) {
+ if (trymmap(from_len) && trymmap(to_len)) {
p = mmap(NULL, from_len, PROT_READ, MAP_SHARED,
from_fd, (off_t)0);
if (p == MAP_FAILED)
@@ -1248,13 +1248,8 @@
digest_init(&ctx);
- /*
- * Mmap and write if less than 8M (the limit is so we don't totally
- * trash memory on big files. This is really a minor hack, but it
- * wins some CPU back.
- */
done_copy = 0;
- if (size <= 8 * 1048576 && trymmap(from_fd) &&
+ if (trymmap((size_t)size) &&
(p = mmap(NULL, (size_t)size, PROT_READ, MAP_SHARED,
from_fd, (off_t)0)) != MAP_FAILED) {
nw = write(to_fd, p, size);
@@ -1523,20 +1518,23 @@
* return true (1) if mmap should be tried, false (0) if not.
*/
static int
-trymmap(int fd)
+trymmap(size_t filesize)
{
-/*
- * The ifdef is for bootstrapping - f_fstypename doesn't exist in
- * pre-Lite2-merge systems.
- */
-#ifdef MFSNAMELEN
- struct statfs stfs;
-
- if (fstatfs(fd, &stfs) != 0)
- return (0);
- if (strcmp(stfs.f_fstypename, "ufs") == 0 ||
- strcmp(stfs.f_fstypename, "cd9660") == 0)
- return (1);
-#endif
- return (0);
+ /*
+ * This function existed to skip mmap() for NFS file systems whereas
+ * nowadays mmap() should be perfectly safe. Nevertheless, using mmap()
+ * only reduces the number of system calls if we need multiple read()
+ * syscalls, i.e. if the file size is > MAXBSIZE. However, mmap() is
+ * more expensive than read() so set the threshold at 4 fewer syscalls.
+ * Additionally, for larger file size mmap() can significantly increase
+ * the number of page faults, so avoid it in that case.
+ *
+ * Note: the 8MB limit is not based on any meaningful benchmarking
+ * results, it is simply reusing the same value that was used before
+ * and also matches bin/cp.
+ *
+ * XXX: Maybe we shouldn't bother with mmap() at all, since we use
+ * MAXBSIZE the syscall overhead of read() shouldn't be too high?
+ */
+ return (filesize > 4 * MAXBSIZE && filesize < 8 * 1024 * 1024);
}

File Metadata

Mime Type
text/plain
Expires
Sun, Jul 5, 6:38 PM (19 m, 42 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34687571
Default Alt Text
D26041.id.diff (2 KB)

Event Timeline