Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp6153182ybf; Thu, 5 Mar 2020 14:18:47 -0800 (PST) X-Google-Smtp-Source: ADFU+vvsyz8CTn3/vjz7e76J3KmTWJVNeNNGxLqueol15aN+ixwApHJAHYlxW5QkJFWaP4367ut0 X-Received: by 2002:a05:6808:aac:: with SMTP id r12mr467837oij.59.1583446727706; Thu, 05 Mar 2020 14:18:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1583446727; cv=none; d=google.com; s=arc-20160816; b=YA8W9Aag8tx9bnySjYRfoOwmoYp39ULFNXsPRgqPK2iN3Dfm5FaNAuvhvChbdUvfqe kQ1+zxww23peiBr3aQfzQGMzsdfi8Q8BVe4csdj8vKW+cvbccSqUPJ3v56/WmfyOss5v pTVm9WckebPuO4wNxLgiG9s/3R5YWbvyZ4hy+/rtxk0hH7NNcJi0oAmtY98DPR4wjp5/ fi6MLyr4SVbyYBDhD29o+8XzPN9jVp9Teq2g9N8AmTwzHjpOzf3zP2yzcjEA4TG2QzQF /hTZK/SKhTXbddV4MqQ6DufVtjJhR6QNdWvCFBoUP48TjovNmIDBdSqBqbIzCGp4YS2H 1pSw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=KtJH5QV8X5puZW05K9mF0ArNYyR1iSSvlLq7+eFOBlM=; b=q4vD9q5n+S2SK4JqztDLtSuKItGTfGyyN7UNtovhl3oReEo+hCLa7WYKhxKn8WDNqb YOIh6TwCHwfN1MI7rmsflhTruRMNM1hzPQSKEYOJunWHqWWRC5SVM/K8Of6hp6bzPfHe rH9S3u1rhI3xXf5nxBxSBPDhQVqQebGzOyWZY+yCMKo625eLfi7Sk/hAZF1crZBI/3/G 3FdLD977D6XxWZSiI7DEWp2QjNntZ8kiQKYTj0Y7hHUq6cMusnlSn6PPN5U8qNjnYKu4 /ZRwuy6UwQ1qqqcSqA3ScyIp4zoNCVGfZ5JXdUAwRLbglzkR35ouv7EQ7w5WoA5dDbdL u1dw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=e2uP7GSo; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 67si139332ott.243.2020.03.05.14.18.34; Thu, 05 Mar 2020 14:18:47 -0800 (PST) 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=@joelfernandes.org header.s=google header.b=e2uP7GSo; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726275AbgCEWR4 (ORCPT + 99 others); Thu, 5 Mar 2020 17:17:56 -0500 Received: from mail-qk1-f194.google.com ([209.85.222.194]:41183 "EHLO mail-qk1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726191AbgCEWR4 (ORCPT ); Thu, 5 Mar 2020 17:17:56 -0500 Received: by mail-qk1-f194.google.com with SMTP id b5so443238qkh.8 for ; Thu, 05 Mar 2020 14:17:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=KtJH5QV8X5puZW05K9mF0ArNYyR1iSSvlLq7+eFOBlM=; b=e2uP7GSoZY3MnBc0ACHvh9M8AmXy5DN+nH3Je6EKcaBWHgvbfybU1DZMwrqHR6Sca3 u+yQbP30jVphg518OYwRq3A8a655zDHGUankpC/8yJeYsozgeLujAIOw1ug14rM5RYem /Xl/xE4i0kmGMJSZUiMtlXYGWaEZMF1CCbONU= 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:user-agent; bh=KtJH5QV8X5puZW05K9mF0ArNYyR1iSSvlLq7+eFOBlM=; b=bEWIur6cuI3HB1nauAfkJqnM8UP3xKfrEN/ovgE+dnxoKNtxx7CvGUXuINM0PlU+ev lrF76CMj29y3jzRJe8IdUq463pSZAZMdOldxiEz38A4AUXbbdhoOEZpawh3bPFa8Biyg RbUKiuTEVmlHGOJx3NOEAsHnh7Ix+AaTV9Q6+IOy2MjGhQ0giUBGDQ5c8PZEpTWYrhQs 5CTlOXRm2m7IT/1vWkKTtEFH4yEvG4bD49dnb+twdZAbczQLAnB12XVml1IIlP6D2wmY oOHVNfIasXx9agSdp+XDoglrVUNRsmGBWxsvhyybz/zutOZxjj4nERNx8vYTWB6/RwHs md/A== X-Gm-Message-State: ANhLgQ3Swbn3v4+xo8TxvIUX6knVD65jSw3dJrGUJcCY4UFcrQUlgENi akfCQT2V8RIp2DE25rpd9mEyGRGdZOE= X-Received: by 2002:a05:620a:13ed:: with SMTP id h13mr180689qkl.313.1583446674322; Thu, 05 Mar 2020 14:17:54 -0800 (PST) Received: from localhost ([2620:15c:6:12:9c46:e0da:efbf:69cc]) by smtp.gmail.com with ESMTPSA id d137sm10415771qkc.99.2020.03.05.14.17.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Mar 2020 14:17:53 -0800 (PST) Date: Thu, 5 Mar 2020 17:17:53 -0500 From: Joel Fernandes To: linux-kernel@vger.kernel.org Cc: urezki@gmail.com, Davidlohr Bueso , Josh Triplett , Lai Jiangshan , Mathieu Desnoyers , "Paul E. McKenney" , rcu@vger.kernel.org, Steven Rostedt Subject: Re: [PATCH linus/master 2/2] rcu/tree: Add a shrinker to prevent OOM due to kfree_rcu() batching Message-ID: <20200305221753.GA66450@google.com> References: <20200305221323.66051-1-joel@joelfernandes.org> <20200305221323.66051-2-joel@joelfernandes.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200305221323.66051-2-joel@joelfernandes.org> User-Agent: Mutt/1.12.2 (2019-09-21) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Mar 05, 2020 at 05:13:23PM -0500, Joel Fernandes (Google) wrote: > To reduce grace periods and improve kfree() performance, we have done > batching recently dramatically bringing down the number of grace periods > while giving us the ability to use kfree_bulk() for efficient kfree'ing. > > However, this has increased the likelihood of OOM condition under heavy > kfree_rcu() flood on small memory systems. This patch introduces a > shrinker which starts grace periods right away if the system is under > memory pressure due to existence of objects that have still not started > a grace period. > > With this patch, I do not observe an OOM anymore on a system with 512MB > RAM and 8 CPUs, with the following rcuperf options: > > rcuperf.kfree_loops=20000 rcuperf.kfree_alloc_num=8000 > rcuperf.kfree_rcu_test=1 rcuperf.kfree_mult=2 Paul, I may have to rebase this patch on top of Vlad's kfree_bulk() work. But let us discuss patch and I can rebase it and repost it once patch looks Ok to you. (The kfree_bulk() work should not affect the patch). thanks, - Joel > > NOTE: > On systems with no memory pressure, the patch has no effect as intended. > > Cc: urezki@gmail.com > Signed-off-by: Joel Fernandes (Google) > > --- > kernel/rcu/tree.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 58 insertions(+) > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > index d91c9156fab2e..28ec35e15529d 100644 > --- a/kernel/rcu/tree.c > +++ b/kernel/rcu/tree.c > @@ -2723,6 +2723,8 @@ struct kfree_rcu_cpu { > struct delayed_work monitor_work; > bool monitor_todo; > bool initialized; > + // Number of objects for which GP not started > + int count; > }; > > static DEFINE_PER_CPU(struct kfree_rcu_cpu, krc); > @@ -2791,6 +2793,7 @@ static inline bool queue_kfree_rcu_work(struct kfree_rcu_cpu *krcp) > > krwp->head_free = krcp->head; > krcp->head = NULL; > + krcp->count = 0; > INIT_RCU_WORK(&krwp->rcu_work, kfree_rcu_work); > queue_rcu_work(system_wq, &krwp->rcu_work); > return true; > @@ -2864,6 +2867,7 @@ void kfree_call_rcu(struct rcu_head *head, rcu_callback_t func) > head->func = func; > head->next = krcp->head; > krcp->head = head; > + krcp->count++; > > // Set timer to drain after KFREE_DRAIN_JIFFIES. > if (rcu_scheduler_active == RCU_SCHEDULER_RUNNING && > @@ -2879,6 +2883,58 @@ void kfree_call_rcu(struct rcu_head *head, rcu_callback_t func) > } > EXPORT_SYMBOL_GPL(kfree_call_rcu); > > +static unsigned long > +kfree_rcu_shrink_count(struct shrinker *shrink, struct shrink_control *sc) > +{ > + int cpu; > + unsigned long flags, count = 0; > + > + /* Snapshot count of all CPUs */ > + for_each_online_cpu(cpu) { > + struct kfree_rcu_cpu *krcp = per_cpu_ptr(&krc, cpu); > + > + spin_lock_irqsave(&krcp->lock, flags); > + count += krcp->count; > + spin_unlock_irqrestore(&krcp->lock, flags); > + } > + > + return count; > +} > + > +static unsigned long > +kfree_rcu_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) > +{ > + int cpu, freed = 0; > + unsigned long flags; > + > + for_each_online_cpu(cpu) { > + int count; > + struct kfree_rcu_cpu *krcp = per_cpu_ptr(&krc, cpu); > + > + count = krcp->count; > + spin_lock_irqsave(&krcp->lock, flags); > + if (krcp->monitor_todo) > + kfree_rcu_drain_unlock(krcp, flags); > + else > + spin_unlock_irqrestore(&krcp->lock, flags); > + > + sc->nr_to_scan -= count; > + freed += count; > + > + if (sc->nr_to_scan <= 0) > + break; > + } > + > + return freed; > +} > + > +static struct shrinker kfree_rcu_shrinker = { > + .count_objects = kfree_rcu_shrink_count, > + .scan_objects = kfree_rcu_shrink_scan, > + .batch = 0, > + .seeks = DEFAULT_SEEKS, > +}; > + > void __init kfree_rcu_scheduler_running(void) > { > int cpu; > @@ -3774,6 +3830,8 @@ static void __init kfree_rcu_batch_init(void) > INIT_DELAYED_WORK(&krcp->monitor_work, kfree_rcu_monitor); > krcp->initialized = true; > } > + if (register_shrinker(&kfree_rcu_shrinker)) > + pr_err("Failed to register kfree_rcu() shrinker!\n"); > } > > void __init rcu_init(void) > -- > 2.25.0.265.gbab2e86ba0-goog >