obj_cgroup_put(objcg);
}
+static struct obj_stock_pcp *trylock_stock(void)
+{
+ if (local_trylock(&obj_stock.lock))
+ return this_cpu_ptr(&obj_stock);
+
+ return NULL;
+}
+
+static void unlock_stock(struct obj_stock_pcp *stock)
+{
+ local_unlock(&obj_stock.lock);
+}
+
static void __account_obj_stock(struct obj_cgroup *objcg,
struct obj_stock_pcp *stock, int nr,
struct pglist_data *pgdat, enum node_stat_item idx)
struct obj_stock_pcp *stock;
bool ret = false;
- if (!local_trylock(&obj_stock.lock))
+ stock = trylock_stock();
+ if (!stock)
return ret;
- stock = this_cpu_ptr(&obj_stock);
if (objcg == READ_ONCE(stock->cached_objcg) && stock->nr_bytes >= nr_bytes) {
stock->nr_bytes -= nr_bytes;
ret = true;
__account_obj_stock(objcg, stock, nr_bytes, pgdat, idx);
}
- local_unlock(&obj_stock.lock);
+ unlock_stock(stock);
return ret;
}
struct obj_stock_pcp *stock;
unsigned int nr_pages = 0;
- if (!local_trylock(&obj_stock.lock)) {
+ stock = trylock_stock();
+ if (!stock) {
if (pgdat)
mod_objcg_mlstate(objcg, pgdat, idx, nr_acct);
nr_pages = nr_bytes >> PAGE_SHIFT;
goto out;
}
- stock = this_cpu_ptr(&obj_stock);
if (READ_ONCE(stock->cached_objcg) != objcg) { /* reset if necessary */
drain_obj_stock(stock);
obj_cgroup_get(objcg);
stock->nr_bytes &= (PAGE_SIZE - 1);
}
- local_unlock(&obj_stock.lock);
+ unlock_stock(stock);
out:
if (nr_pages)
obj_cgroup_uncharge_pages(objcg, nr_pages);