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 task_chr_io_accounting_add(dst, src); 112 task_blk_io_accounting_add(dst, src); 113 } 114 #endif /* __TASK_IO_ACCOUNTING_OPS_INCLUDED */ 115