From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) (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 D43453BFE20 for ; Thu, 7 May 2026 11:49:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778154563; cv=none; b=lG3wKLXCjCy2a0F7ws2lwPjE7dPFhUL64Jo3WPfqjmlcbb7p9hGwPORRyil0JqbzYsrWnM++DdQNHntGqEUU2yJE8pzE/6w/dbmoyKQrmLgftvhqyyFWcY8f2pcR0VJFZFiBHLx7bcPbemWeCTHikQI1u90qhYTc9Uk0s/TDRfQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778154563; c=relaxed/simple; bh=kixAhSjadAHMn25Lr9LA5Dyv7nxbKyhUiUoyTp39cX8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=OybzsoQUDJs4O2TJBbXFomHYYfDqS6S75ssto9TyUqTVAm1qwsPOqRNzmlbfgdvqtdLPDWH//dtMRqCixeME1TEJG0EUGvV1MZpS2NbKj3ldqamVd33Zblguk4iQSXVg9JV7lclz4JetyXH0PqMpD/yocwuImi61s0eFSdPj5Xg= 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=rXdTuzx8; arc=none smtp.client-ip=209.85.215.179 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="rXdTuzx8" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-c802803ac17so289669a12.1 for ; Thu, 07 May 2026 04:49:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778154561; x=1778759361; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=6+zjW9mtW9U8pd+gqlznzNQ47C4c+N8p1poEgZPBXec=; b=rXdTuzx8gJutgb+smfsAjm4izYTeEWX0I9mZmsUbdbn3C7JoLsg2EL1zzNX1iFglSd tLkop7ZMc440HP1MjBDcYo0SvpZYHJAAG5SAZ7CPM5HFgFvuQW08DoW9FxyskP7/Ojsh LqWywktPUk4XbcP8vKP1WFaMjLifR8TZYx7+Zk+UbtYYafFwuf6pIE36csYnRfMWE1AK kfkFY5fGrX0GkW8OPhf8DlQNAJk/BrD/IguE2BCdKgl3kcxOOT2MUpsRu92hta6SNX9m 5ncAWKQp9Fz4kup9vSENUSs1flAW2HJV6pYeh4jcwLKQ8h/vVxICQA8M2Red+PXG9I5K b9rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778154561; x=1778759361; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=6+zjW9mtW9U8pd+gqlznzNQ47C4c+N8p1poEgZPBXec=; b=Vk0+k3STbdwLTP8kkp4T+Y1zxblJu9BKhSU0iDqZ/gTjWKCBUiRp8UvGwy5VwhWh8K 64XdNlaztDKuNISLCvB2jj9fu7+11Q5T4pZIFLtUEhzzM6ASn47K3sSSNzPOMHwl6HIy Caeu8hcVMaosFAnMCxuI0Ij/tmO+t9bPi4Y9hQWql4ju2arnk8S8oUOmBamj6D7ZwPqw 4LV2PjgCEk6grpZq0gOJiMRfRctGD14PNdYBr7emyXSDlxiqr9HiTN9f2+uScY4O5sr0 paRGCli2deebp6tKUGdM0p9JFaKLv6zWLNJ7Sk+/sTjK6gN637VvR60667fMue6oyMeI OLYQ== X-Forwarded-Encrypted: i=1; AFNElJ9bKL/pAjnbOhZ8ddy1x2AgDsFkt99Q3YGdbUpKXbJdT+bEFkAy7TcgxlPuiMsrHAjLvY9Zy1zGTHAOM34=@vger.kernel.org X-Gm-Message-State: AOJu0YwG5SJ+gAFSkCjz3cJJN71pS/rfOxSWZQVS45E4QnpdEDP6JD2g QuZzrUrRDsURsx61Y1i1AgdzWmYdCUpoQP9fhTycoQht/ZojE68Ua6ICvD/SYQ== X-Gm-Gg: AeBDiev0GiXP6ky2S/gcCa59zcGVXQzLNdCrWnSxkOkuA3rzRZ5YGJMfolSV+FWTUaf F6mFU0Cp7XUHa/x5jPZkuuKdh6SwcEMPLtEI07aT8wCeS0v1nISjaxWMQlUmPw2syacNJ8nc1eJ yZ3BFVcYjNu71xmr/NZtJA28OvCWm0ex6pW2438bbxy+37Zi/23xYGdY7StmFBYCutR82aiTBfM ApCa3fMMhMf4GquwajgU84W2ypmSkCNXrjX02ahVcpI+PVsNG97Vk9tp93c21rYiKDdD7DbFdOh 2mQgSfZxsovS5zKyhOpbuhSwKFQ8uHh+Gt4ChiLdJm7H8jTgElkkJbHdhtvE84OOiVjBd/AHxZS Ix8Xeg2gWogDVVllvTmCS0a7B4z7pV03gV1hI20v9tHJqZcKmFzUtZTRAloifsVQkHALt1eImDh JK8x/pECsHrzd2K0LYYGrrXsDcpiITJjj95aegEOdeyDUJN9RqLI23n4iUm0oTJ2TTf0H4Ycy6P GT22iiFHqakam8bm2wCmIqeMOnsY7L4 X-Received: by 2002:a05:6a20:244d:b0:3a3:a69c:216e with SMTP id adf61e73a8af0-3aa5ac23e75mr8544443637.38.1778154561192; Thu, 07 May 2026 04:49:21 -0700 (PDT) Received: from jillravaliya-ASUS-Vivo-AIO-V241DAP-M241DA.. ([2409:40c1:2022:5af0:565b:1ce7:b5ad:c8ae]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c825378fd56sm2014106a12.8.2026.05.07.04.49.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 07 May 2026 04:49:20 -0700 (PDT) From: Jill Ravaliya To: akpm@linux-foundation.org, urezki@gmail.com Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Jill Ravaliya Subject: [PATCH 1/2] mm/vmalloc: free unused pages when shrinking vrealloc() allocation Date: Thu, 7 May 2026 17:18:53 +0530 Message-ID: <20260507114854.41117-1-jillravaliya@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit vrealloc() shrink path zeros unused memory and updates vm->requested_size, but never frees the physical pages, removes page table mappings, or flushes the TLB for the unused range. When a caller shrinks a vmalloc allocation, physical pages backing the unused portion remain allocated until vfree() is eventually called, wasting real RAM. Fix this by unmapping the unused virtual range using vunmap_range() which also flushes the TLB, freeing each unused physical page back to the buddy allocator, and updating vm->nr_pages to reflect the new page count. Signed-off-by: Jill Ravaliya --- mm/vmalloc.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index aa08651ec..a8cedfc5d 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -4336,6 +4336,27 @@ void *vrealloc_node_align_noprof(const void *p, size_t size, unsigned long align memset((void *)p + size, 0, old_size - size); vm->requested_size = size; kasan_vrealloc(p, old_size, size); + + /* Shrink the vm_area: unmap and free unused pages. */ + if (size < alloced_size) { + unsigned long new_nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT; + unsigned long i; + + /* Unmap unused virtual range and flush TLB. */ + vunmap_range((unsigned long)p + PAGE_ALIGN(size), + (unsigned long)p + alloced_size); + + /* Free unused physical pages back to buddy allocator. */ + for (i = new_nr_pages; i < vm->nr_pages; i++) { + mod_lruvec_page_state(vm->pages[i], + NR_VMALLOC, -1); + __free_page(vm->pages[i]); + vm->pages[i] = NULL; + } + + vm->nr_pages = new_nr_pages; + } + return (void *)p; } -- 2.43.0