Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 3766

kernel-2.6.18-194.11.1.el5.src.rpm

From: KII Keiichi <kkii@redhat.com>
Date: Thu, 23 Apr 2009 13:36:35 -0400
Subject: [trace] tracepoints for network socket
Message-id: 49F0A723.2060202@redhat.com
O-Subject: [RHEL5.4 PATCH 1/2] BZ475719: tracepoints for network socket
Bugzilla: 475719
RH-Acked-by: Neil Horman <nhorman@redhat.com>

This is the first patch to add tracepoints for network socket.
The purpose is to get socket information per sockets.

Keiichi

diff --git a/include/trace/socket.h b/include/trace/socket.h
new file mode 100644
index 0000000..f7cd08d
--- /dev/null
+++ b/include/trace/socket.h
@@ -0,0 +1,18 @@
+#ifndef _TRACE_SOCKET_H
+#define _TRACE_SOCKET_H
+
+#include <net/sock.h>
+#include <linux/tracepoint.h>
+
+DEFINE_TRACE(socket_sendmsg,
+	TPPROTO(struct socket *sock, struct msghdr *msg, size_t size, int ret),
+	TPARGS(sock, msg, size, ret));
+DEFINE_TRACE(socket_recvmsg,
+	TPPROTO(struct socket *sock, struct msghdr *msg, size_t size, int flags,
+		int ret),
+	TPARGS(sock, msg, size, flags, ret));
+DEFINE_TRACE(socket_sendpage,
+	TPPROTO(struct socket *sock, struct page *page, int offset, size_t size,
+		int flags, int ret),
+	TPARGS(sock, page, offset, size, flags, ret));
+#endif
diff --git a/net/socket.c b/net/socket.c
index 679828a..c1b06da 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -86,6 +86,7 @@
 #include <linux/kmod.h>
 #include <linux/audit.h>
 #include <linux/wireless.h>
+#include <trace/socket.h>
 
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
@@ -596,7 +597,9 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock,
 	if (err)
 		return err;
 
-	return sock->ops->sendmsg(iocb, sock, msg, size);
+	err = sock->ops->sendmsg(iocb, sock, msg, size);
+	trace_socket_sendmsg(sock, msg, size, err);
+	return err;
 }
 
 int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
@@ -647,7 +650,9 @@ static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock,
 	if (err)
 		return err;
 
-	return sock->ops->recvmsg(iocb, sock, msg, size, flags);
+	err = sock->ops->recvmsg(iocb, sock, msg, size, flags);
+	trace_socket_recvmsg(sock, msg, size, flags, err);
+	return err;
 }
 
 int sock_recvmsg(struct socket *sock, struct msghdr *msg, 
@@ -693,7 +698,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
 			     int offset, size_t size, loff_t *ppos, int more)
 {
 	struct socket *sock;
-	int flags;
+	int flags, err;
 
 	sock = file->private_data;
 
@@ -701,7 +706,9 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
 	if (more)
 		flags |= MSG_MORE;
 
-	return sock->ops->sendpage(sock, page, offset, size, flags);
+	err = sock->ops->sendpage(sock, page, offset, size, flags);
+	trace_socket_sendpage(sock, page, offset, size, flags, err);
+	return err;
 }
 
 static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb,