From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A8E04C0044D for ; Mon, 16 Mar 2020 14:54:22 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 6F33920679 for ; Mon, 16 Mar 2020 14:54:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6F33920679 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 084E56B0005; Mon, 16 Mar 2020 10:54:22 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 036606B0007; Mon, 16 Mar 2020 10:54:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E8D746B0008; Mon, 16 Mar 2020 10:54:21 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0195.hostedemail.com [216.40.44.195]) by kanga.kvack.org (Postfix) with ESMTP id D178F6B0005 for ; Mon, 16 Mar 2020 10:54:21 -0400 (EDT) Received: from smtpin10.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 6EA74DB41 for ; Mon, 16 Mar 2020 14:54:21 +0000 (UTC) X-FDA: 76601521122.10.berry31_4314ddba58d1f X-HE-Tag: berry31_4314ddba58d1f X-Filterd-Recvd-Size: 6063 Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by imf42.hostedemail.com (Postfix) with ESMTP for ; Mon, 16 Mar 2020 14:54:20 +0000 (UTC) Received: by mail-wr1-f67.google.com with SMTP id v11so21638047wrm.9 for ; Mon, 16 Mar 2020 07:54:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=/2V8TQXmTbu4k1la5PWpjE8lHIj1Vj9s/Np+8xl7UF4=; b=RtQlOhgcozzttIXlgShs1COURddRtpS26dk3I5QDj/AB+95fJNxldmJCKXsP6nmtwP TQccCPhvL4S8c66rUK1kbS3n+wT6svQYGasnsvAR5Rfi+rVi0mvRI11UVX01In4+jaan xpLCdCqBvQ7mhaIlrc8eGFRHX13cFBA6eOTXrtKOAqmPKNzzHQSgdqWzzT/ZrbCNT/sJ 5NVkP2i/aQJRSIlE48qS5m4Rq0zablg+j6F7T6rGK6GnelveoHg+/m0EcJvYcLmtB61D HpyOe8zukhG6Vwpb3A/AUexucr6DeYeb2rQxQPFOOC6e6HcQc03IjgkeEuYrzEQlqPyc Q7zg== X-Gm-Message-State: ANhLgQ33xznI4B9EyT+iiuP7nxHX3vZsXyJgb3hA0itsqH/saLSeEA6A IIwdSCXWmJlHMrwsl9jI4FA= X-Google-Smtp-Source: ADFU+vtODJApMfC6Yi/mTwQNn0Ud1XnGoYxLez+QcBseednYGX1TM8nnlpyX9JwgtL3XxxRE+6RtmA== X-Received: by 2002:adf:fcce:: with SMTP id f14mr24285905wrs.200.1584370459969; Mon, 16 Mar 2020 07:54:19 -0700 (PDT) Received: from localhost ([37.188.132.163]) by smtp.gmail.com with ESMTPSA id q11sm227926wrp.53.2020.03.16.07.54.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2020 07:54:19 -0700 (PDT) Date: Mon, 16 Mar 2020 15:54:16 +0100 From: Michal Hocko To: Chris Down Cc: Andrew Morton , Johannes Weiner , Tejun Heo , Roman Gushchin , linux-mm@kvack.org, cgroups@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: Re: [PATCH 1/6] mm, memcg: Prevent memory.high load/store tearing Message-ID: <20200316145416.GM11482@dhcp22.suse.cz> References: <2f66f7038ed1d4688e59de72b627ae0ea52efa83.1584034301.git.chris@chrisdown.name> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2f66f7038ed1d4688e59de72b627ae0ea52efa83.1584034301.git.chris@chrisdown.name> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Thu 12-03-20 17:32:51, Chris Down wrote: > A mem_cgroup's high attribute can be concurrently set at the same time > as we are trying to read it -- for example, if we are in > memory_high_write at the same time as we are trying to do high reclaim. I assume this is a replace all kinda patch because css_alloc shouldn't really be a subject to races. I am not sure about css_reset but it sounds like a safe as well. That being said I do not object because this cannot be harmful but it would be nice to mention that in the changelog just in case somebody wonders about this in future. > Signed-off-by: Chris Down > Cc: Andrew Morton > Cc: Johannes Weiner > Cc: Roman Gushchin > Cc: Tejun Heo > Cc: linux-mm@kvack.org > Cc: cgroups@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Cc: kernel-team@fb.com Acked-by: Michal Hocko > --- > mm/memcontrol.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 63bb6a2aab81..d32d3c0a16d4 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -2228,7 +2228,7 @@ static void reclaim_high(struct mem_cgroup *memcg, > gfp_t gfp_mask) > { > do { > - if (page_counter_read(&memcg->memory) <= memcg->high) > + if (page_counter_read(&memcg->memory) <= READ_ONCE(memcg->high)) > continue; > memcg_memory_event(memcg, MEMCG_HIGH); > try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask, true); > @@ -2545,7 +2545,7 @@ static int try_charge(struct mem_cgroup *memcg, gfp_t gfp_mask, > * reclaim, the cost of mismatch is negligible. > */ > do { > - if (page_counter_read(&memcg->memory) > memcg->high) { > + if (page_counter_read(&memcg->memory) > READ_ONCE(memcg->high)) { > /* Don't bother a random interrupted task */ > if (in_interrupt()) { > schedule_work(&memcg->high_work); > @@ -4257,7 +4257,8 @@ void mem_cgroup_wb_stats(struct bdi_writeback *wb, unsigned long *pfilepages, > *pheadroom = PAGE_COUNTER_MAX; > > while ((parent = parent_mem_cgroup(memcg))) { > - unsigned long ceiling = min(memcg->memory.max, memcg->high); > + unsigned long ceiling = min(memcg->memory.max, > + READ_ONCE(memcg->high)); > unsigned long used = page_counter_read(&memcg->memory); > > *pheadroom = min(*pheadroom, ceiling - min(ceiling, used)); > @@ -4978,7 +4979,7 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) > if (!memcg) > return ERR_PTR(error); > > - memcg->high = PAGE_COUNTER_MAX; > + WRITE_ONCE(memcg->high, PAGE_COUNTER_MAX); > memcg->soft_limit = PAGE_COUNTER_MAX; > if (parent) { > memcg->swappiness = mem_cgroup_swappiness(parent); > @@ -5131,7 +5132,7 @@ static void mem_cgroup_css_reset(struct cgroup_subsys_state *css) > page_counter_set_max(&memcg->tcpmem, PAGE_COUNTER_MAX); > page_counter_set_min(&memcg->memory, 0); > page_counter_set_low(&memcg->memory, 0); > - memcg->high = PAGE_COUNTER_MAX; > + WRITE_ONCE(memcg->high, PAGE_COUNTER_MAX); > memcg->soft_limit = PAGE_COUNTER_MAX; > memcg_wb_domain_size_changed(memcg); > } > @@ -5947,7 +5948,7 @@ static ssize_t memory_high_write(struct kernfs_open_file *of, > if (err) > return err; > > - memcg->high = high; > + WRITE_ONCE(memcg->high, high); > > for (;;) { > unsigned long nr_pages = page_counter_read(&memcg->memory); > -- > 2.25.1 > -- Michal Hocko SUSE Labs