Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1975739pxb; Fri, 5 Mar 2021 04:34:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJxcPSNsQrPJJJbhf+ak2Vx30WZuXSk756B6+Du+vl8JdpPJEt/9f35M0Dteik+haNQ79qc9 X-Received: by 2002:a05:6402:c0f:: with SMTP id co15mr8675836edb.373.1614947667029; Fri, 05 Mar 2021 04:34:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614947667; cv=none; d=google.com; s=arc-20160816; b=lfHEApasNOB2AG6RXZYqGlrTqOT4WW7GSwu3S2reQC1FWpy2xox69rHd37JZ3P/wmj cgl41UuDgWfHg0IpoQoep6z4PeQb/P2GutXzF0HzvaHJbYd5f0CgKPAV5zqbZ2WMP9QP ZMaaQn3uK+8OF6kIWDmOViO8gf58JXR8Ilr+f62HiJ64UrQpBVmfZo9pxo5cQYHz/Fnr u2q8SploVfiSmx/Adct4sh1eOKNhcCTGR3g9Lss46nlDB/Cyt+tq4OJhU45CnNZ7UosZ WGQP0H/73RnegJqNc8yXe4IEHrZuAFMKnIWHRvI0t/tyPafPX2pRGGkdRSx/lsSRBiVn hqDg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=pnf1gjt4RfwsNMz4k0Jv9qaY7Nbs6eVSQUZm2g1Y0RQ=; b=SgRsBDOcFUzf5ZNz0RwXKnQOB5227mOolUtynPoHTvWA4MDvU9PJVDOBYozsrzm1bi 87FEPj5omHyGQFAMNEsy4wPfwNCY+zS8TllghlGs3ju1v00SuLt4IczKVamnKEBrZhzN hGrE3fiFOFbgGecYae1o5o70jX6iGpTno3VBptOZJJZ7DO7WNCu8jWcADMichWnRWFQs IIQHNzg0EPYCKEy2Z3QKRKINSDjwC1l7hPXg75ab1NRQC1bx4/2TZAvqO3/PtWFnwSK1 lfC1wzrcMPhapw7/EiuLsOpoIB1rQL5UhpRkZaP7tu1+FWPFBbQcWELmIaCrSIwruyTl /kYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=UNSt3+NK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c17si1432052edr.46.2021.03.05.04.34.04; Fri, 05 Mar 2021 04:34:27 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=UNSt3+NK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232262AbhCEMaV (ORCPT + 99 others); Fri, 5 Mar 2021 07:30:21 -0500 Received: from mail.kernel.org ([198.145.29.99]:39282 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232280AbhCEM3y (ORCPT ); Fri, 5 Mar 2021 07:29:54 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 2A9CB65004; Fri, 5 Mar 2021 12:29:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614947393; bh=1sGEKkUe+G735zncaaACYfiEnrvUcS/u8o/LkeHYwbY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UNSt3+NKQCEDSi0N7u+1dfBdzMs24n7rraXWAzDYO9DPgO69NHcQVgM6CJZuGo693 1/Olz39pnviVA6gG34D7v/wmEr8lXEVTrx6mR2BGtumxBbPox7zDSZaUhu9WOb2Cbb /IjDDRohYuhXE8Vlean6OJfvBZbSNffYsb+P2CtY= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Li Xinhai , Mike Kravetz , Peter Xu , Andrew Morton , Linus Torvalds Subject: [PATCH 5.10 019/102] mm/hugetlb.c: fix unnecessary address expansion of pmd sharing Date: Fri, 5 Mar 2021 13:20:38 +0100 Message-Id: <20210305120904.223384426@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210305120903.276489876@linuxfoundation.org> References: <20210305120903.276489876@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Li Xinhai commit a1ba9da8f0f9a37d900ff7eff66482cf7de8015e upstream. The current code would unnecessarily expand the address range. Consider one example, (start, end) = (1G-2M, 3G+2M), and (vm_start, vm_end) = (1G-4M, 3G+4M), the expected adjustment should be keep (1G-2M, 3G+2M) without expand. But the current result will be (1G-4M, 3G+4M). Actually, the range (1G-4M, 1G) and (3G, 3G+4M) would never been involved in pmd sharing. After this patch, we will check that the vma span at least one PUD aligned size and the start,end range overlap the aligned range of vma. With above example, the aligned vma range is (1G, 3G), so if (start, end) range is within (1G-4M, 1G), or within (3G, 3G+4M), then no adjustment to both start and end. Otherwise, we will have chance to adjust start downwards or end upwards without exceeding (vm_start, vm_end). Mike: : The 'adjusted range' is used for calls to mmu notifiers and cache(tlb) : flushing. Since the current code unnecessarily expands the range in some : cases, more entries than necessary would be flushed. This would/could : result in performance degradation. However, this is highly dependent on : the user runtime. Is there a combination of vma layout and calls to : actually hit this issue? If the issue is hit, will those entries : unnecessarily flushed be used again and need to be unnecessarily reloaded? Link: https://lkml.kernel.org/r/20210104081631.2921415-1-lixinhai.lxh@gmail.com Fixes: 75802ca66354 ("mm/hugetlb: fix calculation of adjust_range_if_pmd_sharing_possible") Signed-off-by: Li Xinhai Suggested-by: Mike Kravetz Reviewed-by: Mike Kravetz Cc: Peter Xu Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- mm/hugetlb.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -5302,21 +5302,23 @@ static bool vma_shareable(struct vm_area void adjust_range_if_pmd_sharing_possible(struct vm_area_struct *vma, unsigned long *start, unsigned long *end) { - unsigned long a_start, a_end; + unsigned long v_start = ALIGN(vma->vm_start, PUD_SIZE), + v_end = ALIGN_DOWN(vma->vm_end, PUD_SIZE); - if (!(vma->vm_flags & VM_MAYSHARE)) + /* + * vma need span at least one aligned PUD size and the start,end range + * must at least partialy within it. + */ + if (!(vma->vm_flags & VM_MAYSHARE) || !(v_end > v_start) || + (*end <= v_start) || (*start >= v_end)) return; /* Extend the range to be PUD aligned for a worst case scenario */ - a_start = ALIGN_DOWN(*start, PUD_SIZE); - a_end = ALIGN(*end, PUD_SIZE); + if (*start > v_start) + *start = ALIGN_DOWN(*start, PUD_SIZE); - /* - * Intersect the range with the vma range, since pmd sharing won't be - * across vma after all - */ - *start = max(vma->vm_start, a_start); - *end = min(vma->vm_end, a_end); + if (*end < v_end) + *end = ALIGN(*end, PUD_SIZE); } /*