lkml.org 
[lkml]   [2010]   [Jun]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Date
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,

\
 
 \ /
  Last update: 2010-06-02 23:59    [W:0.396 / U:0.148 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site