From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 466A847F2F2 for ; Wed, 15 Jul 2026 14:37:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784126225; cv=none; b=C8l6sHMvTyDWmQdvTOFGMp7LYvW6VeriPPGb74Q0NFFxQxpCuFTG06ygS7RsRb0zTUHoPs1/5J8SLqDiPh4nHZvcHGlhCvs7ed9ta5Isa0/Lmvy35QLg0kMNQbTnvf5CZ4egVwPNR0gyLzxCeoJ4KkjS3+rGkdjzH9U6WZrAKik= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784126225; c=relaxed/simple; bh=p+soXoTUhXfDoVLViC507Pt8hyFZU0YYlK6lhDQRSVE=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HlSLs992HBu2XkLnrvWrt6CpN7oSjKySAhJDrZfDRPyE+4bKRc3p/Jz3KPIdNBqlIT/EY6sZLvijVt3gBfUzEQ3n3KFDXGU9ETdV9qitflVzLKSGp7xLUeIvYngh1hBmk1VSN0JRSzuFXAOldwvayn+5Vx9TX+ay+wErEdgSECE= 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=QcKJqMhL; arc=none smtp.client-ip=209.85.214.170 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="QcKJqMhL" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2cce6a0c9c3so50388535ad.1 for ; Wed, 15 Jul 2026 07:37:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784126223; x=1784731023; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:sender:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ZT6vdOdhwC/AsmQEkeWpnNcH/bprH+MunGvD8DHMRhw=; b=QcKJqMhLhVQInbL98Ou7SohArsyx8VszdEPCQRXgSQ3CguC/3H0XzbhPv9FmlljFBM ae/SkHDAKvOA/gPeuVID8+1nIDrL++tDVB3sMJ329WjzSeuvmK1O4f0sc7E7BFbBet3D wlZ+MJbjhHkkxzEA53Llb5AhyUPckyg4w72yicuEsSWDwFY2oTmoRVx7VzNTe6xA7zDA GtEtOXoJ7Zj//OiejEQwDz9y0DkEAOPIQOp+Aecodqf1QUit3K0PwasCURP4U4sxKefl vvqgKuogifpXdP3mA49FKXX/ybdNgPNJ0fVHYQhjrbXfEABZSaKl24PGJbCTtNcsxjys 8weg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784126223; x=1784731023; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:sender:x-gm-gg:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to:content-type; bh=ZT6vdOdhwC/AsmQEkeWpnNcH/bprH+MunGvD8DHMRhw=; b=OQdgYeYjccmC15mIb17kG9xuzyPiIZvJB5AFT4rmhcUYZxnOh9wcUniIiuvWtuDRFs ac1TO3FYfkkqB50k6Gh8EPnokMKvobqVpa9+tfq2AJlnq8eOKv9BSUe8dTImVIe5Gd9I m/JhkO0p/bRnhPMdeCGFIEh4T70Jf9qYd8N8Fr7PXZbIa6eVcOeQRvkS5oMMS4Tp0PMX a0QKRVK3u12pBfKVNNF+Xr9VAuNuSym4yaR5LBRtWiRJc9r/LGPWUcQPgGG+EEy7QCzG gxXXhRBwAkvD6kABMkQgtkx3dzY3yZQstGnPB5slhzammV9DjUBkhXOtT6D71+RD5JfY eL/Q== X-Forwarded-Encrypted: i=1; AHgh+RqO8tcKcvdwG7MY5Bjg/SdBJZv+tf/uygk8pvOD/veRAKlrPJGu5aKeryZSflszOCnGkMgoliv1C/gVFic=@vger.kernel.org X-Gm-Message-State: AOJu0YxanLdRsoOEjb2o5DrgRJYdRZtISxmCnEWan6ZWSEstgqPJ7mrr WhKajBkXQFHZl0jOxb0dUompBk9wK/DN6yXtPAGMMAd+sBE3nF7jSECS X-Gm-Gg: AfdE7cn1ovDr2YFFGMW/2uupPu4dJjsqm4X5Sd6rBkhosQ0pNVZ76kZVnkpPuR6/ZhK ql++GP6JBvUBDuQwpmmuHX0F8pZ1KuNUGRlfmbeUyA0SprjEIFmbTKFxCqWZKK6u482x2q8Y3Nc 7sShcepa/i8VtepNV1pMtQwcf7WqPOrIG8MPRU2Oirtr22dB1Q2LkNgWqiJEYYMaIjzVCIF5ISO MSyh2IxyfQGtBtpOf9voRr3NyfLiT6KPelQen3JvYovnG0JPSvNJkoClxk9XsmBiWVACXShaGp8 JSxJhEgem0Tn+iCmwStekQtZF+KbTN4hjFo4l9W7uJBTB+XwrKh/2mpGuzOGnFfcyijScT3aPcI 94EGjYJMVvdN1pHeq2JuJn2ekul8uXxH9BzMCHNO5SmIbe64B63eEdwHvAri/IY6iw0PUh7/pIv h2Lbm6XBnWk719zct8yfQbxoNmfi2I/sv3XQRQaZV7uys/N8uZO8c= X-Received: by 2002:a05:6a21:610f:b0:3bf:6c08:fb9c with SMTP id adf61e73a8af0-3c35754eddbmr8066746637.48.1784126223500; Wed, 15 Jul 2026 07:37:03 -0700 (PDT) Received: from localhost.localdomain ([2406:7400:90:2db1:3066:c473:74d2:497d]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3140e4fd3e9sm2020161eec.1.2026.07.15.07.37.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 07:37:02 -0700 (PDT) Sender: Deepak Rao Gaikwad From: deepakraog To: Andrew Morton , Uladzislau Rezki , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/4] mm: vrealloc: grow vm_area mappings in place Date: Wed, 15 Jul 2026 20:06:43 +0530 Message-ID: <20260715143646.15828-3-gaikwad.dcg@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260715143646.15828-1-gaikwad.dcg@gmail.com> References: <20260715143646.15828-1-gaikwad.dcg@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit When vrealloc() needs more pages than are currently mapped, allocate and map additional pages at the end of the existing vm_area instead of always allocating a new area and memcpy()'ing. Fall back to the existing realloc path when in-place grow is not possible. Signed-off-by: deepakraog --- mm/vmalloc.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 1afca3568..46cf10c62 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -4426,8 +4426,56 @@ void *vrealloc_node_align_noprof(const void *p, size_t size, unsigned long align return (void *)p; } + { + unsigned int new_nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT; + unsigned int old_nr_pages = vm->nr_pages; + + if (new_nr_pages > old_nr_pages && !vm_area_page_order(vm) && + !(vm->flags & (VM_FLUSH_RESET_PERMS | VM_USERMAP)) && + gfp_has_io_fs(flags)) { + unsigned int extra = new_nr_pages - old_nr_pages; + unsigned long addr = (unsigned long)kasan_reset_tag(p); + struct vmap_node *vn = addr_to_node(addr); + struct page **pages; + int ret; + + pages = kvmalloc_array(extra, sizeof(struct page *), gfp); + if (!pages) + goto need_realloc; + + if (vm_area_alloc_pages(vmalloc_gfp_adjust(gfp, 0), nid, + 0, extra, pages) != extra) { + kvfree(pages); + goto need_realloc; + } + + spin_lock(&vn->busy.lock); + ret = vmap_pages_range(addr + ((unsigned long)old_nr_pages + << PAGE_SHIFT), + addr + ((unsigned long)new_nr_pages + << PAGE_SHIFT), + PAGE_KERNEL, pages, PAGE_SHIFT); + spin_unlock(&vn->busy.lock); + if (ret < 0) { + free_pages_bulk(pages, extra); + kvfree(pages); + goto need_realloc; + } + + memcpy(&vm->pages[old_nr_pages], pages, + extra * sizeof(struct page *)); + kvfree(pages); + vm->nr_pages = new_nr_pages; + vm->requested_size = size; + kasan_vrealloc(p, old_size, size); + if (want_init_on_alloc(flags)) + memset((void *)p + old_size, 0, size - old_size); + return (void *)p; + } + } + need_realloc: - /* TODO: Grow the vm_area, i.e. allocate and map additional pages. */ + /* Fall back to a fresh vm_area when in-place grow is not possible. */ n = __vmalloc_node_noprof(size, align, flags, nid, __builtin_return_address(0)); if (!n) -- Deepak Rao Gaikwad