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
11static 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 */
20static inline unsigned long task_io_get_inblock(const struct task_struct *p)
21{
22 return p->ioac.read_bytes >> 9;
23}
24
25static 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 */
34static inline unsigned long task_io_get_oublock(const struct task_struct *p)
35{
36 return p->ioac.write_bytes >> 9;
37}
38
39static inline void task_io_account_cancelled_write(size_t bytes)
40{
41 current->ioac.cancelled_write_bytes += bytes;
42}
43
44static inline void task_io_accounting_init(struct task_io_accounting *ioac)
45{
46 memset(ioac, 0, sizeof(*ioac));
47}
48
49static 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
59static inline void task_io_account_read(size_t bytes)
60{
61}
62
63static inline unsigned long task_io_get_inblock(const struct task_struct *p)
64{
65 return 0;
66}
67
68static inline void task_io_account_write(size_t bytes)
69{
70}
71
72static inline unsigned long task_io_get_oublock(const struct task_struct *p)
73{
74 return 0;
75}
76
77static inline void task_io_account_cancelled_write(size_t bytes)
78{
79}
80
81static inline void task_io_accounting_init(struct task_io_accounting *ioac)
82{
83}
84
85static 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
93static 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
102static 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
108static 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