|
@@ -1740,17 +1740,22 @@ static DEFINE_MUTEX(percpu_charge_mutex);
|
|
static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
|
|
static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
|
|
{
|
|
{
|
|
struct memcg_stock_pcp *stock;
|
|
struct memcg_stock_pcp *stock;
|
|
|
|
+ unsigned long flags;
|
|
bool ret = false;
|
|
bool ret = false;
|
|
|
|
|
|
if (nr_pages > CHARGE_BATCH)
|
|
if (nr_pages > CHARGE_BATCH)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
- stock = &get_cpu_var(memcg_stock);
|
|
|
|
|
|
+ local_irq_save(flags);
|
|
|
|
+
|
|
|
|
+ stock = this_cpu_ptr(&memcg_stock);
|
|
if (memcg == stock->cached && stock->nr_pages >= nr_pages) {
|
|
if (memcg == stock->cached && stock->nr_pages >= nr_pages) {
|
|
stock->nr_pages -= nr_pages;
|
|
stock->nr_pages -= nr_pages;
|
|
ret = true;
|
|
ret = true;
|
|
}
|
|
}
|
|
- put_cpu_var(memcg_stock);
|
|
|
|
|
|
+
|
|
|
|
+ local_irq_restore(flags);
|
|
|
|
+
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1771,15 +1776,18 @@ static void drain_stock(struct memcg_stock_pcp *stock)
|
|
stock->cached = NULL;
|
|
stock->cached = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * This must be called under preempt disabled or must be called by
|
|
|
|
- * a thread which is pinned to local cpu.
|
|
|
|
- */
|
|
|
|
static void drain_local_stock(struct work_struct *dummy)
|
|
static void drain_local_stock(struct work_struct *dummy)
|
|
{
|
|
{
|
|
- struct memcg_stock_pcp *stock = this_cpu_ptr(&memcg_stock);
|
|
|
|
|
|
+ struct memcg_stock_pcp *stock;
|
|
|
|
+ unsigned long flags;
|
|
|
|
+
|
|
|
|
+ local_irq_save(flags);
|
|
|
|
+
|
|
|
|
+ stock = this_cpu_ptr(&memcg_stock);
|
|
drain_stock(stock);
|
|
drain_stock(stock);
|
|
clear_bit(FLUSHING_CACHED_CHARGE, &stock->flags);
|
|
clear_bit(FLUSHING_CACHED_CHARGE, &stock->flags);
|
|
|
|
+
|
|
|
|
+ local_irq_restore(flags);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -1788,14 +1796,19 @@ static void drain_local_stock(struct work_struct *dummy)
|
|
*/
|
|
*/
|
|
static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages)
|
|
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;
|
|
|
|
+ unsigned long flags;
|
|
|
|
+
|
|
|
|
+ local_irq_save(flags);
|
|
|
|
|
|
|
|
+ stock = this_cpu_ptr(&memcg_stock);
|
|
if (stock->cached != memcg) { /* reset if necessary */
|
|
if (stock->cached != memcg) { /* reset if necessary */
|
|
drain_stock(stock);
|
|
drain_stock(stock);
|
|
stock->cached = memcg;
|
|
stock->cached = memcg;
|
|
}
|
|
}
|
|
stock->nr_pages += nr_pages;
|
|
stock->nr_pages += nr_pages;
|
|
- put_cpu_var(memcg_stock);
|
|
|
|
|
|
+
|
|
|
|
+ local_irq_restore(flags);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|