Received: by 10.223.176.46 with SMTP id f43csp418378wra; Fri, 26 Jan 2018 00:45:38 -0800 (PST) X-Google-Smtp-Source: AH8x224/lbZgrPQ7AQg6R4Oxty9mq9DatGe813StGWU8YmWoUnwjDWWaStMwvawCS7hxTTWfabST X-Received: by 10.98.181.14 with SMTP id y14mr18653435pfe.216.1516956338287; Fri, 26 Jan 2018 00:45:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516956338; cv=none; d=google.com; s=arc-20160816; b=xQrymXF3n6Jo9aE0ji0iKnECKfxymxXHgMZzGDxxB4wok4TPMVAtucuX2QHs4to3gn 0/x+1UvQoaIBhCeGdT/UYeR0/uGllBIveu4KlfkuH7Btu8HwxNXMxBKZRXEZ0bmIkZ10 1eWRexn0XQjJMylCrMR86RGMgGbnHSERiR6OVbqLwBPxojy46c7HklZK9GNrNEkk331L gG5Fbg8nq8Y/xF1VDKG2gPX1FNsJA6cFKd0OXVtUZ2BT4KrW0iKMS+E1adU3yr4p7aJP im3Mo9oHEvwIep8A8biqTnc9tY21hRZ/Iv3dduUAa1Lt4E/QPRJLviIW+jpStQONiqhD BjCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=p+J66JiHWkdHeHSKjg1mwUfnUUYwsTZzEsdO8r4gnQE=; b=ZmQ1dCrBCPMs+bKaN1FMD8x9MgnPRQ0bcH05XVOuI2sAmThLY27lYSVFb1Gn6jD86I BLLDuSZMzTRWER8kTsW+eoN1KB+b1QqCTXobJUtxozofFfNbs6MyfZMZZD7zaIGFho5b 4tc8SVAqAhh0me092FM/LTH7kKj92ryqV2glPSkmk0m0/TNLmNasNyozIssm04YTTebY Pdnu0z1fWhANr7l+bikmJGkY+3O5HeYvICzUWMqIF/73df3K4AvdJkhZ0tG8T0hQSmka fJFF6iDWllH5dewuT9VT0oUbo8pwE+RudDX1Wx4xeMdt5al7BWJTE0kJXnWiG9H5ectw xZzg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=UGkh0jBR; 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=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g5si2707759pgo.780.2018.01.26.00.45.24; Fri, 26 Jan 2018 00:45:38 -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=@gmail.com header.s=20161025 header.b=UGkh0jBR; 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=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752621AbeAZIo4 (ORCPT + 99 others); Fri, 26 Jan 2018 03:44:56 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:46062 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752336AbeAZIow (ORCPT ); Fri, 26 Jan 2018 03:44:52 -0500 Received: by mail-wr0-f196.google.com with SMTP id 16so10094462wry.12 for ; Fri, 26 Jan 2018 00:44:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=p+J66JiHWkdHeHSKjg1mwUfnUUYwsTZzEsdO8r4gnQE=; b=UGkh0jBRFY8UFPq++IORymN3xXZlTQyOycpKlwV2NXgbgSVfnAG2pLmFLc6Osp9K6X cJWD+snnKQc7HSMwTDkSjNJaYrVvzY44FpDo7PTf+TPTtNwaKxiaCflEjt2iOdymRIYg R05/XF+DOPrFD0PgClWJZW8yinPWhgQLm3pDxT+SGAUkR8qy3cP0K0oGH/L0RRf0Y1Dg XxpDQLM1zV8NAUkFCQS3eWP3NWRNeZhpjY04xLGYLxxOfIPS2XCnBepVtrWARDKtalwg hXSCFjx28Uszpp/6+ef6yzOtpq503j50XdmsdVl2vAWKpF9cSo7JsGp+Zri9tQZ+uqHn BlAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=p+J66JiHWkdHeHSKjg1mwUfnUUYwsTZzEsdO8r4gnQE=; b=ts1KOMKul7PcGO6go6243CKteTzfX89RTau1FjCujwfRgoRP/rlQ8HeHoYLJ5UV1hj yh1PoYF3i/giwYJwbmSmRXRnGxwj5VWSgn4s4seNeg27mnB51FInBIOMnuZmBsudKWME gE8QRYQSuE00u6apExYHGywg9eWyD4JuXyHts5vawVLC+8xWnZhgVr/odr2zLsFDwceK Tp5LOmhcvLD6mILMxoKdlkPcKvHjJ3m/Zdc60yn1p71B49GFHsR3B1oOYgWJFO+CFlaJ m/6vKkHMt+3ylClKCWvNQbUCAvWhcZqmHuMbS4lycwPoLnVxVHi+ptduTQWSXPxe4x5J VRug== X-Gm-Message-State: AKwxytcNMObpdFlvzyB4fkR5ttLctQBMUwY/gApxqgRlxyUFySBsQi9Y jjkxOjS/88byaswEIh8flM/igaKMSppA05wL0uI= X-Received: by 10.223.155.136 with SMTP id d8mr11245159wrc.161.1516956290682; Fri, 26 Jan 2018 00:44:50 -0800 (PST) MIME-Version: 1.0 Received: by 10.223.175.53 with HTTP; Fri, 26 Jan 2018 00:44:50 -0800 (PST) In-Reply-To: <20180125062031.GW3741@linux.vnet.ibm.com> References: <1516694381-20333-1-git-send-email-lianglihao@huawei.com> <1516694381-20333-8-git-send-email-lianglihao@huawei.com> <20180125062031.GW3741@linux.vnet.ibm.com> From: Lihao Liang Date: Fri, 26 Jan 2018 08:44:50 +0000 Message-ID: Subject: Re: [PATCH RFC 07/16] prcu: Implement call_prcu() API To: Paul McKenney Cc: "Guohanjun (Hanjun Guo)" , heng.z@huawei.com, hb.chen@huawei.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jan 25, 2018 at 6:20 AM, Paul E. McKenney wrote: > On Tue, Jan 23, 2018 at 03:59:32PM +0800, lianglihao@huawei.com wrote: >> From: Lihao Liang >> >> This is PRCU's counterpart of RCU's call_rcu() API. >> >> Reviewed-by: Heng Zhang >> Signed-off-by: Lihao Liang >> --- >> include/linux/prcu.h | 25 ++++++++++++++++++++ >> init/main.c | 2 ++ >> kernel/rcu/prcu.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++--- >> 3 files changed, 91 insertions(+), 3 deletions(-) >> >> diff --git a/include/linux/prcu.h b/include/linux/prcu.h >> index 653b4633..e5e09c9b 100644 >> --- a/include/linux/prcu.h >> +++ b/include/linux/prcu.h >> @@ -2,15 +2,36 @@ >> #define __LINUX_PRCU_H >> >> #include >> +#include >> #include >> #include >> >> #define CONFIG_PRCU >> >> +struct prcu_version_head { >> + unsigned long long version; >> + struct prcu_version_head *next; >> +}; >> + >> +/* Simple unsegmented callback list for PRCU. */ >> +struct prcu_cblist { >> + struct rcu_head *head; >> + struct rcu_head **tail; >> + struct prcu_version_head *version_head; >> + struct prcu_version_head **version_tail; >> + long len; >> +}; >> + >> +#define PRCU_CBLIST_INITIALIZER(n) { \ >> + .head = NULL, .tail = &n.head, \ >> + .version_head = NULL, .version_tail = &n.version_head, \ >> +} >> + >> struct prcu_local_struct { >> unsigned int locked; >> unsigned int online; >> unsigned long long version; >> + struct prcu_cblist cblist; >> }; >> >> struct prcu_struct { >> @@ -24,6 +45,8 @@ struct prcu_struct { >> void prcu_read_lock(void); >> void prcu_read_unlock(void); >> void synchronize_prcu(void); >> +void call_prcu(struct rcu_head *head, rcu_callback_t func); >> +void prcu_init(void); >> void prcu_note_context_switch(void); >> >> #else /* #ifdef CONFIG_PRCU */ >> @@ -31,6 +54,8 @@ void prcu_note_context_switch(void); >> #define prcu_read_lock() do {} while (0) >> #define prcu_read_unlock() do {} while (0) >> #define synchronize_prcu() do {} while (0) >> +#define call_prcu() do {} while (0) >> +#define prcu_init() do {} while (0) >> #define prcu_note_context_switch() do {} while (0) >> >> #endif /* #ifdef CONFIG_PRCU */ >> diff --git a/init/main.c b/init/main.c >> index f8665104..4925964e 100644 >> --- a/init/main.c >> +++ b/init/main.c >> @@ -38,6 +38,7 @@ >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -574,6 +575,7 @@ asmlinkage __visible void __init start_kernel(void) >> workqueue_init_early(); >> >> rcu_init(); >> + prcu_init(); >> >> /* Trace events are available after this */ >> trace_init(); >> diff --git a/kernel/rcu/prcu.c b/kernel/rcu/prcu.c >> index a00b9420..f198285c 100644 >> --- a/kernel/rcu/prcu.c >> +++ b/kernel/rcu/prcu.c >> @@ -1,11 +1,12 @@ >> #include >> -#include >> #include >> -#include >> +#include >> #include >> - >> +#include >> #include >> >> +#include "rcu.h" >> + >> DEFINE_PER_CPU_SHARED_ALIGNED(struct prcu_local_struct, prcu_local); >> >> struct prcu_struct global_prcu = { >> @@ -16,6 +17,16 @@ struct prcu_struct global_prcu = { >> }; >> struct prcu_struct *prcu = &global_prcu; >> >> +/* Initialize simple callback list. */ >> +static void prcu_cblist_init(struct prcu_cblist *rclp) >> +{ >> + rclp->head = NULL; >> + rclp->tail = &rclp->head; >> + rclp->version_head = NULL; >> + rclp->version_tail = &rclp->version_head; >> + rclp->len = 0; >> +} >> + >> static inline void prcu_report(struct prcu_local_struct *local) >> { >> unsigned long long global_version; >> @@ -123,3 +134,53 @@ void prcu_note_context_switch(void) >> prcu_report(local); >> put_cpu_ptr(&prcu_local); >> } >> + >> +void call_prcu(struct rcu_head *head, rcu_callback_t func) >> +{ >> + unsigned long flags; >> + struct prcu_local_struct *local; >> + struct prcu_cblist *rclp; >> + struct prcu_version_head *vhp; >> + >> + debug_rcu_head_queue(head); >> + >> + /* Use GFP_ATOMIC with IRQs disabled */ >> + vhp = kmalloc(sizeof(struct prcu_version_head), GFP_ATOMIC); >> + if (!vhp) >> + return; > > Silently failing to post the callback can cause system hangs. I suggest > finding some way to avoid allocating on the call_prcu() code path. > You're absolutely right. We were also thinking of changing the function return type from void to int to indicate whether the memory allocation is successful or not. Best, Lihao. > Thanx, Paul > >> + >> + head->func = func; >> + head->next = NULL; >> + vhp->next = NULL; >> + >> + local_irq_save(flags); >> + local = this_cpu_ptr(&prcu_local); >> + vhp->version = local->version; >> + rclp = &local->cblist; >> + rclp->len++; >> + *rclp->tail = head; >> + rclp->tail = &head->next; >> + *rclp->version_tail = vhp; >> + rclp->version_tail = &vhp->next; >> + local_irq_restore(flags); >> +} >> +EXPORT_SYMBOL(call_prcu); >> + >> +void prcu_init_local_struct(int cpu) >> +{ >> + struct prcu_local_struct *local; >> + >> + local = per_cpu_ptr(&prcu_local, cpu); >> + local->locked = 0; >> + local->online = 0; >> + local->version = 0; >> + prcu_cblist_init(&local->cblist); >> +} >> + >> +void __init prcu_init(void) >> +{ >> + int cpu; >> + >> + for_each_possible_cpu(cpu) >> + prcu_init_local_struct(cpu); >> +} >> -- >> 2.14.1.729.g59c0ea183 >> >