mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-22 13:54:57 +08:00
delayacct: clear right task's flag after blkio completes
When I was implementing a latency analyzer tool by using task->delays and other things, I found an issue in delayacct. The issue is it should clear the target's flag instead of current's in delayacct_blkio_end(). When I git blame delayacct, I found there're some similar issues we have fixed in delayacct_blkio_end(). - Commitc96f5471ce
("delayacct: Account blkio completion on the correct task") fixed the issue that it should account blkio completion on the target task instead of current. - Commitb512719f77
("delayacct: fix crash in delayacct_blkio_end() after delayacct init failure") fixed the issue that it should check target task's delays instead of current task'. It seems that delayacct_blkio_{begin, end} are error prone. So I introduce a new paratmeter - the target task 'p' - to these helpers. After that change, the callsite will specifilly set the right task, which should make it less error prone. Link: https://lkml.kernel.org/r/20210414083720.24083-1-laoar.shao@gmail.com Signed-off-by: Yafang Shao <laoar.shao@gmail.com> Cc: Tejun Heo <tj@kernel.org> Cc: Josh Snyder <joshs@netflix.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Ingo Molnar <mingo@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
6f1f942cd5
commit
3d1c7fd97e
@ -82,16 +82,16 @@ static inline int delayacct_is_task_waiting_on_io(struct task_struct *p)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void delayacct_set_flag(int flag)
|
static inline void delayacct_set_flag(struct task_struct *p, int flag)
|
||||||
{
|
{
|
||||||
if (current->delays)
|
if (p->delays)
|
||||||
current->delays->flags |= flag;
|
p->delays->flags |= flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void delayacct_clear_flag(int flag)
|
static inline void delayacct_clear_flag(struct task_struct *p, int flag)
|
||||||
{
|
{
|
||||||
if (current->delays)
|
if (p->delays)
|
||||||
current->delays->flags &= ~flag;
|
p->delays->flags &= ~flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void delayacct_tsk_init(struct task_struct *tsk)
|
static inline void delayacct_tsk_init(struct task_struct *tsk)
|
||||||
@ -114,7 +114,7 @@ static inline void delayacct_tsk_free(struct task_struct *tsk)
|
|||||||
|
|
||||||
static inline void delayacct_blkio_start(void)
|
static inline void delayacct_blkio_start(void)
|
||||||
{
|
{
|
||||||
delayacct_set_flag(DELAYACCT_PF_BLKIO);
|
delayacct_set_flag(current, DELAYACCT_PF_BLKIO);
|
||||||
if (current->delays)
|
if (current->delays)
|
||||||
__delayacct_blkio_start();
|
__delayacct_blkio_start();
|
||||||
}
|
}
|
||||||
@ -123,7 +123,7 @@ static inline void delayacct_blkio_end(struct task_struct *p)
|
|||||||
{
|
{
|
||||||
if (p->delays)
|
if (p->delays)
|
||||||
__delayacct_blkio_end(p);
|
__delayacct_blkio_end(p);
|
||||||
delayacct_clear_flag(DELAYACCT_PF_BLKIO);
|
delayacct_clear_flag(p, DELAYACCT_PF_BLKIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int delayacct_add_tsk(struct taskstats *d,
|
static inline int delayacct_add_tsk(struct taskstats *d,
|
||||||
@ -166,9 +166,9 @@ static inline void delayacct_thrashing_end(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline void delayacct_set_flag(int flag)
|
static inline void delayacct_set_flag(struct task_struct *p, int flag)
|
||||||
{}
|
{}
|
||||||
static inline void delayacct_clear_flag(int flag)
|
static inline void delayacct_clear_flag(struct task_struct *p, int flag)
|
||||||
{}
|
{}
|
||||||
static inline void delayacct_init(void)
|
static inline void delayacct_init(void)
|
||||||
{}
|
{}
|
||||||
|
@ -3339,7 +3339,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
delayacct_set_flag(DELAYACCT_PF_SWAPIN);
|
delayacct_set_flag(current, DELAYACCT_PF_SWAPIN);
|
||||||
page = lookup_swap_cache(entry, vma, vmf->address);
|
page = lookup_swap_cache(entry, vma, vmf->address);
|
||||||
swapcache = page;
|
swapcache = page;
|
||||||
|
|
||||||
@ -3388,7 +3388,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
|
|||||||
vmf->address, &vmf->ptl);
|
vmf->address, &vmf->ptl);
|
||||||
if (likely(pte_same(*vmf->pte, vmf->orig_pte)))
|
if (likely(pte_same(*vmf->pte, vmf->orig_pte)))
|
||||||
ret = VM_FAULT_OOM;
|
ret = VM_FAULT_OOM;
|
||||||
delayacct_clear_flag(DELAYACCT_PF_SWAPIN);
|
delayacct_clear_flag(current, DELAYACCT_PF_SWAPIN);
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3402,13 +3402,13 @@ vm_fault_t do_swap_page(struct vm_fault *vmf)
|
|||||||
* owner processes (which may be unknown at hwpoison time)
|
* owner processes (which may be unknown at hwpoison time)
|
||||||
*/
|
*/
|
||||||
ret = VM_FAULT_HWPOISON;
|
ret = VM_FAULT_HWPOISON;
|
||||||
delayacct_clear_flag(DELAYACCT_PF_SWAPIN);
|
delayacct_clear_flag(current, DELAYACCT_PF_SWAPIN);
|
||||||
goto out_release;
|
goto out_release;
|
||||||
}
|
}
|
||||||
|
|
||||||
locked = lock_page_or_retry(page, vma->vm_mm, vmf->flags);
|
locked = lock_page_or_retry(page, vma->vm_mm, vmf->flags);
|
||||||
|
|
||||||
delayacct_clear_flag(DELAYACCT_PF_SWAPIN);
|
delayacct_clear_flag(current, DELAYACCT_PF_SWAPIN);
|
||||||
if (!locked) {
|
if (!locked) {
|
||||||
ret |= VM_FAULT_RETRY;
|
ret |= VM_FAULT_RETRY;
|
||||||
goto out_release;
|
goto out_release;
|
||||||
|
Loading…
Reference in New Issue
Block a user