From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.8 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 30E5AC48BE8 for ; Fri, 18 Jun 2021 09:04:00 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id B481B613D8 for ; Fri, 18 Jun 2021 09:03:59 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B481B613D8 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 388036B0070; Fri, 18 Jun 2021 05:03:59 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 336AB6B0072; Fri, 18 Jun 2021 05:03:59 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1D7D66B0074; Fri, 18 Jun 2021 05:03:59 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0065.hostedemail.com [216.40.44.65]) by kanga.kvack.org (Postfix) with ESMTP id E0ADB6B0070 for ; Fri, 18 Jun 2021 05:03:58 -0400 (EDT) Received: from smtpin16.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 675ED181AEF10 for ; Fri, 18 Jun 2021 09:03:58 +0000 (UTC) X-FDA: 78266257356.16.33C5BD0 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf18.hostedemail.com (Postfix) with ESMTP id CF7FA20010B7 for ; Fri, 18 Jun 2021 09:03:57 +0000 (UTC) Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 15I90qYx014367; Fri, 18 Jun 2021 09:03:56 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=date : from : to : cc : subject : message-id : mime-version : content-type; s=corp-2020-01-29; bh=nMEcBtOqX8vx6JZgUecD16MQat+8fU98ktKYv7hzrjw=; b=KQ+ahVrgSdsdNkJ443d428TfWhsqGBtskCSxmdMHI794qM9kakKBpZUM5w+W4JuQnQFN jCLVggje74l1pO3MZ93Ha94xt3xRak/ye9VbuT+OhYGEpkWsHfFKeKAIqrC9xfUIBj44 18+nif5sCbpfmjU3AMnWcg3oMTPTqk1Hn7Kgy5K0h+97LhtxL0a+V0JN2uY4hNqTk25V OJBtxmSUYDg0wHG3FEIn+Zt/iLvW3fvYONlnQEUFNmTxPAO2H1SrwS2nZKHEBRjmObgf T0EYD/tVqfJop6DUf+DifDf9NpxvjlFxHIVsGCQg1fnKq6KXvyFFlB+iiFCHPG0dmlWe iw== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by mx0b-00069f02.pphosted.com with ESMTP id 397mptkkdn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Jun 2021 09:03:56 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 15I8xbSE136979; Fri, 18 Jun 2021 09:03:55 GMT Received: from pps.reinject (localhost [127.0.0.1]) by userp3020.oracle.com with ESMTP id 396waynarc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Jun 2021 09:03:54 +0000 Received: from userp3020.oracle.com (userp3020.oracle.com [127.0.0.1]) by pps.reinject (8.16.0.36/8.16.0.36) with SMTP id 15I93sw0147119; Fri, 18 Jun 2021 09:03:54 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userp3020.oracle.com with ESMTP id 396waynar7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Jun 2021 09:03:54 +0000 Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 15I93rQE022719; Fri, 18 Jun 2021 09:03:53 GMT Received: from mwanda (/102.222.70.252) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 18 Jun 2021 02:03:52 -0700 Date: Fri, 18 Jun 2021 12:03:45 +0300 From: Dan Carpenter To: mgorman@techsingularity.net Cc: linux-mm@kvack.org Subject: [bug report] mm/page_alloc: add an array-based interface to the bulk page allocator Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Proofpoint-GUID: cgbeiDKB2fOqHssMXPqMHZwNN_RKPPdI X-Proofpoint-ORIG-GUID: cgbeiDKB2fOqHssMXPqMHZwNN_RKPPdI X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: CF7FA20010B7 Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2020-01-29 header.b=KQ+ahVrg; spf=none (imf18.hostedemail.com: domain of dan.carpenter@oracle.com has no SPF policy when checking 205.220.165.32) smtp.mailfrom=dan.carpenter@oracle.com; dmarc=pass (policy=none) header.from=oracle.com X-Stat-Signature: i4mnfsog3ikc11hz7fsr3b7onk49q8md X-HE-Tag: 1624007037-879208 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000001, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Hello Mel Gorman, The patch 0f87d9d30f21: "mm/page_alloc: add an array-based interface to the bulk page allocator" from Apr 29, 2021, leads to the following static checker warning: mm/page_alloc.c:5338 __alloc_pages_bulk() warn: potentially one past the end of array 'page_array[nr_populated]' mm/page_alloc.c 5225 unsigned long __alloc_pages_bulk(gfp_t gfp, int preferred_nid, 5226 nodemask_t *nodemask, int nr_pages, 5227 struct list_head *page_list, 5228 struct page **page_array) 5229 { 5230 struct page *page; 5231 unsigned long flags; 5232 struct zone *zone; 5233 struct zoneref *z; 5234 struct per_cpu_pages *pcp; 5235 struct list_head *pcp_list; 5236 struct alloc_context ac; 5237 gfp_t alloc_gfp; 5238 unsigned int alloc_flags = ALLOC_WMARK_LOW; 5239 int nr_populated = 0, nr_account = 0; 5240 5241 if (unlikely(nr_pages <= 0)) 5242 return 0; 5243 5244 /* 5245 * Skip populated array elements to determine if any pages need 5246 * to be allocated before disabling IRQs. 5247 */ 5248 while (page_array && nr_populated < nr_pages && page_array[nr_populated]) ^^^^^^^^^^^^^^^^^^^^^^^ Presumably we can have all the pages populated. 5249 nr_populated++; 5250 5251 /* Use the single page allocator for one page. */ 5252 if (nr_pages - nr_populated == 1) 5253 goto failed; 5254 5255 /* May set ALLOC_NOFRAGMENT, fragmentation will return 1 page. */ 5256 gfp &= gfp_allowed_mask; 5257 alloc_gfp = gfp; 5258 if (!prepare_alloc_pages(gfp, 0, preferred_nid, nodemask, &ac, &alloc_gfp, &alloc_flags)) 5259 return 0; 5260 gfp = alloc_gfp; 5261 5262 /* Find an allowed local zone that meets the low watermark. */ 5263 for_each_zone_zonelist_nodemask(zone, z, ac.zonelist, ac.highest_zoneidx, ac.nodemask) { 5264 unsigned long mark; 5265 5266 if (cpusets_enabled() && (alloc_flags & ALLOC_CPUSET) && 5267 !__cpuset_zone_allowed(zone, gfp)) { 5268 continue; 5269 } 5270 5271 if (nr_online_nodes > 1 && zone != ac.preferred_zoneref->zone && 5272 zone_to_nid(zone) != zone_to_nid(ac.preferred_zoneref->zone)) { 5273 goto failed; 5274 } 5275 5276 mark = wmark_pages(zone, alloc_flags & ALLOC_WMARK_MASK) + nr_pages; 5277 if (zone_watermark_fast(zone, 0, mark, 5278 zonelist_zone_idx(ac.preferred_zoneref), 5279 alloc_flags, gfp)) { 5280 break; 5281 } 5282 } 5283 5284 /* 5285 * If there are no allowed local zones that meets the watermarks then 5286 * try to allocate a single page and reclaim if necessary. 5287 */ 5288 if (unlikely(!zone)) 5289 goto failed; ^^^^^^^^^^^^ If we hit a goto then it puts the new page beyond the end of the array. 5290 5291 /* Attempt the batch allocation */ 5292 local_lock_irqsave(&pagesets.lock, flags); 5293 pcp = this_cpu_ptr(zone->per_cpu_pageset); 5294 pcp_list = &pcp->lists[ac.migratetype]; 5295 5296 while (nr_populated < nr_pages) { 5297 5298 /* Skip existing pages */ 5299 if (page_array && page_array[nr_populated]) { 5300 nr_populated++; 5301 continue; 5302 } 5303 5304 page = __rmqueue_pcplist(zone, 0, ac.migratetype, alloc_flags, 5305 pcp, pcp_list); 5306 if (unlikely(!page)) { 5307 /* Try and get at least one page */ 5308 if (!nr_populated) 5309 goto failed_irq; 5310 break; 5311 } 5312 nr_account++; 5313 5314 prep_new_page(page, 0, gfp, 0); 5315 if (page_list) 5316 list_add(&page->lru, page_list); 5317 else 5318 page_array[nr_populated] = page; 5319 nr_populated++; 5320 } 5321 5322 local_unlock_irqrestore(&pagesets.lock, flags); 5323 5324 __count_zid_vm_events(PGALLOC, zone_idx(zone), nr_account); 5325 zone_statistics(ac.preferred_zoneref->zone, zone, nr_account); 5326 5327 return nr_populated; 5328 5329 failed_irq: 5330 local_unlock_irqrestore(&pagesets.lock, flags); 5331 5332 failed: 5333 page = __alloc_pages(gfp, 0, preferred_nid, nodemask); 5334 if (page) { 5335 if (page_list) 5336 list_add(&page->lru, page_list); 5337 else 5338 page_array[nr_populated] = page; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 5339 nr_populated++; 5340 } 5341 5342 return nr_populated; 5343 } regards, dan carpenter