Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1980350pxb; Fri, 5 Mar 2021 04:41:14 -0800 (PST) X-Google-Smtp-Source: ABdhPJx0HaSAo+vGt03WA+UTI8V/rowp9zHTNfr5Hpl0fA0OJAvy4Fw8Et8AuMYaEscZWJ3GBT9q X-Received: by 2002:aa7:df14:: with SMTP id c20mr8907703edy.197.1614948074159; Fri, 05 Mar 2021 04:41:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614948074; cv=none; d=google.com; s=arc-20160816; b=L026TBtSGV4CEcwUwMQjCwxKnschKsKYn1tUnLGLbP7ykTAEu1xvV0A7gONTt6YgbW VmvSXhmIuo4kXQqL1Dz3M2IfLw93ZIK8hMO3R7spTnRRk2uAHA3Sx26gPZakRBgZweYa 3tlrexpW4eBNbZs9AerhNDxbdHVcSuyu1ZTcrqwmj25jc16V5JZqNcZtt91zYp3UfFWz g9yxd4rWefwCrhGpNB3j9i33yyI1LA6Mx1zD3e1m4kHr4af8hcYvOnY8nRFeZ0ea7oId SH1XJntPiqLfXQyq0PRqQyvmz3NlCTa2Sn1BwdyFeaT8EZd95HIfQcSLrOB6yf7qI3Ch VwIg== 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=Bxjka/3EJa5SScTzpg5KTCahqiiu02bx80y625epeCU=; b=LRt3/YRScNHnO+vT0rvIvy3/TD4cF6Nhao6vyo1DdSeBio7jCXCStmnYlEYhuNfSh3 QhDg6KWvE14i36B9slBvP/SE9FBBev2WBpfOM5GE9l1bPgkMxrGDJ4ITIfrLxcF0N69D EMy6NeQj0lGFI3jPaCbIf3wgZgAwgMgBUwL++GOfP1KAVgNQlIA+dJ4f0al9TO/PT4Hb da5Ma2W18ID75p+3cmfaEvNQ7QnFAWcBjMvaq6He/wLN3fzpnQn3+vZGE55v/xOvguNr 3DgRU13D0vCIxBGgG+UKhQXA5nUvveFsQiwF1hKJ7J6HLj85SAT2tzQFliXwufgtvdnv 3Lbw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Rd3068Hg; 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 k13si1548739edr.48.2021.03.05.04.40.49; Fri, 05 Mar 2021 04:41:14 -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=Rd3068Hg; 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 S232144AbhCEMhq (ORCPT + 99 others); Fri, 5 Mar 2021 07:37:46 -0500 Received: from mail.kernel.org ([198.145.29.99]:49914 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232214AbhCEMgk (ORCPT ); Fri, 5 Mar 2021 07:36:40 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id AFBC265014; Fri, 5 Mar 2021 12:36:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614947800; bh=KPOSThwBEebom1vxTcEv8jhA7vtxekq86qLNIBMW4yQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Rd3068HgCb6vecE6Fyz+QZficlKMAIEn2qlra9vNJmDkCbT+yfU2AtT3Ovc/PQbBV W3TVNF7soMSvjTTValenU5lhmcyyw0+TgFGzK47VG/PhFoA2rHgYY55EmlGdZn1gSo oGowL3oaZVPLgWxnpYy252VzJvcx/B8ZSmmjdItg= 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 4.19 16/52] mm/hugetlb.c: fix unnecessary address expansion of pmd sharing Date: Fri, 5 Mar 2021 13:21:47 +0100 Message-Id: <20210305120854.467203222@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210305120853.659441428@linuxfoundation.org> References: <20210305120853.659441428@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 @@ -4706,21 +4706,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); } /*