[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] xen/arm: gic-v3-lpi: Allocate the pending table while preparing the CPU


  • To: Julien Grall <julien@xxxxxxx>
  • From: Bertrand Marquis <Bertrand.Marquis@xxxxxxx>
  • Date: Mon, 16 May 2022 12:06:42 +0000
  • Accept-language: en-GB, en-US
  • Arc-authentication-results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com])
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none
  • Arc-message-signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Hbzq96OHyB86eOvTJasK8OYjYHkVSJJ2op2IQBdMr6Y=; b=DW3V2HzAJpw6MujIZndbEKRHnkS10m2HRW/JSHTgZTqHheNY2xmE0R+2Zmpd+w8MfAdNa+zGFhOXR1XNUPc0v5QCYqKEZ09JSDURz42+75F9c8yf62oeYgbDy0bxCdd5LuzRqRDJVBN9zZ6TMXfA9Z5D4tJiM3LLAY0F22llDpfEjI3Y+xgVKGQFMo0qPYcPY1F3TehAdUcVThDwPL6egMUyhpkfOohCssVwSeeTGm8e179b+4BJsAQPbeJMcdjXOUpJLxat3OzfRuMWJOvAkxJq1D2TcmIZzBIwUvtsZnwgcV+Zkh9WKHEvtIvda/psQQ1+kPeQXPyp2N0MGhZI4g==
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Hbzq96OHyB86eOvTJasK8OYjYHkVSJJ2op2IQBdMr6Y=; b=NbUF4zg1NLJgUk/CHZXBFcQysLxvDBe6kRCzTu4I0m1BVV/6pYedMTLyra+H62Sk8nvn5kwhFZRc85iJzOeLQAXENUTaoXTY5fmJyipKh16OHDt0n3Hl/6hUO9LIOJplEXq0b1uNu8Frzv+1llm8psPogdbwiSn4A2KlpJVeI8YMEMZ5W6LWJ+vZTPM3bxnjMH5bVj+ag0KMB4whxjjj+tbkgnRkLNbiSlfDwvyEgr4Ox/TfBGPibz8asHfVGW3eNiyCluBWSNS1k6+dRiaUprY9mmsDTGAS1EkUWR5VQN8poDFAGImvunUq01YHOcFUolqiJREtOhRUd6hZyucrbg==
  • Arc-seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=RGYWiZPqgmdvDUhUFoiXp9Ye5ItdLAoh2doSQ0eATwZ6sDUhRQpY1c4D3usXU5P4wHEy5im0btpZzWi2JXTDMfQ04fYtMQzAj3SHBcjIyIEUZevjTtmkojYNl6MnlZI68I1SqUjWIHwiBK+BFV8e0+celXG+kKil4lbgVe83mEEn3Kv446F7DtpgU7dzKkkpS2w3vr+kl9ioQYBCENI6MzgczSIVAIneho5guMbAr+A/VGQ+jqKaUvk2vdPplJ5dF0tGtHNR27PDDdkmON0armND5oCbJS2Nj4HdcqjMvRi/e0pD6TVfioIZQp33d/ELv5vCxNgbJaJpR3vXLUHiCA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hNWHG10NbMCZwZn7SylC4+6xZ32YIK+/vo9AIvDBQ5ofbmNU4/wZzdlppzrnRXn5cbECxbIzy0P/ysAgkh2y+135xDiMuUWnI535v1Nw5rforUD4A5y7NVU5h2TKAR01t0PJh1dgJB4kmA43LV1s589rhsb2pWYe4aUC3t8AVRpAfMiYkLF1PR6j1N7GkIvigjliqK8rR3RxBNQzr21TkWTJvCWzAQ3pS6nfcYdOKjDPL5t8NDoaPkcDacipQjpNoZGfWfY1rJGhwOynD6i0FyhUiXx4y0ZAMVbefo1fQSaxcRNvlJgy279MGkX9ZpueT+SL89Jt5WvfPtrDrtp0GA==
  • Authentication-results-original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Julien Grall <jgrall@xxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
  • Delivery-date: Mon, 16 May 2022 12:07:11 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Nodisclaimer: true
  • Original-authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com;
  • Thread-index: AQHYaQFPaa+cmN6NyUGhGvdTzOfzhq0hO1kAgAAHagCAACYIgA==
  • Thread-topic: [PATCH] xen/arm: gic-v3-lpi: Allocate the pending table while preparing the CPU

Hi Julien,

> On 16 May 2022, at 10:50, Julien Grall <julien@xxxxxxx> wrote:
> 
> 
> 
> On 16/05/2022 10:24, Bertrand Marquis wrote:
>> Hi Julien,
> 
> Hi Bertrand,
> 
>>> On 16 May 2022, at 09:45, Julien Grall <julien@xxxxxxx> wrote:
>>> 
>>> From: Julien Grall <jgrall@xxxxxxxxxx>
>>> 
>>> Commit 88a037e2cfe1 "page_alloc: assert IRQs are enabled in heap
>>> alloc/free" extended the checks in the buddy allocator to catch any
>>> use of the helpers from context with interrupts disabled.
>>> 
>>> Unfortunately, the rule is not followed in the LPI code when allocating
>>> the pending table:
>>> 
>>> (XEN) Xen call trace:
>>> (XEN) [<000000000022a678>] alloc_xenheap_pages+0x178/0x194 (PC)
>>> (XEN) [<000000000022a670>] alloc_xenheap_pages+0x170/0x194 (LR)
>>> (XEN) [<0000000000237770>] _xmalloc+0x144/0x294
>>> (XEN) [<00000000002378d4>] _xzalloc+0x14/0x30
>>> (XEN) [<000000000027b4e4>] gicv3_lpi_init_rdist+0x54/0x324
>>> (XEN) [<0000000000279898>] arch/arm/gic-v3.c#gicv3_cpu_init+0x128/0x46
>>> (XEN) [<0000000000279bfc>] 
>>> arch/arm/gic-v3.c#gicv3_secondary_cpu_init+0x20/0x50
>>> (XEN) [<0000000000277054>] gic_init_secondary_cpu+0x18/0x30
>>> (XEN) [<0000000000284518>] start_secondary+0x1a8/0x234
>>> (XEN) [<0000010722aa4200>] 0000010722aa4200
>>> (XEN)
>>> (XEN)
>>> (XEN) ****************************************
>>> (XEN) Panic on CPU 2:
>>> (XEN) Assertion '!in_irq() && (local_irq_is_enabled() || num_online_cpus() 
>>> <= 1)' failed at common/page_alloc.c:2212
>>> (XEN) ****************************************
>>> 
>>> For now the patch extending the checks has been reverted, but it would
>>> be good to re-introduce it (allocation with interrupt is not desirable).
>>> 
>>> The logic is reworked to allocate the pending table when preparing the
>>> CPU.
>>> 
>>> Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
>>> ---
>>> xen/arch/arm/gic-v3-lpi.c | 81 ++++++++++++++++++++++++++++-----------
>>> 1 file changed, 59 insertions(+), 22 deletions(-)
>>> 
>>> diff --git a/xen/arch/arm/gic-v3-lpi.c b/xen/arch/arm/gic-v3-lpi.c
>>> index e1594dd20e4c..77d9d05c35a6 100644
>>> --- a/xen/arch/arm/gic-v3-lpi.c
>>> +++ b/xen/arch/arm/gic-v3-lpi.c
>>> @@ -18,6 +18,7 @@
>>> * along with this program; If not, see <http://www.gnu.org/licenses/>.
>>> */
>>> 
>>> +#include <xen/cpu.h>
>>> #include <xen/lib.h>
>>> #include <xen/mm.h>
>>> #include <xen/param.h>
>>> @@ -234,18 +235,13 @@ void gicv3_lpi_update_host_entry(uint32_t host_lpi, 
>>> int domain_id,
>>> write_u64_atomic(&hlpip->data, hlpi.data);
>>> }
>>> 
>>> -static int gicv3_lpi_allocate_pendtable(uint64_t *reg)
>>> +static int gicv3_lpi_allocate_pendtable(unsigned int cpu)
>>> {
>>> - uint64_t val;
>>> void *pendtable;
>>> 
>>> - if ( this_cpu(lpi_redist).pending_table )
>>> + if ( per_cpu(lpi_redist, cpu).pending_table )
>>> return -EBUSY;
>>> 
>>> - val = GIC_BASER_CACHE_RaWaWb << GICR_PENDBASER_INNER_CACHEABILITY_SHIFT;
>>> - val |= GIC_BASER_CACHE_SameAsInner << 
>>> GICR_PENDBASER_OUTER_CACHEABILITY_SHIFT;
>>> - val |= GIC_BASER_InnerShareable << GICR_PENDBASER_SHAREABILITY_SHIFT;
>>> -
>>> /*
>>> * The pending table holds one bit per LPI and even covers bits for
>>> * interrupt IDs below 8192, so we allocate the full range.
>>> @@ -265,13 +261,38 @@ static int gicv3_lpi_allocate_pendtable(uint64_t *reg)
>>> clean_and_invalidate_dcache_va_range(pendtable,
>>> lpi_data.max_host_lpi_ids / 8);
>>> 
>>> - this_cpu(lpi_redist).pending_table = pendtable;
>>> + per_cpu(lpi_redist, cpu).pending_table = pendtable;
>>> 
>>> - val |= GICR_PENDBASER_PTZ;
>>> + return 0;
>>> +}
>>> +
>>> +static int gicv3_lpi_set_pendtable(void __iomem *rdist_base)
>>> +{
>>> + const void *pendtable = this_cpu(lpi_redist).pending_table;
>>> + uint64_t val;
>>> +
>> Should we add an assert here to check if we are to early in boot ?
>> That would also implicitly explain that allocation is done during 
>> CPU_PREPARE so this should not be called before.
> 
> Do you mean something like:
> 
> if ( !pendtable )
> {
> ASSERT_UNREACHABLE();
> return -ENOMEM;
> }

Yes that would work so that we could at least identify the origin.

> 
>>> + if ( !pendtable )
>>> + return -ENOMEM;
>>> 
>>> + ASSERT(!(virt_to_maddr(pendtable) & ~GENMASK(51, 16)));
>> This ASSERT is already done in gicv3_lpi_allocate_pendtable but it makes 
>> sense to have it closer to the place where we actually set the register.
>> Otherwise this assert can never be triggered.
> 
> So the ASSERT() would end up to be triggered if the code in 
> gicv3_allocate_pendtable() is incorrect.
> 
>> Can you remove the one in the allocation function and also copy the comment 
>> that was on top of it here ?
> 
> I would like to the keep as it is. The check in gicv3_allocate_pendtable() 
> happens also in debug build and would allow to catch any problem before the 
> CPU is even running.
> 
> In general, I would like to move to most of the checks when preparing the CPU 
> so there are less chance for failures when the CPU is booting.
> 
> The ASSERT is here only to catch any misuse of the function.

Ok make sense, I am ok with it.

> 
>>> @@ -381,6 +410,7 @@ integer_param("max_lpi_bits", max_lpi_bits);
>>> int gicv3_lpi_init_host_lpis(unsigned int host_lpi_bits)
>>> {
>>> unsigned int nr_lpi_ptrs;
>>> + int rc;
>>> 
>>> /* We rely on the data structure being atomically accessible. */
>>> BUILD_BUG_ON(sizeof(union host_lpi) > sizeof(unsigned long));
>>> @@ -413,7 +443,14 @@ int gicv3_lpi_init_host_lpis(unsigned int 
>>> host_lpi_bits)
>>> 
>>> printk("GICv3: using at most %lu LPIs on the host.\n", MAX_NR_HOST_LPIS);
>>> 
>>> - return 0;
>>> + /* Register the CPU notifier and allocate memory for the boot CPU */
>>> + register_cpu_notifier(&cpu_nfb);
>>> + rc = gicv3_lpi_allocate_pendtable(smp_processor_id());
>>> + if ( rc )
>>> + printk(XENLOG_ERR "Unable to allocate the pendtable for CPU%u\n",
>>> + smp_processor_id());
>> On secondary cores nothing equivalent will be printed and in the cal path 
>> there
>> will be nothing printed at all which could make debugging complex.
>> Can you move this print into gicv3_lpi_allocate_pendtable ?
> 
> Good point. I will do that in the next version.

Thanks

Cheers
Bertrand

> 
> Cheers,
> 
> -- 
> Julien Grall




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.