Thread (3 messages) 3 messages, 3 authors, 2015-02-17

Re: [v3.10-rt / v3.12-rt] scheduling while atomic in cgroup code

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date: 2015-02-17 09:28:37
Also in: lkml

* Mike Galbraith | 2014-06-21 10:09:48 [+0200]:
quoted hunk ↗ jump to hunk
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -2398,16 +2398,18 @@ static bool consume_stock(struct mem_cgr
{
	struct memcg_stock_pcp *stock;
	bool ret = true;
+	int cpu;

	if (nr_pages > CHARGE_BATCH)
		return false;

-	stock = &get_cpu_var(memcg_stock);
+	cpu = get_cpu_light();
+	stock = &per_cpu(memcg_stock, cpu);
	if (memcg == stock->cached && stock->nr_pages >= nr_pages)
		stock->nr_pages -= nr_pages;
	else /* need to call res_counter_charge */
		ret = false;
-	put_cpu_var(memcg_stock);
+	put_cpu_light();
	return ret;
}
I am not taking this chunk. That preempt_disable() is lower weight
and there is nothing happening that does not work with it.
quoted hunk ↗ jump to hunk
@@ -2457,14 +2459,17 @@ static void __init memcg_stock_init(void
 */
static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
{
-	struct memcg_stock_pcp *stock = &get_cpu_var(memcg_stock);
+	struct memcg_stock_pcp *stock;
+	int cpu = get_cpu_light();
+
+	stock = &per_cpu(memcg_stock, cpu);

	if (stock->cached != memcg) { /* reset if necessary */
		drain_stock(stock);
		stock->cached = memcg;
	}
I am a little more worried that drain_stock() could be called more than
once on the same CPU.
- memcg_cpu_hotplug_callback() doesn't disable preemption
- drain_local_stock() doesn't as well

so maybe it doesn't matter.
	stock->nr_pages += nr_pages;
-	put_cpu_var(memcg_stock);
+	put_cpu_light();
}
Sebastian
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help