From nobody Tue Apr 7 01:03:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 EA5DE37E30B for ; Tue, 17 Mar 2026 08:17:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773735459; cv=none; b=nR/egSLAr6yWN6/V0GgPb2zBt59knwnvADWQvRc5PYpzG4mwvH22Nvu2c4Dlqs4/ufQLuWo5w0qCMlVFrNeAdRafnQTx50qSOttXYTg0ZPB1Lg0qDUpBNmlBZn/A+xN8hIF1ZvH2oYuYEBX81E/OBgIXN504cqufzto/eqcZwio= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773735459; c=relaxed/simple; bh=k7MxutspFB0C8aBYZ+Cn6E/z5wK6f9LqrZ6dx5IdwE4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SJgEKuwmyEWk4JZN8Tpb2nnOpEuYWHJ5LylQonCF4O6vmwSxUSgJsP9Eqpyd9umC007sgT7ZRXKaTENqx9uAEkz0wGNC/rMmp7dHoDCNVxE62HPcaoeKxfvtI21HRitqwylqos/jOGEnhUOBRwhs4G+l0kNSmWqM5b9pUI4O4/U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rbi4/LDN; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rbi4/LDN" Received: by smtp.kernel.org (Postfix) with ESMTPS id A7BDCC2BC9E; Tue, 17 Mar 2026 08:17:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773735458; bh=k7MxutspFB0C8aBYZ+Cn6E/z5wK6f9LqrZ6dx5IdwE4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=rbi4/LDN1bSr5gDxvdfcnNb6t5Youim7kzKt4c3F+c6g+9uSi2XEEA+IVZvdcgENz wA0HipJ7wBJX6slVr1w+1S/iNns+nr6/SMIfXh4yuo8ZIewcmx2TpVGLNzJ7zSyndi DdrVx/f4YwV7x7xmhRg/sAbJ4G1XwgK/2l8SQJ2YSym5WcLXnj8xCtVZLSmMRbIiOC P1xyyXIJ6URnZOE8gIe5WZQf2wVgg29riZV71zbTcd9W1NvB3vfstVmZ87EzzHFTv8 WEWNd/kZgL+Xgkba2PhBOdCmH/L7LdOR3dU7Mx0N6Zd6LXB5ATYIOfPu1iwo0ucy5b C8Ip/TNL6Rv3A== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9521EF3380F; Tue, 17 Mar 2026 08:17:38 +0000 (UTC) From: Shivam Kalra via B4 Relay Date: Tue, 17 Mar 2026 13:47:33 +0530 Subject: [PATCH v5 1/3] mm/vmalloc: extract vm_area_free_pages() helper from vfree() 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="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-vmalloc-shrink-v5-1-bbfbf54c5265@zohomail.in> References: <20260317-vmalloc-shrink-v5-0-bbfbf54c5265@zohomail.in> In-Reply-To: <20260317-vmalloc-shrink-v5-0-bbfbf54c5265@zohomail.in> To: Andrew Morton , Uladzislau Rezki Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Alice Ryhl , Danilo Krummrich , Shivam Kalra X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773735454; l=2682; i=shivamkalra98@zohomail.in; s=20260212; h=from:subject:message-id; bh=Y7LaORkgehK4lKdbYmYreDeAD1S2R1PpyepoUGhj4EQ=; b=s6l1O5XrvfxrHoFwKEGesRMgIGpBIDNBbqv8cm9CXTCul4vnZf75J2fgg+sq40Vf7HTRxXOLj n8FBz8SjNGKAZvUEWq0aKtDU6RIzCoLj9bHAuV0DRAXJZbnw9v6dhlY X-Developer-Key: i=shivamkalra98@zohomail.in; a=ed25519; pk=9Q+S1LD/xjbjL7bEaLIlwRADBwU/6LJq7lYm8LFrkQE= X-Endpoint-Received: by B4 Relay for shivamkalra98@zohomail.in/20260212 with auth_id=633 X-Original-From: Shivam Kalra Reply-To: shivamkalra98@zohomail.in From: Shivam Kalra Extract the page-freeing loop and NR_VMALLOC stat accounting from vfree() into a reusable vm_area_free_pages() helper. The helper operates on a range [start, end) of pages from a vm_struct, making it suitable for both full free (vfree) and partial free (upcoming vrealloc shrink). Freed page pointers in vm->pages[] are set to NULL to prevent stale references when the vm_struct outlives the free (as in vrealloc shrink). Signed-off-by: Shivam Kalra Reviewed-by: Alice Ryhl --- mm/vmalloc.c | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index c607307c657a..b29bf58c0e3f 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3416,6 +3416,38 @@ void vfree_atomic(const void *addr) schedule_work(&p->wq); } =20 +/* + * vm_area_free_pages - free a range of pages from a vmalloc allocation + * @vm: the vm_struct containing the pages + * @start: first page index to free (inclusive) + * @end: last page index to free (exclusive) + * + * Free pages [start, end) updating NR_VMALLOC stat accounting. + * Freed vm->pages[] entries are set to NULL. + * Caller is responsible for unmapping (vunmap_range) and KASAN + * poisoning before calling this. + */ +static void vm_area_free_pages(struct vm_struct *vm, unsigned int start, + unsigned int end) +{ + unsigned int i; + + for (i =3D start; i < end; i++) { + struct page *page =3D vm->pages[i]; + + BUG_ON(!page); + /* + * High-order allocs for huge vmallocs are split, so + * can be freed as an array of order-0 allocations + */ + if (!(vm->flags & VM_MAP_PUT_PAGES)) + mod_lruvec_page_state(page, NR_VMALLOC, -1); + __free_page(page); + vm->pages[i] =3D NULL; + cond_resched(); + } +} + /** * vfree - Release memory allocated by vmalloc() * @addr: Memory base address @@ -3436,7 +3468,6 @@ void vfree_atomic(const void *addr) void vfree(const void *addr) { struct vm_struct *vm; - int i; =20 if (unlikely(in_interrupt())) { vfree_atomic(addr); @@ -3459,19 +3490,7 @@ void vfree(const void *addr) =20 if (unlikely(vm->flags & VM_FLUSH_RESET_PERMS)) vm_reset_perms(vm); - for (i =3D 0; i < vm->nr_pages; i++) { - struct page *page =3D vm->pages[i]; - - BUG_ON(!page); - /* - * High-order allocs for huge vmallocs are split, so - * can be freed as an array of order-0 allocations - */ - if (!(vm->flags & VM_MAP_PUT_PAGES)) - mod_lruvec_page_state(page, NR_VMALLOC, -1); - __free_page(page); - cond_resched(); - } + vm_area_free_pages(vm, 0, vm->nr_pages); kvfree(vm->pages); kfree(vm); } --=20 2.43.0 From nobody Tue Apr 7 01:03:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 EA4AC33688B for ; Tue, 17 Mar 2026 08:17:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773735459; cv=none; b=Q6kqyEmvetw8Mjmxg34T/TEBEOt7Vet+ZdevRVaB/3CTLHb0ApMulHbgpNjZXuZB4qMpojwi6KQVbP3mqolqHDKJghUbwFuBGD9loL1t0bh6ocxfnrB2kaUlmXE1ViAJ4ul2hplAvnftGiGohsdT0HZ33XXlGCSYQPIwYOrxAnA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773735459; c=relaxed/simple; bh=jBYCjJmBms2DTTsjPA/t+ysWQ3lvt2urtM5GKlMCmk4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=M2VIQNhoUH3wUWNp545pGeLOHocub9CSI6QdwbxwRAdeZctkrfNIPQ39uzm8Vy3cWCfQcd+D3kcgRx36bzl8dhS2pCqnve7+Q8mbmvjiyJqAEkW3zPIjPT3A9BYsD7DW9G/72k65c+DoYmHLhGEPb6MEYXAIRbaCQeVNeWBkVYg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IW3jln2N; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IW3jln2N" Received: by smtp.kernel.org (Postfix) with ESMTPS id B2A15C2BCB0; Tue, 17 Mar 2026 08:17:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773735458; bh=jBYCjJmBms2DTTsjPA/t+ysWQ3lvt2urtM5GKlMCmk4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=IW3jln2NTRcvpUk+O1SS+2AT+d3HJQmMcE2yZoLKg8TW/d5AAd3Hazu6dSo5WOIMZ t7QueaTTXzVcfqJQOEpp4WrifSUUjakH0fTXe6q3QgRNNOkbeiLfiCRhYWYKLIvoi3 urovkdAI93Kdg6/JvBiHsJz+JE3em718uN5gRabTNjP+Jl0MmJdELBj/9cZOOuRd5m bolb+wvIf8/OHuqNHpa31gRR0AXznAzRhAkVeo+8vOpAeGZdnVrI+KqAyhaIoNFxnI nhlHtuNqp+cgO5HFhLIuUh2C6/O3Btymk+mS4SCjk5NgX5cX+HcpESfjohkSx5ZdiO x/yz10+Qiyx2w== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A4F11F3380E; Tue, 17 Mar 2026 08:17:38 +0000 (UTC) From: Shivam Kalra via B4 Relay Date: Tue, 17 Mar 2026 13:47:34 +0530 Subject: [PATCH v5 2/3] mm/vmalloc: free unused pages on vrealloc() shrink 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="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-vmalloc-shrink-v5-2-bbfbf54c5265@zohomail.in> References: <20260317-vmalloc-shrink-v5-0-bbfbf54c5265@zohomail.in> In-Reply-To: <20260317-vmalloc-shrink-v5-0-bbfbf54c5265@zohomail.in> To: Andrew Morton , Uladzislau Rezki Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Alice Ryhl , Danilo Krummrich , Shivam Kalra X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773735454; l=2798; i=shivamkalra98@zohomail.in; s=20260212; h=from:subject:message-id; bh=AcrwNUcas9eCuK1NFOLlNfncYjEO6WE6bt7Rp71YBEE=; b=lHMbWjW2Nez8n6V3NFUQo5wXOvs640kPXAiMbokRB7o+nYf/wCqWNYVkn8b1HLh8PKar7Ksl0 IDffUeDyhMFDbr5kNiV2yW0swOvB/QXZTFpWH7ZNOOCfKLplDGKUkpK X-Developer-Key: i=shivamkalra98@zohomail.in; a=ed25519; pk=9Q+S1LD/xjbjL7bEaLIlwRADBwU/6LJq7lYm8LFrkQE= X-Endpoint-Received: by B4 Relay for shivamkalra98@zohomail.in/20260212 with auth_id=633 X-Original-From: Shivam Kalra Reply-To: shivamkalra98@zohomail.in From: Shivam Kalra When vrealloc() shrinks an allocation and the new size crosses a page boundary, unmap and free the tail pages that are no longer needed. This reclaims physical memory that was previously wasted for the lifetime of the allocation. The heuristic is simple: always free when at least one full page becomes unused. Huge page allocations (page_order > 0) are skipped, as partial freeing would require splitting. Allocations with VM_FLUSH_RESET_PERMS are also skipped, as their direct-map permissions must be reset before pages are returned to the page allocator, which is handled by vm_reset_perms() during vfree(). The virtual address reservation (vm->size / vmap_area) is intentionally kept unchanged, preserving the address for potential future grow-in-place support. Fix the grow-in-place check to compare against vm->nr_pages rather than get_vm_area_size(), since the latter reflects the virtual reservation which does not shrink. Without this fix, a grow after shrink would access freed pages. Signed-off-by: Shivam Kalra Suggested-by: Danilo Krummrich --- mm/vmalloc.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index b29bf58c0e3f..f3820c6712c1 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -4345,14 +4345,24 @@ void *vrealloc_node_align_noprof(const void *p, siz= e_t size, unsigned long align goto need_realloc; } =20 - /* - * TODO: Shrink the vm_area, i.e. unmap and free unused pages. What - * would be a good heuristic for when to shrink the vm_area? - */ if (size <=3D old_size) { + unsigned int new_nr_pages =3D PAGE_ALIGN(size) >> PAGE_SHIFT; + /* Zero out "freed" memory, potentially for future realloc. */ if (want_init_on_free() || want_init_on_alloc(flags)) memset((void *)p + size, 0, old_size - size); + + /* Free tail pages when shrink crosses a page boundary. */ + if (new_nr_pages < vm->nr_pages && !vm_area_page_order(vm) && + !(vm->flags & VM_FLUSH_RESET_PERMS)) { + unsigned long addr =3D (unsigned long)p; + + vunmap_range(addr + (new_nr_pages << PAGE_SHIFT), + addr + (vm->nr_pages << PAGE_SHIFT)); + + vm_area_free_pages(vm, new_nr_pages, vm->nr_pages); + vm->nr_pages =3D new_nr_pages; + } vm->requested_size =3D size; kasan_vrealloc(p, old_size, size); return (void *)p; @@ -4361,7 +4371,7 @@ void *vrealloc_node_align_noprof(const void *p, size_= t size, unsigned long align /* * We already have the bytes available in the allocation; use them. */ - if (size <=3D alloced_size) { + if (size <=3D (size_t)vm->nr_pages << PAGE_SHIFT) { /* * No need to zero memory here, as unused memory will have * already been zeroed at initial allocation time or during --=20 2.43.0 From nobody Tue Apr 7 01:03:01 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 EA4283128C6 for ; Tue, 17 Mar 2026 08:17:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773735459; cv=none; b=s+Y7bLfLX1wSQJpzV+BAq7ktGPOGQZ94bioeOYiajrbCQb/OiACD7tQCcwbxDL0kkdpG2szzw+nVkBNhj2VIl2tbdUA7oANiwkrPhgOgAQbZDwleKvFLeOxM4EWCCGTpxhDLmf5Bt2iAFFLBwsCiU37EcgE7AxJHzVTSjTgXFlM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773735459; c=relaxed/simple; bh=CVIAq93ZteUDhJ/xiIE3C2yFgjiz/OpnbCzoIeyuy5w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C6zdgVfBQ5sDJwXsNfovJq73N3lQEYlP/KYE/lAzZTqif/uZh+q++sFl7pXgQrhVfzjvSQP8aFHcPGousm7jWtefFveNKUl8UlcAxz/Fc4NnXsY5mFW4AWOOhVsOOxhVF8XlFjVzc8lS1/9ZeJ6X/M3KR7IN40vrQ1nYuGF1JWA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FKXIp1EP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="FKXIp1EP" Received: by smtp.kernel.org (Postfix) with ESMTPS id BF9BFC2BCAF; Tue, 17 Mar 2026 08:17:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773735458; bh=CVIAq93ZteUDhJ/xiIE3C2yFgjiz/OpnbCzoIeyuy5w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=FKXIp1EP04imyX93u+OOXcxXjE6xPXiWX1QYn0voWosmL3WArVdn1excQ8D3DUJ57 82jEAvZ6CvisacjktBrrxX/0U+04oMtTICfofawSQYhQFS0KOgc4degcxR68pVgHfU Ypk3gL2MwILHF4ZofHJvJZv1aYQ4LhY8nzisfFTXkkmoELuVLq0lqkDlHIr6kFEZWT Yr1E8GwyKQhIWpK+VL/lW7rKmkl5igoUtVFjfr5TmA5cEsQZzksx2jEDHZALBN5yj5 Sx6Q7REoFKzIzO7RrVHAN/S4ArSqnOOzHtZte95CNh48IYKqgPieQhkq1ZbfsQm1wK ReV7A+sDJNg9w== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B5DE9F33812; Tue, 17 Mar 2026 08:17:38 +0000 (UTC) From: Shivam Kalra via B4 Relay Date: Tue, 17 Mar 2026 13:47:35 +0530 Subject: [PATCH v5 3/3] lib/test_vmalloc: add vrealloc test case 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="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-vmalloc-shrink-v5-3-bbfbf54c5265@zohomail.in> References: <20260317-vmalloc-shrink-v5-0-bbfbf54c5265@zohomail.in> In-Reply-To: <20260317-vmalloc-shrink-v5-0-bbfbf54c5265@zohomail.in> To: Andrew Morton , Uladzislau Rezki Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Alice Ryhl , Danilo Krummrich , Shivam Kalra X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773735454; l=2680; i=shivamkalra98@zohomail.in; s=20260212; h=from:subject:message-id; bh=vGtWOd+QVlnd5fUIfOUP0oSJ0Gu3V+AGGjAsUp+yrM4=; b=nsPZ51c4i4HerfAVKo7lTeH6+ar+WYWuYCzdnfI6srbeugwWqkl6+ZP2g2l7BDC6P9fFKz3KX au3qF0XEVYoC7CoeIy0tRugMUONIC3ShIm4y9bLNLqcpkpKmSyb1UfU X-Developer-Key: i=shivamkalra98@zohomail.in; a=ed25519; pk=9Q+S1LD/xjbjL7bEaLIlwRADBwU/6LJq7lYm8LFrkQE= X-Endpoint-Received: by B4 Relay for shivamkalra98@zohomail.in/20260212 with auth_id=633 X-Original-From: Shivam Kalra Reply-To: shivamkalra98@zohomail.in From: Shivam Kalra Introduce a new test case "vrealloc_test" that exercises the vrealloc() shrink and in-place grow paths: - Grow beyond allocated pages (triggers full reallocation). - Shrink crossing a page boundary (frees tail pages). - Shrink within the same page (no page freeing). - Grow within the already allocated page count (in-place). Data integrity is validated after each realloc step by checking that the first byte of the original allocation is preserved. The test is gated behind run_test_mask bit 12 (id 4096). Signed-off-by: Shivam Kalra --- lib/test_vmalloc.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++= ++ 1 file changed, 52 insertions(+) diff --git a/lib/test_vmalloc.c b/lib/test_vmalloc.c index 876c72c18a0c..ce2b2777a785 100644 --- a/lib/test_vmalloc.c +++ b/lib/test_vmalloc.c @@ -55,6 +55,7 @@ __param(int, run_test_mask, 7, "\t\tid: 512, name: kvfree_rcu_2_arg_vmalloc_test\n" "\t\tid: 1024, name: vm_map_ram_test\n" "\t\tid: 2048, name: no_block_alloc_test\n" + "\t\tid: 4096, name: vrealloc_test\n" /* Add a new test case description here. */ ); =20 @@ -421,6 +422,56 @@ vm_map_ram_test(void) return nr_allocated !=3D map_nr_pages; } =20 +static int vrealloc_test(void) +{ + void *ptr; + int i; + + for (i =3D 0; i < test_loop_count; i++) { + ptr =3D vmalloc(PAGE_SIZE); + if (!ptr) + return -1; + + *((__u8 *)ptr) =3D 'a'; + + /* Grow: beyond allocated pages, triggers full realloc. */ + ptr =3D vrealloc(ptr, 4 * PAGE_SIZE, GFP_KERNEL); + if (!ptr) + return -1; + + if (*((__u8 *)ptr) !=3D 'a') + return -1; + + /* Shrink: crosses page boundary, frees tail pages. */ + ptr =3D vrealloc(ptr, PAGE_SIZE, GFP_KERNEL); + if (!ptr) + return -1; + + if (*((__u8 *)ptr) !=3D 'a') + return -1; + + /* Shrink: within same page, no page freeing. */ + ptr =3D vrealloc(ptr, PAGE_SIZE / 2, GFP_KERNEL); + if (!ptr) + return -1; + + if (*((__u8 *)ptr) !=3D 'a') + return -1; + + /* Grow: within allocated page, in-place, no realloc. */ + ptr =3D vrealloc(ptr, PAGE_SIZE, GFP_KERNEL); + if (!ptr) + return -1; + + if (*((__u8 *)ptr) !=3D 'a') + return -1; + + vfree(ptr); + } + + return 0; +} + struct test_case_desc { const char *test_name; int (*test_func)(void); @@ -440,6 +491,7 @@ static struct test_case_desc test_case_array[] =3D { { "kvfree_rcu_2_arg_vmalloc_test", kvfree_rcu_2_arg_vmalloc_test, }, { "vm_map_ram_test", vm_map_ram_test, }, { "no_block_alloc_test", no_block_alloc_test, true }, + { "vrealloc_test", vrealloc_test, }, /* Add a new test case here. */ }; =20 --=20 2.43.0