Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp745431yba; Wed, 3 Apr 2019 19:13:29 -0700 (PDT) X-Google-Smtp-Source: APXvYqzFPOs75yJfkoRbSmXx/c3PlNjC6rnoe4gi9bxYuXtaGXu19R0fJ3fdQND6/ga/qFJWOojW X-Received: by 2002:a63:ed11:: with SMTP id d17mr2956239pgi.211.1554344009654; Wed, 03 Apr 2019 19:13:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554344009; cv=none; d=google.com; s=arc-20160816; b=avmM6PvnMh1M8wjVIdrJtWLlZw+F+FS0L5TC7C//dRX/tAOHUHchk9HEJYXK8Hz3Mk 5Y50cPWzP5drYt6xXDXJ1pCNAaVC6RaWH3p3ttO73VkhMORHquRKJbFhYtV/afQyH0Fz cSoin9YjBiNNkSFAls46JdD8M/ZmSCDz+B1gELpeYzzI49l1rIGwC+YoKnRHQKOl0p95 YAdI5iZQurukFhi3b+JyiDHVHBz1SfLzaTMOtYQ7XaAIr8nlLtoDj7rdLmLJXK9XEGba 6OUvOx9+09qorIAXhZEPbcx3xENyaLpQ0f9fWB7x9KBAEWRxGu8PAH6UZvV4lKm3yM7S eUJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :reply-to:references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:dkim-signature; bh=3UekVlM57ISUTTW0lHTJU3YrdfYPvp3rAFH0aaIT5ag=; b=JdYxhAnLSZ9v0p8z6gYZq53av7d/pAO4HJRnn14zVit64H/vpdUjf1oFKSu6bN7SPQ D05ju5u8mahVfimfQoLic5G7bcoFACg7UKnCvjX55t30YMJTJmYdpKZoRiqqACyn2M2s uon79aIniSz39WrYLSsjCmBqNeLAh7U8V3o41U6B7ke0s+j8c/WeV/7ob9AuksCB/ILy rYFRiVcfGzkXKURTOY33GphBvovNSUyAHYSerpb4xBHTiAJjv1aFhJVfXmx0NoPBIXXs OxOmSq/niDbiI6GQCA2QpoPE51IHvMznkwgwkRZe1tp8jKftuqtc1LZ304mnlGj9o4cn z+6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sent.com header.s=fm3 header.b=uiRPlq6m; dkim=pass header.i=@messagingengine.com header.s=fm2 header.b=MyEaAGe4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sent.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i24si15107935pgh.434.2019.04.03.19.13.14; Wed, 03 Apr 2019 19:13:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@sent.com header.s=fm3 header.b=uiRPlq6m; dkim=pass header.i=@messagingengine.com header.s=fm2 header.b=MyEaAGe4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sent.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728359AbfDDCK5 (ORCPT + 99 others); Wed, 3 Apr 2019 22:10:57 -0400 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:32841 "EHLO out5-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726561AbfDDCJr (ORCPT ); Wed, 3 Apr 2019 22:09:47 -0400 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id 6095422710; Wed, 3 Apr 2019 22:01:47 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute3.internal (MEProxy); Wed, 03 Apr 2019 22:01:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sent.com; h=from :to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; s=fm3; bh=3UekVlM57ISUT TW0lHTJU3YrdfYPvp3rAFH0aaIT5ag=; b=uiRPlq6mC9oXMnQB8WtxkGcQ0xCOf b7pGGA5rxoUR/W1l4alCIYJEymTCa8ogRidqOt//14B9/kwgDh7KNV1tDBvlj/kl hLStBwtyoswGRgSzMavZE4wASV2KjaPBgA+nLU2FAvuRQfZV+bHPgxk0GLw5lmYD jxQkgxNJNeB58nNLj7OtRyBjx8E2RlRBGivEIb/+KigepHrhmsSm7KZlE6qOFsZt tU99yhvHWv3AztL49xrP3e8IgTnrpXO3AAyC2YUd5z6jA0bxIbKBsABPAnNjrvFY gTMDhTxYWCKPVCpyVxtE2GZq36+2Tgk0eW0gTk4nOR/hFrN7Zo8MwUc/Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:reply-to:subject :to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=3UekVlM57ISUTTW0lHTJU3YrdfYPvp3rAFH0aaIT5ag=; b=MyEaAGe4 6nOYVcgLm7Dnv4D9kfwxR4el7PgmlaH7vQjvG+tPatHJsI3xAPkNLbR7BtYveG/c 6+muJpOgUMqIUvMKE8gjytzHGnEBQ+sdfi8rcp9AhOwc8JZjddR22gm52qp9xLsP wjGYGkNFVAKDlVLLalxRMCO8w2JAiMzYeMWpCgVihfnUP3+ve75nO0SawyavLK/g xhyxO1VhM2YadnHl9lkLwBEly6Mapb235uQS3Sfmt2gB7/xGTXnwLY4uQgBQMy9t itUHnRVMWx10CzCOp6vW54XgaDyggW8Dtx2jpaHNV9wZNmp5p3Xw9cQsZSn6PP8e UIsiQeAH+R6Kmg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduuddrtdeggdehudculddtuddrgedutddrtddtmd cutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdp uffrtefokffrpgfnqfghnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivg hnthhsucdlqddutddtmdenucfjughrpefhvffufffkofgjfhhrggfgsedtkeertdertddt necuhfhrohhmpegkihcujggrnhcuoeiiihdrhigrnhesshgvnhhtrdgtohhmqeenucfkph epvdduiedrvddvkedrudduvddrvddvnecurfgrrhgrmhepmhgrihhlfhhrohhmpeiiihdr higrnhesshgvnhhtrdgtohhmnecuvehluhhsthgvrhfuihiivgepudej X-ME-Proxy: Received: from nvrsysarch5.nvidia.com (thunderhill.nvidia.com [216.228.112.22]) by mail.messagingengine.com (Postfix) with ESMTPA id 624C610393; Wed, 3 Apr 2019 22:01:45 -0400 (EDT) From: Zi Yan To: Dave Hansen , Yang Shi , Keith Busch , Fengguang Wu , linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Daniel Jordan , Michal Hocko , "Kirill A . Shutemov" , Andrew Morton , Vlastimil Babka , Mel Gorman , John Hubbard , Mark Hairgrove , Nitin Gupta , Javier Cabezas , David Nellans , Zi Yan Subject: [RFC PATCH 19/25] mempolicy: add MPOL_F_MEMCG flag, enforcing memcg memory limit. Date: Wed, 3 Apr 2019 19:00:40 -0700 Message-Id: <20190404020046.32741-20-zi.yan@sent.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190404020046.32741-1-zi.yan@sent.com> References: <20190404020046.32741-1-zi.yan@sent.com> Reply-To: ziy@nvidia.com MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Zi Yan With MPOL_F_MEMCG set and MPOL_PREFERRED is used, we will enforce the memory limit set in the corresponding memcg. Signed-off-by: Zi Yan --- include/uapi/linux/mempolicy.h | 3 ++- mm/mempolicy.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/mempolicy.h b/include/uapi/linux/mempolicy.h index eb6560e..a9d03e5 100644 --- a/include/uapi/linux/mempolicy.h +++ b/include/uapi/linux/mempolicy.h @@ -28,12 +28,13 @@ enum { /* Flags for set_mempolicy */ #define MPOL_F_STATIC_NODES (1 << 15) #define MPOL_F_RELATIVE_NODES (1 << 14) +#define MPOL_F_MEMCG (1 << 13) /* * MPOL_MODE_FLAGS is the union of all possible optional mode flags passed to * either set_mempolicy() or mbind(). */ -#define MPOL_MODE_FLAGS (MPOL_F_STATIC_NODES | MPOL_F_RELATIVE_NODES) +#define MPOL_MODE_FLAGS (MPOL_F_STATIC_NODES | MPOL_F_RELATIVE_NODES | MPOL_F_MEMCG) /* Flags for get_mempolicy */ #define MPOL_F_NODE (1<<0) /* return next IL mode instead of node mask */ diff --git a/mm/mempolicy.c b/mm/mempolicy.c index af171cc..0e30049 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -2040,6 +2040,42 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, goto out; } + if (pol->mode == MPOL_PREFERRED && (pol->flags & MPOL_F_MEMCG)) { + struct task_struct *p = current; + struct mem_cgroup *memcg = mem_cgroup_from_task(p); + int nid = pol->v.preferred_node; + unsigned long nr_memcg_node_size; + struct mm_struct *mm = get_task_mm(p); + unsigned long nr_pages = hugepage?HPAGE_PMD_NR:1; + + if (!(memcg && mm)) { + if (mm) + mmput(mm); + goto use_other_policy; + } + + /* skip preferred node if mm_manage is going on */ + if (test_bit(MMF_MM_MANAGE, &mm->flags)) { + nid = next_memory_node(nid); + if (nid == MAX_NUMNODES) + nid = first_memory_node; + } + mmput(mm); + + nr_memcg_node_size = memcg_max_size_node(memcg, nid); + + while (nr_memcg_node_size != ULONG_MAX && + nr_memcg_node_size <= (memcg_size_node(memcg, nid) + nr_pages)) { + if ((nid = next_memory_node(nid)) == MAX_NUMNODES) + nid = first_memory_node; + nr_memcg_node_size = memcg_max_size_node(memcg, nid); + } + + mpol_cond_put(pol); + page = __alloc_pages_node(nid, gfp | __GFP_THISNODE, order); + goto out; + } +use_other_policy: if (unlikely(IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && hugepage)) { int hpage_node = node; -- 2.7.4