diff options
author | Benjamin LaHaise <benjamin.c.lahaise@intel.com> | 2006-03-21 00:31:51 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-03-21 00:31:51 -0500 |
commit | 1d541ddd74802cfa0eb8a3864668851f6cd79bdf (patch) | |
tree | 3db70aede59a2743124b077ed1dd2ebe3629b506 /include/net/scm.h | |
parent | e9df7d7f584666533b1bdfcf5c60a43d64689198 (diff) |
[AF_UNIX]: scm: better initialization
Instead of doing a memset then initialization of the fields of the scm
structure, just initialize all the members explicitly. Prevent reloading
of current on x86 and x86-64 by storing the value in a local variable for
subsequent dereferences. This is worth a ~7KB/s increase in af_unix
bandwidth. Note that we avoid the issues surrounding potentially
uninitialized members of the ucred structure by constructing a struct
ucred instead of assigning the members individually, which forces the
compiler to zero any padding.
[ I modified the patch not to use the aggregate assignment since
gcc-3.4.x and earlier cannot optimize that properly at all even
though gcc-4.0.x and later can -DaveM ]
Signed-off-by: Benjamin LaHaise <benjamin.c.lahaise@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/scm.h')
-rw-r--r-- | include/net/scm.h | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/include/net/scm.h b/include/net/scm.h index c3fa3d5ab606..540619cb7160 100644 --- a/include/net/scm.h +++ b/include/net/scm.h | |||
@@ -37,10 +37,12 @@ static __inline__ void scm_destroy(struct scm_cookie *scm) | |||
37 | static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, | 37 | static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, |
38 | struct scm_cookie *scm) | 38 | struct scm_cookie *scm) |
39 | { | 39 | { |
40 | memset(scm, 0, sizeof(*scm)); | 40 | struct task_struct *p = current; |
41 | scm->creds.uid = current->uid; | 41 | scm->creds.uid = p->uid; |
42 | scm->creds.gid = current->gid; | 42 | scm->creds.gid = p->gid; |
43 | scm->creds.pid = current->tgid; | 43 | scm->creds.pid = p->tgid; |
44 | scm->fp = NULL; | ||
45 | scm->seq = 0; | ||
44 | if (msg->msg_controllen <= 0) | 46 | if (msg->msg_controllen <= 0) |
45 | return 0; | 47 | return 0; |
46 | return __scm_send(sock, msg, scm); | 48 | return __scm_send(sock, msg, scm); |