Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : /* 3 : * Task I/O accounting operations 4 : */ 5 : #ifndef __TASK_IO_ACCOUNTING_OPS_INCLUDED 6 : #define __TASK_IO_ACCOUNTING_OPS_INCLUDED 7 : 8 : #include <linux/sched.h> 9 : 10 : #ifdef CONFIG_TASK_IO_ACCOUNTING 11 : static inline void task_io_account_read(size_t bytes) 12 : { 13 : current->ioac.read_bytes += bytes; 14 : } 15 : 16 : /* 17 : * We approximate number of blocks, because we account bytes only. 18 : * A 'block' is 512 bytes 19 : */ 20 : static inline unsigned long task_io_get_inblock(const struct task_struct *p) 21 : { 22 : return p->ioac.read_bytes >> 9; 23 : } 24 : 25 : static inline void task_io_account_write(size_t bytes) 26 : { 27 : current->ioac.write_bytes += bytes; 28 : } 29 : 30 : /* 31 : * We approximate number of blocks, because we account bytes only. 32 : * A 'block' is 512 bytes 33 : */ 34 : static inline unsigned long task_io_get_oublock(const struct task_struct *p) 35 : { 36 : return p->ioac.write_bytes >> 9; 37 : } 38 : 39 : static inline void task_io_account_cancelled_write(size_t bytes) 40 : { 41 : current->ioac.cancelled_write_bytes += bytes; 42 : } 43 : 44 : static inline void task_io_accounting_init(struct task_io_accounting *ioac) 45 : { 46 : memset(ioac, 0, sizeof(*ioac)); 47 : } 48 : 49 : static inline void task_blk_io_accounting_add(struct task_io_accounting *dst, 50 : struct task_io_accounting *src) 51 : { 52 : dst->read_bytes += src->read_bytes; 53 : dst->write_bytes += src->write_bytes; 54 : dst->cancelled_write_bytes += src->cancelled_write_bytes; 55 : } 56 : 57 : #else 58 : 59 : static inline void task_io_account_read(size_t bytes) 60 : { 61 : } 62 : 63 : static inline unsigned long task_io_get_inblock(const struct task_struct *p) 64 : { 65 : return 0; 66 : } 67 : 68 : static inline void task_io_account_write(size_t bytes) 69 : { 70 : } 71 : 72 : static inline unsigned long task_io_get_oublock(const struct task_struct *p) 73 : { 74 : return 0; 75 : } 76 : 77 : static inline void task_io_account_cancelled_write(size_t bytes) 78 : { 79 : } 80 : 81 : static inline void task_io_accounting_init(struct task_io_accounting *ioac) 82 : { 83 : } 84 : 85 : static inline void task_blk_io_accounting_add(struct task_io_accounting *dst, 86 : struct task_io_accounting *src) 87 : { 88 : } 89 : 90 : #endif /* CONFIG_TASK_IO_ACCOUNTING */ 91 : 92 : #ifdef CONFIG_TASK_XACCT 93 : static inline void task_chr_io_accounting_add(struct task_io_accounting *dst, 94 : struct task_io_accounting *src) 95 : { 96 : dst->rchar += src->rchar; 97 : dst->wchar += src->wchar; 98 : dst->syscr += src->syscr; 99 : dst->syscw += src->syscw; 100 : } 101 : #else 102 : static inline void task_chr_io_accounting_add(struct task_io_accounting *dst, 103 : struct task_io_accounting *src) 104 : { 105 : } 106 : #endif /* CONFIG_TASK_XACCT */ 107 : 108 : static inline void task_io_accounting_add(struct task_io_accounting *dst, 109 : struct task_io_accounting *src) 110 : { 111 333 : task_chr_io_accounting_add(dst, src); 112 333 : task_blk_io_accounting_add(dst, src); 113 : } 114 : #endif /* __TASK_IO_ACCOUNTING_OPS_INCLUDED */