From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 42DCF1C695 for ; Tue, 6 Jan 2026 04:36:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=90.155.50.34 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767674194; cv=none; b=TmZuc0QTHigBr81+UFwd2zvkx0sv4jhUii4ycOOzxrxc8b8zWeHfk1pB4+KQMnhALbM4L/tlCb0Qa40VgYszUhQBm8h792S9ernu37qBRXdKA7PUa8HIfQ1liSoT07onY27nqXffoxmlU2nkoA6CtD+xGKmRCrYaa4kUCOjP1F8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767674194; c=relaxed/simple; bh=+IwS49wE24og0z7Ro91diNQZkHe/FcO51PptFp2O/b4=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=Y5G7o8X/uM1tkATb5Covo3m5HzRKPbvJyiXHiPD06UDSa3L2THqgEJWY3IxscBXYdlyaWIu4Jt4xe4qIXNSnC2T87ufWfBoniCJFwfrXtNG3URizNaitd2B3b6/YBgjRuY7RDoTd87qhsi2zdQi5ML8R6mhCvi3tXcTYUOTthrY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org; spf=none smtp.mailfrom=infradead.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b=hgB4giA+; arc=none smtp.client-ip=90.155.50.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=infradead.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=infradead.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="hgB4giA+" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=In-Reply-To:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=SCqnCUlOtKBvjGl2QuwECZj56qaExF+6jInKwQCN3dM=; b=hgB4giA+DWeoQmOHIaA5k1Oa1A g+wO9FLQ6BnOIDVxW60/sDhtyyqBItmEOOfGyZdpBUZnsYblPE/n06j2engCg1uOJGzkp9BncECq3 c+k6FuuI/sJMDh8LWid+LpsfUFn365vaRbB/ZQYW+rnpKpr0k+2318kn54IMguKqlaHAASjWnTT7s oS3C+R/Zboi3wlmC+putpGegMUONDkOxgr5Xb5vQSikTx5pTYuY2/rwRMmhLmUxohi4PkGSjtY0B3 Mt+FwEAikiPUBCQHVQKPHEuGoBUGw45q8nFcRNrG7W7HXei5s3eNUZVxkaCgNyFHuamR0KxL+VUKy lH+fQRvw==; Received: from willy by casper.infradead.org with local (Exim 4.98.2 #2 (Red Hat Linux)) id 1vcynw-0000000BJvR-0m6Z; Tue, 06 Jan 2026 04:36:24 +0000 Date: Tue, 6 Jan 2026 04:36:23 +0000 From: Matthew Wilcox To: Ryan Roberts Cc: Andrew Morton , David Hildenbrand , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Brendan Jackman , Johannes Weiner , Zi Yan , Uladzislau Rezki , "Vishal Moola (Oracle)" , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v1 2/2] vmalloc: Optimize vfree Message-ID: References: <20260105161741.3952456-1-ryan.roberts@arm.com> <20260105161741.3952456-3-ryan.roberts@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20260105161741.3952456-3-ryan.roberts@arm.com> On Mon, Jan 05, 2026 at 04:17:38PM +0000, Ryan Roberts wrote: > + if (vm->nr_pages) { > + start_pfn = page_to_pfn(vm->pages[0]); > + nr = 1; > + for (i = 1; i < vm->nr_pages; i++) { > + unsigned long pfn = page_to_pfn(vm->pages[i]); > + > + if (start_pfn + nr != pfn) { > + __free_contig_range(start_pfn, nr); > + start_pfn = pfn; > + nr = 1; > + cond_resched(); > + } else { > + nr++; > + } It kind of feels like __free_contig_range() and this routine do the same thing -- iterate over each page and make sure that it's compatible with being freed. What if we did ... + for (i = 0; i < vm->nr_pages; i++) { + struct page *page = vm->pages[i]; + + if (!put_page_testzero(page)) { + __free_frozen_contig_pages(start_page, nr); + nr = 0; + continue; + } + + if (!nr) { + start_page = page; + nr = 1; + continue; + } + + if (start_page + nr != page) { + __free_frozen_contig_pages(start_page, nr); + start_page = page; + nr = 1; + cond_resched(); + } else { + nr++; + } + } + + __free_frozen_contig_pages(start_page, nr); That way we don't need to mess around with returning the number of pages not freed.