From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 92C8D48C40B for ; Wed, 22 Jul 2026 08:58:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784710731; cv=none; b=TZYOlGB9Xy9X2y0BP4iCM8eNI0jae6IeqjKVZPv1fk0748tGIl5GIaO+NYPzgb2nXYQZrDg9aqajHEYyVu47whtBOX9E7iGaT2wGvIR9sdMvZ69tsxQN66pUYSlKhaWHRMMQIvIW89o2pZWHV24v11bKBmAyXYtnOnecWot31WM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784710731; c=relaxed/simple; bh=vBKLq5wFdfuIgz4ZKR40VeoXurYjs3jO1qsihxPM6ps=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=WT0heedrLZC0uv9gMby1gSyoKF3kwlsYgtrqH5SMtT4yUP6wGoJL+k6ZyUQU5ADzxya60t9BHwu48QYEqIY9+RG2+bZbP8ifQ/mXOZl1S1j3+7iB7ZTBY6fn0vHuFNq90SaYLEYL9oT4qeLIBJ0tjk366PvLi/L830oh7Ul3rDE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nY4bYAa3; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nY4bYAa3" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2ce87c7e3bbso137666515ad.1 for ; Wed, 22 Jul 2026 01:58:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784710728; x=1785315528; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=NkPKMk7MVapNd2zmqS5l8beGNHYpl4HXQlvHxGO4S+c=; b=nY4bYAa3RWLWU2gZjL5iioIxi07I+R5eot9e+Y00y/JGUmFjKIbbu2Uuw/JnACoQH2 cSkv82oluujaNE6fkjtK1lB7uWh/sYES57k6jI2+lbsgixJcrcu6A/UcGcB/GaeI4MkP ZxpoMwOEIWzZI4Hr8NrHsjaxyzKCx8ZdJvPZkQzlpRmlt8ff2tFYcFfq7hvcHByjj1Xo 9mAR2ka7bLBnHum/Lan9WziJvQRdtY1PQ9XHJZqa3DM5X05crETuEep+5JX3kc6He3lz 9EJgNXaRVkuqrBVDbzHWYc3ybYvZcwEm2ZowP98PNWdpylJmsppnlkvBpDNPX7lgSpUd 1UkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784710728; x=1785315528; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=NkPKMk7MVapNd2zmqS5l8beGNHYpl4HXQlvHxGO4S+c=; b=oN25eZ/7WaA4pjPLmhoQxgSAB4itTFTwdP1SmumdRSC6/qdt6t2wIbp/vBoGSrCf8U FqhsYsyFnIMJPb125r8d92yYLfAyfhYW7MGjQxqBDxsQ5Y6NGLyAGkoxXXs9kAGZN646 Rgbjs75s0h+cuxgfJaL48fcoMzKQt+nTl7xviOGZ018u5yXP124XP3OiD85q+H2Fr4ec 43dVB97NE7e6qYUxmEGdoa+LYGdS0psPK6z/BbnKu4adB2+BcpfumdLdWtntamJ1AeCP 2xw+Q8mNN9QGLh8hvUJOyFRu2rYDphjUKgratW4dI5yYqLs553m0r3B6cEa3+qLf8lfD w5og== X-Forwarded-Encrypted: i=1; AHgh+RqZ4Vd0WOwhSM19070MQGyxxTiwxdP1uGL5eRoCBWcF5FkRZRTow21QnPeH35B9UXbAQFhSPIerBsmKLdU=@vger.kernel.org X-Gm-Message-State: AOJu0YxdPov4YZ5h19W1pMl/ChHDcXUNrfLUXgcvucWToxS5XKX7xEEj ebkjpOzaQllfxGnI7zZ8JjshyXsPrL6K/o9SbbNf2Sn/j6ZY48fXp6Vr X-Gm-Gg: AR+sD10JkqSAMocH56ZmRvCGUxmjiynGPIoU9wJaftxE2tOhe1XHGdcB0XT9nsuNVV5 YMFJIRzg9LjD07e7keM8f08vQOqBUhj38lVAOgkbmqtsmpKfHNC8ZSPdcvj/UvLvxvZ2g+dE6NI uix+V+sc49RiS0qmlw/M6rsgNv87g114FysFxvGl5ADQ8cF1qgKK7e+1B/naYzZOC6urPeV7Lhh 9FTHmy5L7wZOqZ2H3t41mwIih4cOrL2vwBPq8xfxVlx1rJWHQHlwkZFKGsMo9fayN3RINTh2EEq V4jw/YbNt5xz6r8PdPKZBGsqI5Lu3QBai2WmcjSVLjb62bLndOqWhWcc+/E/TUvhecVYglvTH8T 2hBfHowi+LqBKkTrrTB4Rf+Gjm3WkzGLLrUi6p6lOaA/tRIzzTRohe/0KedRfCBecl2QGWnwhdg HA+ZqEdOogpDMaPLKguE0sV3ja X-Received: by 2002:a17:902:f786:b0:2ca:caa5:9c04 with SMTP id d9443c01a7336-2cf3495ffccmr251154795ad.23.1784710728213; Wed, 22 Jul 2026 01:58:48 -0700 (PDT) Received: from mi-OptiPlex-7060.mioffice.cn ([43.224.245.234]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2cf8f2e621dsm11137535ad.48.2026.07.22.01.58.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 01:58:47 -0700 (PDT) From: Wen Jiang X-Google-Original-From: Wen Jiang To: dev.jain@arm.com Cc: david@kernel.org, akpm@linux-foundation.org, catalin.marinas@arm.com, linux-mm@kvack.org, urezki@gmail.com, will@kernel.org, Xueyuan.chen21@gmail.com, ajd@linux.ibm.com, anshuman.khandual@arm.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, rppt@kernel.org, ryan.roberts@arm.com, baohua@kernel.org, leo.yan@arm.com Subject: Re: [PATCH v7 6/7] mm/vmalloc: map contiguous pages in batches for vmap() if possible Date: Wed, 22 Jul 2026 16:58:41 +0800 Message-Id: <20260722085841.3047673-1-jiangwen6@xiaomi.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Hi David and Dev, The updated diff is blow. Subject: [PATCH] mm/vmalloc: simplify vmap batching helper and limit scan by PFN alignment Pass the current page pointer directly to the batching helper, and limit the contiguous scan by PFN alignment before checking for a batch size. This keeps the helper interface simpler and avoids scanning more pages than can actually be mapped together. Suggested-by: David Hildenbrand (Arm) Signed-off-by: Wen Jiang --- diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 92f9cd5e9def5..2f7e6128cbd7c 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3558,7 +3558,7 @@ static inline unsigned int vm_shift(pgprot_t prot, unsigned long size) } static inline int get_vmap_batch_order(struct page **pages, - pgprot_t prot, unsigned int max_steps, unsigned int idx) + pgprot_t prot, unsigned int nr_pages) { unsigned long pfn; unsigned int nr_contig; @@ -3567,16 +3567,16 @@ static inline int get_vmap_batch_order(struct page **pages, if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMAP)) return 0; - nr_contig = num_pages_contiguous(&pages[idx], max_steps); + /* Limit nr_pages by pfn alignment */ + pfn = page_to_pfn(*pages); + if (pfn > 0) + nr_pages = min_t(unsigned int, nr_pages, 1UL << __ffs(pfn)); + + nr_contig = num_pages_contiguous(pages, nr_pages); if (nr_contig < 2) return 0; order = ilog2(nr_contig); - pfn = page_to_pfn(pages[idx]); - - /* Limit order by pfn alignment */ - if (pfn > 0) - order = min_t(int, order, __ffs(pfn)); if (vm_shift(prot, PAGE_SIZE << order) == PAGE_SHIFT) return 0; @@ -3587,8 +3587,8 @@ static inline int get_vmap_batch_order(struct page **pages, static int vmap_pages_range_batched(unsigned long addr, unsigned long end, pgprot_t prot, struct page **pages) { - unsigned int count = (end - addr) >> PAGE_SHIFT; - unsigned int prev_shift = 0, idx = 0; + const unsigned int nr_pages = (end - addr) >> PAGE_SHIFT; + unsigned int prev_shift = 0, batch_start = 0; unsigned long map_addr = addr, batch_end = addr; int err; @@ -3597,26 +3597,26 @@ static int vmap_pages_range_batched(unsigned long addr, unsigned long end, if (err) goto out; - for (unsigned int i = 0; i < count; ) { + for (unsigned int i = 0; i < nr_pages; ) { unsigned int shift = PAGE_SHIFT + - get_vmap_batch_order(pages, prot, count - i, i); + get_vmap_batch_order(pages + i, prot, nr_pages - i); if (!i) prev_shift = shift; if (shift != prev_shift) { err = vmap_pages_range_noflush_walk(map_addr, batch_end, - prot, pages + idx, prev_shift); + prot, pages + batch_start, prev_shift); if (err) goto out; prev_shift = shift; map_addr = batch_end; - idx = i; + batch_start = i; } /* - * Once small pages are encountered, the remaining pages - * are likely small as well. + * Once we fail to batch pages, we expect to fail batching + * for all remaining pages, so just give up. */ if (shift == PAGE_SHIFT) break; @@ -3627,8 +3627,8 @@ static int vmap_pages_range_batched(unsigned long addr, unsigned long end, /* Remaining */ if (map_addr < end) - err = vmap_pages_range_noflush_walk(map_addr, end, - prot, pages + idx, prev_shift); + err = vmap_pages_range_noflush_walk(map_addr, end, prot, + pages + batch_start, prev_shift); out: flush_cache_vmap(addr, end);