diff -NurpP --minimal linux-2.6.20.14-vs2.2.0.0.7/block/ll_rw_blk.c linux-2.6.20.14-vs2.2.0.0.7.2/block/ll_rw_blk.c --- linux-2.6.20.14-vs2.2.0.0.7/block/ll_rw_blk.c 2007-03-10 18:57:30 +0100 +++ linux-2.6.20.14-vs2.2.0.0.7.2/block/ll_rw_blk.c 2007-06-24 18:53:40 +0200 @@ -30,6 +30,7 @@ #include #include #include +#include /* * for max sense size @@ -2674,6 +2675,8 @@ static void drive_stat_acct(struct reque disk_round_stats(rq->rq_disk); rq->rq_disk->in_flight++; } + + vx_acc_diskio(current_vx_info(), rw, new_io, nr_sectors); } /* diff -NurpP --minimal linux-2.6.20.14-vs2.2.0.0.7/include/linux/vs_diskio.h linux-2.6.20.14-vs2.2.0.0.7.2/include/linux/vs_diskio.h --- linux-2.6.20.14-vs2.2.0.0.7/include/linux/vs_diskio.h 1970-01-01 01:00:00 +0100 +++ linux-2.6.20.14-vs2.2.0.0.7.2/include/linux/vs_diskio.h 2007-06-25 02:43:55 +0200 @@ -0,0 +1,26 @@ +#ifndef _VS_DISKIO_H +#define _VS_DISKIO_H + +#include "vserver/debug.h" +#include "vserver/base.h" +#include "vserver/cacct.h" +#include "vserver/context.h" + + +/* disk I/O accounting */ + +#define vx_acc_diskio(v, t, n, s) \ + __vx_acc_diskio(v, t, n, s, __FILE__, __LINE__) + +static inline void __vx_acc_diskio(struct vx_info *vxi, + int type, int num, int size, char *_file, int _line) +{ + if (vxi) { + atomic_long_add(num, &vxi->cacct.diskio[type].count); + atomic_long_add(size, &vxi->cacct.diskio[type].total); + } +} + +#else +#warning duplicate inclusion +#endif diff -NurpP --minimal linux-2.6.20.14-vs2.2.0.0.7/include/linux/vserver/cacct_def.h linux-2.6.20.14-vs2.2.0.0.7.2/include/linux/vserver/cacct_def.h --- linux-2.6.20.14-vs2.2.0.0.7/include/linux/vserver/cacct_def.h 2007-06-13 09:47:21 +0200 +++ linux-2.6.20.14-vs2.2.0.0.7.2/include/linux/vserver/cacct_def.h 2007-06-24 21:36:16 +0200 @@ -10,10 +10,16 @@ struct _vx_sock_acc { atomic_long_t total; }; +struct _vx_diskio_acc { + atomic_long_t count; + atomic_long_t total; +}; + /* context sub struct */ struct _vx_cacct { struct _vx_sock_acc sock[VXA_SOCK_SIZE][3]; + struct _vx_diskio_acc diskio[2]; atomic_t slab[8]; atomic_t page[6][8]; }; diff -NurpP --minimal linux-2.6.20.14-vs2.2.0.0.7/include/linux/vserver/cacct_int.h linux-2.6.20.14-vs2.2.0.0.7.2/include/linux/vserver/cacct_int.h --- linux-2.6.20.14-vs2.2.0.0.7/include/linux/vserver/cacct_int.h 2007-02-06 03:05:22 +0100 +++ linux-2.6.20.14-vs2.2.0.0.7.2/include/linux/vserver/cacct_int.h 2007-06-24 21:22:05 +0200 @@ -10,12 +10,24 @@ unsigned long vx_sock_count(struct _vx_c return atomic_long_read(&cacct->sock[type][pos].count); } - static inline unsigned long vx_sock_total(struct _vx_cacct *cacct, int type, int pos) { return atomic_long_read(&cacct->sock[type][pos].total); } + +static inline +unsigned long vx_diskio_count(struct _vx_cacct *cacct, int type) +{ + return atomic_long_read(&cacct->diskio[type].count); +} + +static inline +unsigned long vx_diskio_total(struct _vx_cacct *cacct, int type) +{ + return atomic_long_read(&cacct->diskio[type].total); +} + #endif /* __KERNEL__ */ #endif /* _VX_CACCT_INT_H */ diff -NurpP --minimal linux-2.6.20.14-vs2.2.0.0.7/kernel/vserver/cacct_init.h linux-2.6.20.14-vs2.2.0.0.7.2/kernel/vserver/cacct_init.h --- linux-2.6.20.14-vs2.2.0.0.7/kernel/vserver/cacct_init.h 2007-06-13 09:48:33 +0200 +++ linux-2.6.20.14-vs2.2.0.0.7.2/kernel/vserver/cacct_init.h 2007-06-24 21:38:25 +0200 @@ -7,6 +7,10 @@ static inline void vx_info_init_cacct(st atomic_long_set(&cacct->sock[i][j].total, 0); } } + for (i = 0; i < 2; i++) { + atomic_long_set(&cacct->diskio[i].count, 0); + atomic_long_set(&cacct->diskio[i].total, 0); + } for (i = 0; i < 8; i++) atomic_set(&cacct->slab[i], 0); for (i = 0; i < 5; i++) diff -NurpP --minimal linux-2.6.20.14-vs2.2.0.0.7/kernel/vserver/cacct_proc.h linux-2.6.20.14-vs2.2.0.0.7.2/kernel/vserver/cacct_proc.h --- linux-2.6.20.14-vs2.2.0.0.7/kernel/vserver/cacct_proc.h 2007-06-14 18:12:51 +0200 +++ linux-2.6.20.14-vs2.2.0.0.7.2/kernel/vserver/cacct_proc.h 2007-06-25 01:54:26 +0200 @@ -28,6 +28,14 @@ static inline int vx_info_proc_cacct(str length += sprintf(buffer + length, "\n"); length += sprintf(buffer + length, + "diskio:\t%10lu/%-10lu\t%10lu/%-10lu\n", + vx_diskio_count(cacct, 0), + vx_diskio_total(cacct, 0), + vx_diskio_count(cacct, 1), + vx_diskio_total(cacct, 1)); + + length += sprintf(buffer + length, "\n"); + length += sprintf(buffer + length, "slab:\t %8u %8u %8u %8u\n", atomic_read(&cacct->slab[1]), atomic_read(&cacct->slab[4]),