aboutsummaryrefslogtreecommitdiff
path: root/drivers/misc/uid_sys_stats.c
diff options
context:
space:
mode:
authorJin Qian <jinqian@google.com>2017-02-28 15:09:42 -0800
committerMister Oyster <oysterized@gmail.com>2017-05-23 13:00:33 +0200
commit61597b1634e85b2e7c6d4f83bddeb0692c14b87c (patch)
tree9625a5004196dbc7b0710424036c1603f89ad68f /drivers/misc/uid_sys_stats.c
parenta571c7301b1ea6433176320185b670e1b26034d9 (diff)
ANDROID: uid_sys_stats: fix negative write bytes.
A task can cancel writes made by other tasks. In rare cases, cancelled_write_bytes is larger than write_bytes if the task itself didn't make any write. This doesn't affect total size but may cause confusion when looking at IO usage on individual tasks. Bug: 35851986 Change-Id: If6cb549aeef9e248e18d804293401bb2b91918ca Signed-off-by: Jin Qian <jinqian@google.com>
Diffstat (limited to 'drivers/misc/uid_sys_stats.c')
-rw-r--r--drivers/misc/uid_sys_stats.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/misc/uid_sys_stats.c b/drivers/misc/uid_sys_stats.c
index 5d7d16dfd..356826946 100644
--- a/drivers/misc/uid_sys_stats.c
+++ b/drivers/misc/uid_sys_stats.c
@@ -233,14 +233,21 @@ static const struct file_operations uid_remove_fops = {
.write = uid_remove_write,
};
+static u64 compute_write_bytes(struct task_struct *task)
+{
+ if (task->ioac.write_bytes <= task->ioac.cancelled_write_bytes)
+ return 0;
+
+ return task->ioac.write_bytes - task->ioac.cancelled_write_bytes;
+}
+
static void add_uid_io_curr_stats(struct uid_entry *uid_entry,
struct task_struct *task)
{
struct io_stats *io_curr = &uid_entry->io[UID_STATE_TOTAL_CURR];
io_curr->read_bytes += task->ioac.read_bytes;
- io_curr->write_bytes +=
- task->ioac.write_bytes - task->ioac.cancelled_write_bytes;
+ io_curr->write_bytes += compute_write_bytes(task);
io_curr->rchar += task->ioac.rchar;
io_curr->wchar += task->ioac.wchar;
}
@@ -251,8 +258,7 @@ static void clean_uid_io_last_stats(struct uid_entry *uid_entry,
struct io_stats *io_last = &uid_entry->io[UID_STATE_TOTAL_LAST];
io_last->read_bytes -= task->ioac.read_bytes;
- io_last->write_bytes -=
- task->ioac.write_bytes - task->ioac.cancelled_write_bytes;
+ io_last->write_bytes -= compute_write_bytes(task);
io_last->rchar -= task->ioac.rchar;
io_last->wchar -= task->ioac.wchar;
}