From eac10791463c42ff4f6da20f548c046e300b3d6d Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 19 Nov 2005 17:22:39 +0000 Subject: * sysdeps/unix/sysv/linux/ia64/bits/shm.h (shmatt_t): New type. (struct shmid_ds): Use it for shm_nattch field. 2005-11-18 Jakub Jelinek * sysdeps/unix/sysv/linux/futimesat.c (futimesat): If FILE is NULL, set access and modification times of the file referenced by FD. * sysdeps/generic/futimesat.c (futimesat): Don't return EINVAL if FILE is NULL. Don't check FD if FILE is absolute path. 2005-11-19 Ulrich Drepper * nscd/nscd_gethst_r.c (nscd_gethst_r): Avoid unnecesary read call if there are no aliases. * sysdeps/unix/sysv/linux/Makefile (CFLAGS-connections.c, CFLAGS-pwdcache.c, CFLAGS-grpcache.c, CFLAGS-hstcache.c, CFLAGS-aicache.c, CFLAGS-initgrcache.c): Add -DHAVE_SENDFILE. * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_SENDFILE): Define. * nscd/pwdcache.c [HAVE_SENDFILE]: Include and . [HAVE_SENDFILE] (cache_addpw): Use sendfile to transmit positive result. * nscd/grpcache.c: Likewise. * nscd/hstcache.c: Likewise. * nscd/aicache.c: Likewise. * nscd/initgrcache.c: Likewise. * nscd/connectionc.c: Likewise. --- nscd/aicache.c | 36 +++++++++++++++++++++++++++++++++--- nscd/connections.c | 35 +++++++++++++++++++++++++++++++++-- nscd/grpcache.c | 30 +++++++++++++++++++++++++++++- nscd/hstcache.c | 30 +++++++++++++++++++++++++++++- nscd/initgrcache.c | 35 ++++++++++++++++++++++++++++++++--- nscd/pwdcache.c | 30 +++++++++++++++++++++++++++++- 6 files changed, 185 insertions(+), 11 deletions(-) (limited to 'nscd') diff --git a/nscd/aicache.c b/nscd/aicache.c index 992c6ef023..9b8a4e50f2 100644 --- a/nscd/aicache.c +++ b/nscd/aicache.c @@ -26,8 +26,15 @@ #include #include #include -#include -#include +#ifdef HAVE_SENDFILE +# include +#endif + +#include "dbg_log.h" +#include "nscd.h" +#ifdef HAVE_SENDFILE +# include +#endif typedef enum nss_status (*nss_gethostbyname3_r) @@ -365,7 +372,30 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req, wait. */ assert (fd != -1); - writeall (fd, &dataset->resp, total); +#ifdef HAVE_SENDFILE + if (__builtin_expect (db->mmap_used, 1)) + { + assert (db->wr_fd != -1); + assert ((char *) &dataset->resp > (char *) db->data); + assert ((char *) &dataset->resp - (char *) db->head + + total + <= (sizeof (struct database_pers_head) + + db->head->module * sizeof (ref_t) + + db->head->data_size)); + off_t off = (char *) &dataset->resp - (char *) db->head; + ssize_t written; + written = sendfile (fd, db->wr_fd, &off, total); +# ifndef __ASSUME_SENDFILE + if (written == -1 && errno == ENOSYS) + goto use_write; +# endif + } + else +# ifndef __ASSUME_SENDFILE + use_write: +# endif +#endif + writeall (fd, &dataset->resp, total); } goto out; diff --git a/nscd/connections.c b/nscd/connections.c index 137cfb239a..0a1ca77836 100644 --- a/nscd/connections.c +++ b/nscd/connections.c @@ -39,6 +39,9 @@ #include #include #include +#ifdef HAVE_SENDFILE +# include +#endif #include #include #include @@ -46,6 +49,9 @@ #include "nscd.h" #include "dbg_log.h" #include "selinux.h" +#ifdef HAVE_SENDFILE +# include +#endif /* Wrapper functions with error checking for standard functions. */ @@ -939,8 +945,33 @@ cannot handle old request version %d; current version is %d"), if (cached != NULL) { /* Hurray it's in the cache. */ - if (writeall (fd, cached->data, cached->recsize) - != cached->recsize + ssize_t nwritten; + +#ifdef HAVE_SENDFILE + if (db->mmap_used || !cached->notfound) + { + assert (db->wr_fd != -1); + assert ((char *) cached->data > (char *) db->data); + assert ((char *) cached->data - (char *) db->head + + cached->recsize + <= (sizeof (struct database_pers_head) + + db->head->module * sizeof (ref_t) + + db->head->data_size)); + off_t off = (char *) cached->data - (char *) db->head; + nwritten = sendfile (fd, db->wr_fd, &off, cached->recsize); +# ifndef __ASSUME_SENDFILE + if (nwritten == -1 && errno == ENOSYS) + goto use_write; +# endif + } + else +# ifndef __ASSUME_SENDFILE + use_write: +# endif +#endif + nwritten = writeall (fd, cached->data, cached->recsize); + + if (nwritten != cached->recsize && __builtin_expect (debug_level, 0) > 0) { /* We have problems sending the result. */ diff --git a/nscd/grpcache.c b/nscd/grpcache.c index 3f440e9701..fb043152c6 100644 --- a/nscd/grpcache.c +++ b/nscd/grpcache.c @@ -32,11 +32,17 @@ #include #include #include +#ifdef HAVE_SENDFILE +# include +#endif #include #include #include "nscd.h" #include "dbg_log.h" +#ifdef HAVE_SENDFILE +# include +#endif /* This is the standard reply in case the service is disabled. */ static const gr_response_header disabled = @@ -294,7 +300,29 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req, unnecessarily let the receiver wait. */ assert (fd != -1); - written = writeall (fd, &dataset->resp, total); +#ifdef HAVE_SENDFILE + if (__builtin_expect (db->mmap_used, 1)) + { + assert (db->wr_fd != -1); + assert ((char *) &dataset->resp > (char *) db->data); + assert ((char *) &dataset->resp - (char *) db->head + + total + <= (sizeof (struct database_pers_head) + + db->head->module * sizeof (ref_t) + + db->head->data_size)); + off_t off = (char *) &dataset->resp - (char *) db->head; + written = sendfile (fd, db->wr_fd, &off, total); +# ifndef __ASSUME_SENDFILE + if (written == -1 && errno == ENOSYS) + goto use_write; +# endif + } + else +# ifndef __ASSUME_SENDFILE + use_write: +# endif +#endif + written = writeall (fd, &dataset->resp, total); } /* Add the record to the database. But only if it has not been diff --git a/nscd/hstcache.c b/nscd/hstcache.c index 29bce99819..29f14af66b 100644 --- a/nscd/hstcache.c +++ b/nscd/hstcache.c @@ -34,10 +34,16 @@ #include #include #include +#ifdef HAVE_SENDFILE +# include +#endif #include #include "nscd.h" #include "dbg_log.h" +#ifdef HAVE_SENDFILE +# include +#endif /* This is the standard reply in case the service is disabled. */ @@ -328,7 +334,29 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req, unnecessarily keep the receiver waiting. */ assert (fd != -1); - written = writeall (fd, &dataset->resp, total); +#ifdef HAVE_SENDFILE + if (__builtin_expect (db->mmap_used, 1)) + { + assert (db->wr_fd != -1); + assert ((char *) &dataset->resp > (char *) db->data); + assert ((char *) &dataset->resp - (char *) db->head + + total + <= (sizeof (struct database_pers_head) + + db->head->module * sizeof (ref_t) + + db->head->data_size)); + off_t off = (char *) &dataset->resp - (char *) db->head; + written = sendfile (fd, db->wr_fd, &off, total); +# ifndef __ASSUME_SENDFILE + if (written == -1 && errno == ENOSYS) + goto use_write; +# endif + } + else +# ifndef __ASSUME_SENDFILE + use_write: +# endif +#endif + written = writeall (fd, &dataset->resp, total); } /* Add the record to the database. But only if it has not been diff --git a/nscd/initgrcache.c b/nscd/initgrcache.c index bb6dee2b4e..eb03fc7a5d 100644 --- a/nscd/initgrcache.c +++ b/nscd/initgrcache.c @@ -26,8 +26,15 @@ #include #include #include -#include -#include +#ifdef HAVE_SENDFILE +# include +#endif + +#include "dbg_log.h" +#include "nscd.h" +#ifdef HAVE_SENDFILE +# include +#endif #include "../nss/nsswitch.h" @@ -344,7 +351,29 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req, unnecessarily let the receiver wait. */ assert (fd != -1); - written = writeall (fd, &dataset->resp, total); +#ifdef HAVE_SENDFILE + if (__builtin_expect (db->mmap_used, 1)) + { + assert (db->wr_fd != -1); + assert ((char *) &dataset->resp > (char *) db->data); + assert ((char *) &dataset->resp - (char *) db->head + + total + <= (sizeof (struct database_pers_head) + + db->head->module * sizeof (ref_t) + + db->head->data_size)); + off_t off = (char *) &dataset->resp - (char *) db->head; + written = sendfile (fd, db->wr_fd, &off, total); +# ifndef __ASSUME_SENDFILE + if (written == -1 && errno == ENOSYS) + goto use_write; +# endif + } + else +# ifndef __ASSUME_SENDFILE + use_write: +# endif +#endif + written = writeall (fd, &dataset->resp, total); } diff --git a/nscd/pwdcache.c b/nscd/pwdcache.c index e4ed7e97ca..6f4b032d10 100644 --- a/nscd/pwdcache.c +++ b/nscd/pwdcache.c @@ -32,11 +32,17 @@ #include #include #include +#ifdef HAVE_SENDFILE +# include +#endif #include #include #include "nscd.h" #include "dbg_log.h" +#ifdef HAVE_SENDFILE +# include +#endif /* This is the standard reply in case the service is disabled. */ static const pw_response_header disabled = @@ -289,7 +295,29 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req, unnecessarily let the receiver wait. */ assert (fd != -1); - written = writeall (fd, &dataset->resp, total); +#ifdef HAVE_SENDFILE + if (__builtin_expect (db->mmap_used, 1)) + { + assert (db->wr_fd != -1); + assert ((char *) &dataset->resp > (char *) db->data); + assert ((char *) &dataset->resp - (char *) db->head + + total + <= (sizeof (struct database_pers_head) + + db->head->module * sizeof (ref_t) + + db->head->data_size)); + off_t off = (char *) &dataset->resp - (char *) db->head; + written = sendfile (fd, db->wr_fd, &off, total); +# ifndef __ASSUME_SENDFILE + if (written == -1 && errno == ENOSYS) + goto use_write; +# endif + } + else +# ifndef __ASSUME_SENDFILE + use_write: +# endif +#endif + written = writeall (fd, &dataset->resp, total); } -- cgit v1.2.3