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>
This commit is contained in:
parent
396f015c5d
commit
0d1e81ffe0
1 changed files with 10 additions and 4 deletions
|
@ -200,14 +200,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;
|
||||
}
|
||||
|
@ -218,8 +225,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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue