Skip to content

Commit

Permalink
vmscan: implement swap token priority aging
Browse files Browse the repository at this point in the history
While testing for memcg aware swap token, I observed a swap token was
often grabbed an intermittent running process (eg init, auditd) and they
never release a token.

Why?

Some processes (eg init, auditd, audispd) wake up when a process exiting.
And swap token can be get first page-in process when a process exiting
makes no swap token owner.  Thus such above intermittent running process
often get a token.

And currently, swap token priority is only decreased at page fault path.
Then, if the process sleep immediately after to grab swap token, the swap
token priority never be decreased.  That's obviously undesirable.

This patch implement very poor (and lightweight) priority aging.  It only
be affect to the above corner case and doesn't change swap tendency
workload performance (eg multi process qsbench load)

Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
KOSAKI Motohiro authored and Linus Torvalds committed Jun 16, 2011
1 parent 83cd81a commit d7911ef
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
20 changes: 13 additions & 7 deletions include/trace/events/vmscan.h
Original file line number Diff line number Diff line change
Expand Up @@ -366,26 +366,32 @@ DEFINE_EVENT_CONDITION(put_swap_token_template, disable_swap_token,

TRACE_EVENT_CONDITION(update_swap_token_priority,
TP_PROTO(struct mm_struct *mm,
unsigned int old_prio),
unsigned int old_prio,
struct mm_struct *swap_token_mm),

TP_ARGS(mm, old_prio),
TP_ARGS(mm, old_prio, swap_token_mm),

TP_CONDITION(mm->token_priority != old_prio),

TP_STRUCT__entry(
__field(struct mm_struct*, mm)
__field(unsigned int, old_prio)
__field(unsigned int, new_prio)
__field(struct mm_struct*, swap_token_mm)
__field(unsigned int, swap_token_prio)
),

TP_fast_assign(
__entry->mm = mm;
__entry->old_prio = old_prio;
__entry->new_prio = mm->token_priority;
__entry->mm = mm;
__entry->old_prio = old_prio;
__entry->new_prio = mm->token_priority;
__entry->swap_token_mm = swap_token_mm;
__entry->swap_token_prio = swap_token_mm ? swap_token_mm->token_priority : 0;
),

TP_printk("mm=%p old_prio=%u new_prio=%u",
__entry->mm, __entry->old_prio, __entry->new_prio)
TP_printk("mm=%p old_prio=%u new_prio=%u swap_token_mm=%p token_prio=%u",
__entry->mm, __entry->old_prio, __entry->new_prio,
__entry->swap_token_mm, __entry->swap_token_prio)
);

#endif /* _TRACE_VMSCAN_H */
Expand Down
11 changes: 10 additions & 1 deletion mm/thrash.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,13 @@

#include <trace/events/vmscan.h>

#define TOKEN_AGING_INTERVAL (0xFF)

static DEFINE_SPINLOCK(swap_token_lock);
struct mm_struct *swap_token_mm;
struct mem_cgroup *swap_token_memcg;
static unsigned int global_faults;
static unsigned int last_aging;

#ifdef CONFIG_CGROUP_MEM_RES_CTLR
static struct mem_cgroup *swap_token_memcg_from_mm(struct mm_struct *mm)
Expand Down Expand Up @@ -64,6 +67,11 @@ void grab_swap_token(struct mm_struct *mm)
if (!swap_token_mm)
goto replace_token;

if ((global_faults - last_aging) > TOKEN_AGING_INTERVAL) {
swap_token_mm->token_priority /= 2;
last_aging = global_faults;
}

if (mm == swap_token_mm) {
mm->token_priority += 2;
goto update_priority;
Expand All @@ -81,7 +89,7 @@ void grab_swap_token(struct mm_struct *mm)
goto replace_token;

update_priority:
trace_update_swap_token_priority(mm, old_prio);
trace_update_swap_token_priority(mm, old_prio, swap_token_mm);

out:
mm->faultstamp = global_faults;
Expand All @@ -94,6 +102,7 @@ void grab_swap_token(struct mm_struct *mm)
trace_replace_swap_token(swap_token_mm, mm);
swap_token_mm = mm;
swap_token_memcg = swap_token_memcg_from_mm(mm);
last_aging = global_faults;
goto out;
}

Expand Down

0 comments on commit d7911ef

Please sign in to comment.