* 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  <jakub@redhat.com>

	* 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  <drepper@redhat.com>

	* 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 <sys/sendfile.h> and
	<kernel-features.h>.
	[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.
This commit is contained in:
Ulrich Drepper 2005-11-19 17:22:39 +00:00
parent 74ac0a89d2
commit eac1079146
12 changed files with 251 additions and 22 deletions

View File

@ -1,3 +1,35 @@
2005-11-19 Jakub Jelinek <jakub@redhat.com>
* 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 <jakub@redhat.com>
* 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 <drepper@redhat.com>
* 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 <sys/sendfile.h> and
<kernel-features.h>.
[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.
2005-11-18 Andreas Schwab <schwab@suse.de> 2005-11-18 Andreas Schwab <schwab@suse.de>
* sysdeps/powerpc/powerpc32/fpu/s_lround.S: Remove useless alias. * sysdeps/powerpc/powerpc32/fpu/s_lround.S: Remove useless alias.

View File

@ -26,8 +26,15 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <dbg_log.h> #ifdef HAVE_SENDFILE
#include <nscd.h> # include <sys/sendfile.h>
#endif
#include "dbg_log.h"
#include "nscd.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif
typedef enum nss_status (*nss_gethostbyname3_r) typedef enum nss_status (*nss_gethostbyname3_r)
@ -365,7 +372,30 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
wait. */ wait. */
assert (fd != -1); 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; goto out;

View File

@ -39,6 +39,9 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/poll.h> #include <sys/poll.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/un.h> #include <sys/un.h>
@ -46,6 +49,9 @@
#include "nscd.h" #include "nscd.h"
#include "dbg_log.h" #include "dbg_log.h"
#include "selinux.h" #include "selinux.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif
/* Wrapper functions with error checking for standard functions. */ /* 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) if (cached != NULL)
{ {
/* Hurray it's in the cache. */ /* Hurray it's in the cache. */
if (writeall (fd, cached->data, cached->recsize) ssize_t nwritten;
!= cached->recsize
#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) && __builtin_expect (debug_level, 0) > 0)
{ {
/* We have problems sending the result. */ /* We have problems sending the result. */

View File

@ -32,11 +32,17 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/mman.h> #include <sys/mman.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif
#include <sys/socket.h> #include <sys/socket.h>
#include <stackinfo.h> #include <stackinfo.h>
#include "nscd.h" #include "nscd.h"
#include "dbg_log.h" #include "dbg_log.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif
/* This is the standard reply in case the service is disabled. */ /* This is the standard reply in case the service is disabled. */
static const gr_response_header 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. */ unnecessarily let the receiver wait. */
assert (fd != -1); 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 /* Add the record to the database. But only if it has not been

View File

@ -34,10 +34,16 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <arpa/nameser.h> #include <arpa/nameser.h>
#include <sys/mman.h> #include <sys/mman.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif
#include <stackinfo.h> #include <stackinfo.h>
#include "nscd.h" #include "nscd.h"
#include "dbg_log.h" #include "dbg_log.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif
/* This is the standard reply in case the service is disabled. */ /* 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. */ unnecessarily keep the receiver waiting. */
assert (fd != -1); 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 /* Add the record to the database. But only if it has not been

View File

@ -26,8 +26,15 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <dbg_log.h> #ifdef HAVE_SENDFILE
#include <nscd.h> # include <sys/sendfile.h>
#endif
#include "dbg_log.h"
#include "nscd.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif
#include "../nss/nsswitch.h" #include "../nss/nsswitch.h"
@ -344,7 +351,29 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
unnecessarily let the receiver wait. */ unnecessarily let the receiver wait. */
assert (fd != -1); 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);
} }

View File

@ -32,11 +32,17 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include <sys/mman.h> #include <sys/mman.h>
#ifdef HAVE_SENDFILE
# include <sys/sendfile.h>
#endif
#include <sys/socket.h> #include <sys/socket.h>
#include <stackinfo.h> #include <stackinfo.h>
#include "nscd.h" #include "nscd.h"
#include "dbg_log.h" #include "dbg_log.h"
#ifdef HAVE_SENDFILE
# include <kernel-features.h>
#endif
/* This is the standard reply in case the service is disabled. */ /* This is the standard reply in case the service is disabled. */
static const pw_response_header 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. */ unnecessarily let the receiver wait. */
assert (fd != -1); 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);
} }

View File

@ -30,18 +30,14 @@ futimesat (fd, file, tvp)
const char *file; const char *file;
const struct timeval tvp[2]; const struct timeval tvp[2];
{ {
if (fd < 0 && fd != AT_FDCWD) if (fd < 0
&& (file == NULL
|| (fd != AT_FDCWD && file[0] != '/')))
{ {
__set_errno (EBADF); __set_errno (EBADF);
return -1; return -1;
} }
if (file == NULL)
{
__set_errno (EINVAL);
return -1;
}
__set_errno (ENOSYS); __set_errno (ENOSYS);
return -1; return -1;
} }

View File

@ -152,6 +152,11 @@ CFLAGS-mq_receive.c += -fexceptions
endif endif
ifeq ($(subdir),nscd) ifeq ($(subdir),nscd)
CFLAGS-connections.c += -DHAVE_EPOLL CFLAGS-connections.c += -DHAVE_EPOLL -DHAVE_SENDFILE
CFLAGS-pwdcache.c += -DHAVE_SENDFILE
CFLAGS-grpcache.c += -DHAVE_SENDFILE
CFLAGS-hstcache.c += -DHAVE_SENDFILE
CFLAGS-aicache.c += -DHAVE_SENDFILE
CFLAGS-initgrcache.c += -DHAVE_SENDFILE
CFLAGS-gai.c += -DNEED_NETLINK CFLAGS-gai.c += -DNEED_NETLINK
endif endif

View File

@ -37,7 +37,22 @@ futimesat (fd, file, tvp)
{ {
char *buf = NULL; char *buf = NULL;
if (fd != AT_FDCWD && file[0] != '/') if (file == NULL)
{
static const char procfd[] = "/proc/self/fd/%d";
/* Buffer for the path name we are going to use. It consists of
- the string /proc/self/fd/
- the file descriptor number.
The final NUL is included in the sizeof. A bit of overhead
due to the format elements compensates for possible negative
numbers. */
size_t buflen = sizeof (procfd) + sizeof (int) * 3;
buf = alloca (buflen);
__snprintf (buf, buflen, procfd, fd);
file = buf;
}
else if (fd != AT_FDCWD && file[0] != '/')
{ {
size_t filelen = strlen (file); size_t filelen = strlen (file);
static const char procfd[] = "/proc/self/fd/%d/%s"; static const char procfd[] = "/proc/self/fd/%d/%s";

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2000, 2002 Free Software Foundation, Inc. /* Copyright (C) 2000, 2002, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -38,6 +38,8 @@
/* Segment low boundary address multiple. */ /* Segment low boundary address multiple. */
#define SHMLBA (1024 * 1024) #define SHMLBA (1024 * 1024)
/* Type to count number of attaches. */
typedef unsigned long int shmatt_t;
/* Data structure describing a set of semaphores. */ /* Data structure describing a set of semaphores. */
struct shmid_ds struct shmid_ds
@ -49,7 +51,7 @@ struct shmid_ds
__time_t shm_ctime; /* time of last change by shmctl() */ __time_t shm_ctime; /* time of last change by shmctl() */
__pid_t shm_cpid; /* pid of creator */ __pid_t shm_cpid; /* pid of creator */
__pid_t shm_lpid; /* pid of last shmop */ __pid_t shm_lpid; /* pid of last shmop */
unsigned long int shm_nattch; /* number of current attaches */ shmatt_t shm_nattch; /* number of current attaches */
unsigned long int __unused1; unsigned long int __unused1;
unsigned long int __unused2; unsigned long int __unused2;
}; };

View File

@ -84,6 +84,11 @@
# define __ASSUME_MSG_NOSIGNAL 1 # define __ASSUME_MSG_NOSIGNAL 1
#endif #endif
/* The sendfile syscall was introduced in 2.2.0. */
#if __LINUX_KERNEL_VERSION >= 131584
# define __ASSUME_SENDFILE 1
#endif
/* On x86 another `getrlimit' syscall was added in 2.3.25. */ /* On x86 another `getrlimit' syscall was added in 2.3.25. */
#if __LINUX_KERNEL_VERSION >= 131865 && defined __i386__ #if __LINUX_KERNEL_VERSION >= 131865 && defined __i386__
# define __ASSUME_NEW_GETRLIMIT_SYSCALL 1 # define __ASSUME_NEW_GETRLIMIT_SYSCALL 1