lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Wed, 2 Jun 2010 18:56:43 -0300
From:	Rafael Tinoco <tinhocas@...il.com>
To:	LKML <linux-kernel@...r.kernel.org>,
	Balbir <balbir@...ux.vnet.ibm.com>,
	Scrum - Linux <scrum-linux@...aweb.com.br>,
	Juliano Martinez <juliano.martinez@...aweb.com.br>,
	Gleicon Moraes <gleicon.moraes@...aweb.com.br>
Subject: [PATCH] task_io_accounting, taskstats

Hello,

I'm proposing this patch to extend taskstats capability of
IO_ACCOUTING based on socket msg size.
Already discussed with Balbir about it. The idea was to keep the
"socket" accounting generic.
Not taking in consideration witch type of socket or protocol is used.
I'm using this in a user land tool called ustats for uid accounting
with very low overhead (cn_msg and taskstats through netlink).

Thanks

Rafael Tinoco

diff --git a/include/linux/task_io_accounting.h
b/include/linux/task_io_accounting.h
index bdf855c..ed54fab 100644
--- a/include/linux/task_io_accounting.h
+++ b/include/linux/task_io_accounting.h
@@ -41,5 +41,16 @@ struct task_io_accounting {
 	 * information loss in doing that.
 	 */
 	u64 cancelled_write_bytes;
+
+	/*
+	 * The number of bytes which this task has read from a socket
+	 */
+	u64 read_net_bytes;
+
+        /*
+	 * The number of bytes which this task has written to a socket
+	 */
+	u64 write_net_bytes;
+
 #endif /* CONFIG_TASK_IO_ACCOUNTING */
 };
diff --git a/include/linux/task_io_accounting_ops.h
b/include/linux/task_io_accounting_ops.h
index 4d090f9..f28aa4c 100644
--- a/include/linux/task_io_accounting_ops.h
+++ b/include/linux/task_io_accounting_ops.h
@@ -12,6 +12,11 @@ static inline void task_io_account_read(size_t bytes)
 	current->ioac.read_bytes += bytes;
 }

+static inline void task_io_account_read_net(size_t bytes)
+{
+        current->ioac.read_net_bytes += bytes;
+}
+
 /*
  * We approximate number of blocks, because we account bytes only.
  * A 'block' is 512 bytes
@@ -26,6 +31,11 @@ static inline void task_io_account_write(size_t bytes)
 	current->ioac.write_bytes += bytes;
 }

+static inline void task_io_account_write_net(size_t bytes)
+{
+        current->ioac.write_net_bytes += bytes;
+}
+
 /*
  * We approximate number of blocks, because we account bytes only.
  * A 'block' is 512 bytes
@@ -59,6 +69,10 @@ static inline void task_io_account_read(size_t bytes)
 {
 }

+static inline void task_io_account_read_net(size_t bytes)
+{
+}
+
 static inline unsigned long task_io_get_inblock(const struct task_struct *p)
 {
 	return 0;
@@ -68,6 +82,10 @@ static inline void task_io_account_write(size_t bytes)
 {
 }

+static inline void task_io_account_write_net(size_t bytes)
+{
+}
+
 static inline unsigned long task_io_get_oublock(const struct task_struct *p)
 {
 	return 0;
diff --git a/include/linux/taskstats.h b/include/linux/taskstats.h
index 341dddb..5067376 100644
--- a/include/linux/taskstats.h
+++ b/include/linux/taskstats.h
@@ -163,6 +163,10 @@ struct taskstats {
 	/* Delay waiting for memory reclaim */
 	__u64	freepages_count;
 	__u64	freepages_delay_total;
+
+        /* Per-task network I/O accounting */
+        __u64   read_net_bytes;         /* bytes of socket read I/O */
+        __u64   write_net_bytes;        /* bytes of socket write I/O */
 };


diff --git a/net/socket.c b/net/socket.c
index 769c386..93507a3 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -103,6 +103,8 @@
 #include <linux/sockios.h>
 #include <linux/atalk.h>

+#include <linux/task_io_accounting_ops.h>
+
 static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
 static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
 			 unsigned long nr_segs, loff_t pos);
@@ -550,6 +552,9 @@ static inline int __sock_sendmsg(struct kiocb
*iocb, struct socket *sock,
 	if (err)
 		return err;

+        if(size > 0)
+            task_io_account_read_net(size);
+
 	return sock->ops->sendmsg(iocb, sock, msg, size);
 }

@@ -666,6 +671,7 @@ EXPORT_SYMBOL_GPL(sock_recv_ts_and_drops);
 static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock,
 				       struct msghdr *msg, size_t size, int flags)
 {
+        int ret = 0;
 	struct sock_iocb *si = kiocb_to_siocb(iocb);

 	si->sock = sock;
@@ -674,7 +680,12 @@ static inline int __sock_recvmsg_nosec(struct
kiocb *iocb, struct socket *sock,
 	si->size = size;
 	si->flags = flags;

-	return sock->ops->recvmsg(iocb, sock, msg, size, flags);
+        ret = sock->ops->recvmsg(iocb, sock, msg, size, flags);
+
+        if(ret > 0)
+            task_io_account_read_net(ret);
+
+        return ret;
 }

 static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock,
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ