Skip to content

Commit f51bdd2

Browse files
Shaohua Litorvalds
authored andcommitted
mm: fix a vmscan warning
I get the below warning: BUG: using smp_processor_id() in preemptible [00000000] code: bash/746 caller is native_sched_clock+0x37/0x6e Pid: 746, comm: bash Tainted: G W 3.0.0+ #254 Call Trace: [<ffffffff813435c6>] debug_smp_processor_id+0xc2/0xdc [<ffffffff8104158d>] native_sched_clock+0x37/0x6e [<ffffffff81116219>] try_to_free_mem_cgroup_pages+0x7d/0x270 [<ffffffff8114f1f8>] mem_cgroup_force_empty+0x24b/0x27a [<ffffffff8114ff21>] ? sys_close+0x38/0x138 [<ffffffff8114ff21>] ? sys_close+0x38/0x138 [<ffffffff8114f257>] mem_cgroup_force_empty_write+0x17/0x19 [<ffffffff810c72fb>] cgroup_file_write+0xa8/0xba [<ffffffff811522d2>] vfs_write+0xb3/0x138 [<ffffffff8115241a>] sys_write+0x4a/0x71 [<ffffffff8114ffd9>] ? sys_close+0xf0/0x138 [<ffffffff8176deab>] system_call_fastpath+0x16/0x1b sched_clock() can't be used with preempt enabled. And we don't need fast approach to get clock here, so let's use ktime API. Signed-off-by: Shaohua Li <[email protected]> Acked-by: KAMEZAWA Hiroyuki <[email protected]> Tested-by: KAMEZAWA Hiroyuki <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 7e8aa04 commit f51bdd2

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

mm/vmscan.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2283,7 +2283,7 @@ unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem,
22832283
.mem_cgroup = mem,
22842284
.memcg_record = rec,
22852285
};
2286-
unsigned long start, end;
2286+
ktime_t start, end;
22872287

22882288
sc.gfp_mask = (gfp_mask & GFP_RECLAIM_MASK) |
22892289
(GFP_HIGHUSER_MOVABLE & ~GFP_RECLAIM_MASK);
@@ -2292,7 +2292,7 @@ unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem,
22922292
sc.may_writepage,
22932293
sc.gfp_mask);
22942294

2295-
start = sched_clock();
2295+
start = ktime_get();
22962296
/*
22972297
* NOTE: Although we can get the priority field, using it
22982298
* here is not a good idea, since it limits the pages we can scan.
@@ -2301,10 +2301,10 @@ unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem,
23012301
* the priority and make it zero.
23022302
*/
23032303
shrink_zone(0, zone, &sc);
2304-
end = sched_clock();
2304+
end = ktime_get();
23052305

23062306
if (rec)
2307-
rec->elapsed += end - start;
2307+
rec->elapsed += ktime_to_ns(ktime_sub(end, start));
23082308
*scanned = sc.nr_scanned;
23092309

23102310
trace_mm_vmscan_memcg_softlimit_reclaim_end(sc.nr_reclaimed);
@@ -2319,7 +2319,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont,
23192319
{
23202320
struct zonelist *zonelist;
23212321
unsigned long nr_reclaimed;
2322-
unsigned long start, end;
2322+
ktime_t start, end;
23232323
int nid;
23242324
struct scan_control sc = {
23252325
.may_writepage = !laptop_mode,
@@ -2337,7 +2337,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont,
23372337
.gfp_mask = sc.gfp_mask,
23382338
};
23392339

2340-
start = sched_clock();
2340+
start = ktime_get();
23412341
/*
23422342
* Unlike direct reclaim via alloc_pages(), memcg's reclaim doesn't
23432343
* take care of from where we get pages. So the node where we start the
@@ -2352,9 +2352,9 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont,
23522352
sc.gfp_mask);
23532353

23542354
nr_reclaimed = do_try_to_free_pages(zonelist, &sc, &shrink);
2355-
end = sched_clock();
2355+
end = ktime_get();
23562356
if (rec)
2357-
rec->elapsed += end - start;
2357+
rec->elapsed += ktime_to_ns(ktime_sub(end, start));
23582358

23592359
trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed);
23602360

0 commit comments

Comments
 (0)