Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp1096096ybk; Sat, 16 May 2020 00:40:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxbnvmDGvjRivsLW6cUPvzemHUXjkdE9fKPEBKWgQOvG84oyXDeToofsnmtm9VudZJKFjPW X-Received: by 2002:a05:6402:c0f:: with SMTP id co15mr5951310edb.286.1589614853754; Sat, 16 May 2020 00:40:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589614853; cv=none; d=google.com; s=arc-20160816; b=Vi/Y0PYiO8xo29c//kBcygr84GeoxhINcJL8caLTow7mCr1RxWC9tGHJIoNEDRfvTu dkW9IjRt6KA2JaBfmjuusivBwB2xQrd8V6CMjWvCHAu7x8NgPzVENsy8lfzYxcefA70G 9gCQmWwUHmqHumxbVjHS3jyRcvW4cEWO7mOQlIQpKrHbAqIfkltT8NTK35UXPpYiUP+W y57mAbXfZNJu86cqcl+pePZrcuFFzGl43miw4eetm/fCaz4iIQafAzJ05VbJkkGkGwFX QslxNbRnbGWljrn4DDdravjS14qDvsk21TDkRIVrUQVPB+9HFp89907Ao0EwDIwmrBXk 9MeA== 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:message-id :mime-version:in-reply-to:references:cc:to:subject:from:date :dkim-signature; bh=a9I7yRiqq2YjmcjOT4auUHd44ncIAoOgvFdRgFa+edA=; b=Io4lwc21sCNkDL2kxX2XTKog/X0I8EeZm4g7gpb0i6K60qyqMPOgR3+IVLo9ZIl2Rn rOmHb4QnhbtY63sREQFreRVSG1AM/ZJ9Fkux8BhLNJRpcp7kSkpwSaD/ysFgOVPmj7Wt MgIy8tqWhegHLul+ox+8cd+LVlRxbCq3vuTNU3WdryNoMulIaglWspACIrAULcjhgHG3 2E7xgssWBmqlRNs/6pbPJvOqACK7Z9rz2QeO+Lh2R5hsiRnt+KO/uqHUsExoLtuXxf71 UiZRxywtGYBEVdLg+uKaJdV6YzJXeQ4H8CM+VfWPjBUwUdeUwpIE4q0QrljPctwqsXGw wQdw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=DuPPJcWV; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bo6si2430111edb.586.2020.05.16.00.40.28; Sat, 16 May 2020 00:40:53 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=DuPPJcWV; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726559AbgEPHgl (ORCPT + 99 others); Sat, 16 May 2020 03:36:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55518 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1725867AbgEPHgk (ORCPT ); Sat, 16 May 2020 03:36:40 -0400 Received: from mail-pj1-x1042.google.com (mail-pj1-x1042.google.com [IPv6:2607:f8b0:4864:20::1042]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 65B94C061A0C for ; Sat, 16 May 2020 00:36:40 -0700 (PDT) Received: by mail-pj1-x1042.google.com with SMTP id ms17so2081277pjb.0 for ; Sat, 16 May 2020 00:36:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:subject:to:cc:references:in-reply-to:mime-version :message-id:content-transfer-encoding; bh=a9I7yRiqq2YjmcjOT4auUHd44ncIAoOgvFdRgFa+edA=; b=DuPPJcWVsJhXS2lemdDvfdc6suYxZ9xvfX2nRyRxxju0deHqV4clNQUNpZ6MStZzU3 l/zga/yclRO7BgaZsZWlQKrDu0QJcAbSahjzTFggKxfs0WxLTUmTyahSH1KMTTmMHBtf ufIxrE/P2HGT9l94YZMhH9efp/98L7UrqC2ggsgNV1/rZC0m/ge1F7WWFZUAqHJAipOV ByzqfCoVXhEpxNwlbGcw/t0NDcH1PfXVG5IozZgp7Il3fhsPcFZWdExGgIyImQ0eXbzP 6AfoUMBgbYmSv6xCNXK2AUXJX1c0bwudejNX9CgIOwu/3zDukQSIUXh7u9z+SF+tYb39 tGQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:subject:to:cc:references:in-reply-to :mime-version:message-id:content-transfer-encoding; bh=a9I7yRiqq2YjmcjOT4auUHd44ncIAoOgvFdRgFa+edA=; b=OfS2eey15z/WuGn5SgDx1aO8kLYhC+/gQ5XTvabyI65dqJuumraSjoLOsBXvShz0n1 FLTtNRo53uRjSLZ8gPGoxpECDf72t8J63ekjp2w2dJWW97pX7A1J29FPrTtbmxNlIi8t db/kwW+Vf8H7M/adRCtCWJdaQ3GlVOtZQLVfikMP+pcGFJl5z3s5mfkZLFQkTuukWgMn haLi2CaJBjNIFBNrnGnxXiucJfOlAl/n4iVEXDIjkzq/dQ8nOxc3AbVrKZIikAHCz2VF 1WOrK+1CwKUtDQ5asbfqigno+LmDHm09NlGZzLNadQw1t1JpgfDOAtpsZGLxXfec/gwd wXsg== X-Gm-Message-State: AOAM530ZpwNIgZQ0Yqe5xGKCEI5iBN+q3W/o2EshMlFke7lO74WZasKE y6ts58g+pOkuBLKJhJBmyZ8= X-Received: by 2002:a17:90b:1016:: with SMTP id gm22mr7628862pjb.60.1589614599904; Sat, 16 May 2020 00:36:39 -0700 (PDT) Received: from localhost ([61.68.67.54]) by smtp.gmail.com with ESMTPSA id 192sm3553340pfu.182.2020.05.16.00.36.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 May 2020 00:36:39 -0700 (PDT) Date: Sat, 16 May 2020 17:36:33 +1000 From: Nicholas Piggin Subject: Re: [PATCH v5 2/2] powerpc/rtas: Implement reentrant rtas call To: Allison Randal , Thiago Jung Bauermann , Benjamin Herrenschmidt , Daniel Axtens , "Gautham R. Shenoy" , Greg Kroah-Hartman , Anshuman Khandual , Leonardo Bras , Michael Ellerman , Nadav Amit , Nathan Lynch , Paul Mackerras , Thomas Gleixner Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org References: <20200516052137.175881-1-leobras.c@gmail.com> <20200516052137.175881-3-leobras.c@gmail.com> In-Reply-To: <20200516052137.175881-3-leobras.c@gmail.com> MIME-Version: 1.0 Message-Id: <1589614523.yfijifo1n6.astroid@bobo.none> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Excerpts from Leonardo Bras's message of May 16, 2020 3:21 pm: > Implement rtas_call_reentrant() for reentrant rtas-calls: > "ibm,int-on", "ibm,int-off",ibm,get-xive" and "ibm,set-xive". >=20 > On LoPAPR Version 1.1 (March 24, 2016), from 7.3.10.1 to 7.3.10.4, > items 2 and 3 say: >=20 > 2 - For the PowerPC External Interrupt option: The * call must be > reentrant to the number of processors on the platform. > 3 - For the PowerPC External Interrupt option: The * argument call > buffer for each simultaneous call must be physically unique. >=20 > So, these rtas-calls can be called in a lockless way, if using > a different buffer for each cpu doing such rtas call. >=20 > For this, it was suggested to add the buffer (struct rtas_args) > in the PACA struct, so each cpu can have it's own buffer. > The PACA struct received a pointer to rtas buffer, which is > allocated in the memory range available to rtas 32-bit. >=20 > Reentrant rtas calls are useful to avoid deadlocks in crashing, > where rtas-calls are needed, but some other thread crashed holding > the rtas.lock. >=20 > This is a backtrace of a deadlock from a kdump testing environment: >=20 > #0 arch_spin_lock > #1 lock_rtas () > #2 rtas_call (token=3D8204, nargs=3D1, nret=3D1, outputs=3D0x0) > #3 ics_rtas_mask_real_irq (hw_irq=3D4100) > #4 machine_kexec_mask_interrupts > #5 default_machine_crash_shutdown > #6 machine_crash_shutdown > #7 __crash_kexec > #8 crash_kexec > #9 oops_end >=20 > Signed-off-by: Leonardo Bras > --- > arch/powerpc/include/asm/paca.h | 2 ++ > arch/powerpc/include/asm/rtas.h | 1 + > arch/powerpc/kernel/paca.c | 20 +++++++++++ > arch/powerpc/kernel/rtas.c | 52 +++++++++++++++++++++++++++++ > arch/powerpc/sysdev/xics/ics-rtas.c | 22 ++++++------ > 5 files changed, 86 insertions(+), 11 deletions(-) >=20 > diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/p= aca.h > index e3cc9eb9204d..87cd9c2220cc 100644 > --- a/arch/powerpc/include/asm/paca.h > +++ b/arch/powerpc/include/asm/paca.h > @@ -29,6 +29,7 @@ > #include > #include > #include > +#include > =20 > #include > =20 > @@ -270,6 +271,7 @@ struct paca_struct { > #ifdef CONFIG_MMIOWB > struct mmiowb_state mmiowb_state; > #endif > + struct rtas_args *reentrant_args; > } ____cacheline_aligned; > =20 > extern void copy_mm_to_paca(struct mm_struct *mm); > diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/r= tas.h > index c35c5350b7e4..fa7509c85881 100644 > --- a/arch/powerpc/include/asm/rtas.h > +++ b/arch/powerpc/include/asm/rtas.h > @@ -236,6 +236,7 @@ extern struct rtas_t rtas; > extern int rtas_token(const char *service); > extern int rtas_service_present(const char *service); > extern int rtas_call(int token, int, int, int *, ...); > +int rtas_call_reentrant(int token, int nargs, int nret, int *outputs, ..= .); > void rtas_call_unlocked(struct rtas_args *args, int token, int nargs, > int nret, ...); > extern void __noreturn rtas_restart(char *cmd); > diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c > index 3f91ccaa9c74..88c9b61489fc 100644 > --- a/arch/powerpc/kernel/paca.c > +++ b/arch/powerpc/kernel/paca.c > @@ -16,6 +16,7 @@ > #include > #include > #include > +#include > =20 > #include "setup.h" > =20 > @@ -164,6 +165,23 @@ static struct slb_shadow * __init new_slb_shadow(int= cpu, unsigned long limit) > =20 > #endif /* CONFIG_PPC_BOOK3S_64 */ > =20 > +/** > + * new_rtas_args() - Allocates rtas args > + * @cpu: CPU number > + * @limit: Memory limit for this allocation > + * > + * Allocates a struct rtas_args and return it's pointer. > + * > + * Return: Pointer to allocated rtas_args > + */ > +static struct rtas_args * __init new_rtas_args(int cpu, unsigned long li= mit) > +{ > + limit =3D min_t(unsigned long, limit, RTAS_INSTANTIATE_MAX); > + > + return alloc_paca_data(sizeof(struct rtas_args), L1_CACHE_BYTES, > + limit, cpu); > +} > + > /* The Paca is an array with one entry per processor. Each contains an > * lppaca, which contains the information shared between the > * hypervisor and Linux. > @@ -202,6 +220,7 @@ void __init __nostackprotector initialise_paca(struct= paca_struct *new_paca, int > /* For now -- if we have threads this will be adjusted later */ > new_paca->tcd_ptr =3D &new_paca->tcd; > #endif > + new_paca->reentrant_args =3D NULL; > } > =20 > /* Put the paca pointer into r13 and SPRG_PACA */ > @@ -274,6 +293,7 @@ void __init allocate_paca(int cpu) > #ifdef CONFIG_PPC_BOOK3S_64 > paca->slb_shadow_ptr =3D new_slb_shadow(cpu, limit); > #endif > + paca->reentrant_args =3D new_rtas_args(cpu, limit); Good, I think tihs should work as you want now. Can you allocate it like=20 lppacas? Put it under PSERIES (and in the paca) and check for !HV? Thanks, Nick