Message ID | 20241210023936.46871-5-alexei.starovoitov@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | bpf, mm: Introduce __GFP_TRYLOCK | expand |
Hi Alexei,
kernel test robot noticed the following build warnings:
[auto build test WARNING on bpf-next/master]
url: https://github.com/intel-lab-lkp/linux/commits/Alexei-Starovoitov/mm-bpf-Introduce-__GFP_TRYLOCK-for-opportunistic-page-allocation/20241210-104250
base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
patch link: https://lore.kernel.org/r/20241210023936.46871-5-alexei.starovoitov%40gmail.com
patch subject: [PATCH bpf-next v2 4/6] memcg: Add __GFP_TRYLOCK support.
config: x86_64-buildonly-randconfig-001-20241210 (https://download.01.org/0day-ci/archive/20241212/202412120745.nnianRgw-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241212/202412120745.nnianRgw-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412120745.nnianRgw-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> mm/memcontrol.c:1761: warning: Function parameter or struct member 'gfp_mask' not described in 'consume_stock'
vim +1761 mm/memcontrol.c
cdec2e4265dfa0 KAMEZAWA Hiroyuki 2009-12-15 1743
56751146238723 Sebastian Andrzej Siewior 2022-03-22 1744 static struct obj_cgroup *drain_obj_stock(struct memcg_stock_pcp *stock);
bf4f059954dcb2 Roman Gushchin 2020-08-06 1745 static bool obj_stock_flush_required(struct memcg_stock_pcp *stock,
bf4f059954dcb2 Roman Gushchin 2020-08-06 1746 struct mem_cgroup *root_memcg);
bf4f059954dcb2 Roman Gushchin 2020-08-06 1747
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1748 /**
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1749 * consume_stock: Try to consume stocked charge on this cpu.
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1750 * @memcg: memcg to consume from.
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1751 * @nr_pages: how many pages to charge.
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1752 *
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1753 * The charges will only happen if @memcg matches the current cpu's memcg
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1754 * stock, and at least @nr_pages are available in that stock. Failure to
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1755 * service an allocation will refill the stock.
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1756 *
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1757 * returns true if successful, false otherwise.
cdec2e4265dfa0 KAMEZAWA Hiroyuki 2009-12-15 1758 */
c889f3c0bc9a18 Alexei Starovoitov 2024-12-09 1759 static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages,
c889f3c0bc9a18 Alexei Starovoitov 2024-12-09 1760 gfp_t gfp_mask)
cdec2e4265dfa0 KAMEZAWA Hiroyuki 2009-12-15 @1761 {
cdec2e4265dfa0 KAMEZAWA Hiroyuki 2009-12-15 1762 struct memcg_stock_pcp *stock;
1872b3bcd5874b Breno Leitao 2024-05-01 1763 unsigned int stock_pages;
db2ba40c277dc5 Johannes Weiner 2016-09-19 1764 unsigned long flags;
3e32cb2e0a12b6 Johannes Weiner 2014-12-10 1765 bool ret = false;
cdec2e4265dfa0 KAMEZAWA Hiroyuki 2009-12-15 1766
a983b5ebee5720 Johannes Weiner 2018-01-31 1767 if (nr_pages > MEMCG_CHARGE_BATCH)
3e32cb2e0a12b6 Johannes Weiner 2014-12-10 1768 return ret;
a0956d54492eb7 Suleiman Souhlal 2012-12-18 1769
c889f3c0bc9a18 Alexei Starovoitov 2024-12-09 1770 if (!local_trylock_irqsave(&memcg_stock.stock_lock, flags)) {
c889f3c0bc9a18 Alexei Starovoitov 2024-12-09 1771 if (gfp_mask & __GFP_TRYLOCK)
c889f3c0bc9a18 Alexei Starovoitov 2024-12-09 1772 return ret;
56751146238723 Sebastian Andrzej Siewior 2022-03-22 1773 local_lock_irqsave(&memcg_stock.stock_lock, flags);
c889f3c0bc9a18 Alexei Starovoitov 2024-12-09 1774 }
db2ba40c277dc5 Johannes Weiner 2016-09-19 1775
db2ba40c277dc5 Johannes Weiner 2016-09-19 1776 stock = this_cpu_ptr(&memcg_stock);
1872b3bcd5874b Breno Leitao 2024-05-01 1777 stock_pages = READ_ONCE(stock->nr_pages);
1872b3bcd5874b Breno Leitao 2024-05-01 1778 if (memcg == READ_ONCE(stock->cached) && stock_pages >= nr_pages) {
1872b3bcd5874b Breno Leitao 2024-05-01 1779 WRITE_ONCE(stock->nr_pages, stock_pages - nr_pages);
3e32cb2e0a12b6 Johannes Weiner 2014-12-10 1780 ret = true;
3e32cb2e0a12b6 Johannes Weiner 2014-12-10 1781 }
db2ba40c277dc5 Johannes Weiner 2016-09-19 1782
56751146238723 Sebastian Andrzej Siewior 2022-03-22 1783 local_unlock_irqrestore(&memcg_stock.stock_lock, flags);
db2ba40c277dc5 Johannes Weiner 2016-09-19 1784
cdec2e4265dfa0 KAMEZAWA Hiroyuki 2009-12-15 1785 return ret;
cdec2e4265dfa0 KAMEZAWA Hiroyuki 2009-12-15 1786 }
cdec2e4265dfa0 KAMEZAWA Hiroyuki 2009-12-15 1787
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 7b3503d12aaf..459f35f15819 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1756,7 +1756,8 @@ static bool obj_stock_flush_required(struct memcg_stock_pcp *stock, * * returns true if successful, false otherwise. */ -static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages) +static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages, + gfp_t gfp_mask) { struct memcg_stock_pcp *stock; unsigned int stock_pages; @@ -1766,7 +1767,11 @@ static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages) if (nr_pages > MEMCG_CHARGE_BATCH) return ret; - local_lock_irqsave(&memcg_stock.stock_lock, flags); + if (!local_trylock_irqsave(&memcg_stock.stock_lock, flags)) { + if (gfp_mask & __GFP_TRYLOCK) + return ret; + local_lock_irqsave(&memcg_stock.stock_lock, flags); + } stock = this_cpu_ptr(&memcg_stock); stock_pages = READ_ONCE(stock->nr_pages); @@ -1851,7 +1856,15 @@ static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages) { unsigned long flags; - local_lock_irqsave(&memcg_stock.stock_lock, flags); + if (!local_trylock_irqsave(&memcg_stock.stock_lock, flags)) { + /* + * In !RT local_trylock_irqsave() always succeeds. + * In case of unlikely failure to lock percpu stock_lock in RT + * uncharge memcg directly. + */ + mem_cgroup_cancel_charge(memcg, nr_pages); + return; + } __refill_stock(memcg, nr_pages); local_unlock_irqrestore(&memcg_stock.stock_lock, flags); } @@ -2196,7 +2209,7 @@ int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask, unsigned long pflags; retry: - if (consume_stock(memcg, nr_pages)) + if (consume_stock(memcg, nr_pages, gfp_mask)) return 0; if (!do_memsw_account() ||