Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2619163pxb; Sun, 24 Jan 2021 13:59:55 -0800 (PST) X-Google-Smtp-Source: ABdhPJzwrNQHzVOirYOsAbLy8xJLoEa0jQsVRpmPzkbUPAnluu+znF0rO3fNzxzmuRuOdiGnLB8G X-Received: by 2002:a05:6402:2c4:: with SMTP id b4mr109362edx.49.1611525595620; Sun, 24 Jan 2021 13:59:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611525595; cv=none; d=google.com; s=arc-20160816; b=P0ph1SujaB8GhT0gqa2VPc4PtIzfgfw9bdBFFyOia+pTOPhcpOdNQ8XyJzMLrOwUYL ydmzCpsOQuS/LWyWJMisntJ4GVk2xoeHhUa2l2bkhnLEmGb0bbzYIhWz+dO/OA7YDOWW R5tBPCUGPCAnu/Bzd3zWaaE6DceWPpB9GKGIKwWyIoW3YbJddZ17H+UIk16zhSWv3Hm6 0WjjfqO8+KPYZcj2QNMLkGTxTRlmCI/o9flG277NrLBbOIQEMvElRxnhAiCFast6QFTk 8w7nu43eE7wtdkkTY8CS5B2ubwDhB9SsHe2/F5LWvvH4EAHwSv9ScErMuDS2K/Q6wNom RGyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:date:from:dkim-signature; bh=H1QjR+82mKDdAM86lvxkKFOo5eIQalM15456HEa3zXU=; b=pDB65YnOs1hScZ8HArGRJpMu7OwvLi/dOJmef/QmlMXEXbkzC/24/YqTBPgvT8qgX2 DmVVEjGcDoqL96F6iGjA92enQOJkWGI6bV1nfK5s5TnGM6Y437N2FP52Yru3g/WOmqSS U6uoGpxO5DlfYe99bcRMbxqTuHyGu++mSWA4306jy1OBDBC9KQi07vaHOvHFg+20dUEN GPPNlCoSNYu33wFdF2eXqgYFwKjHt+uOGKfzT3u0pcys8ctOUckfXi1AxVoo3eaaR+d1 70ysTWaly8kwQDmaHJ60XmgUsESE4LFeO7lfHDFCOKcCjE0Q5NZz5+2BjLBpyuXF0J3v rkPg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="EX/rH/YX"; 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 a14si5312617eju.209.2021.01.24.13.59.31; Sun, 24 Jan 2021 13:59:55 -0800 (PST) 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="EX/rH/YX"; 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 S1726593AbhAXV5q (ORCPT + 99 others); Sun, 24 Jan 2021 16:57:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58400 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726579AbhAXV5p (ORCPT ); Sun, 24 Jan 2021 16:57:45 -0500 Received: from mail-lj1-x234.google.com (mail-lj1-x234.google.com [IPv6:2a00:1450:4864:20::234]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A5484C061573; Sun, 24 Jan 2021 13:57:04 -0800 (PST) Received: by mail-lj1-x234.google.com with SMTP id b10so12980754ljp.6; Sun, 24 Jan 2021 13:57:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:date:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=H1QjR+82mKDdAM86lvxkKFOo5eIQalM15456HEa3zXU=; b=EX/rH/YXa0X+MfaGnvWF2TkH75FKf754jpygjpYfUnJrZz27OTzRNpjtKJf7TQ+mTJ 6uB8rsBjh0QTkL/VsmYO6oja5VtXJubK/upS5SVi5/20+o3YIxN71YlvDIlw7qnivZtX CTnus3PUA5LkarYWif8p6jGl30MWYyXxEkYn4+mkiOMJGUzKBCRXaF36y1UHQD28GneN iFp708M7GJ48PcyDzxUZoIsKtsg/QRouRfl6TGS4lUPuyU7enmRDLSiQH2+M9sekbcyP ebraIbdPEjrX7vxJVdrmR2luWw2fjxcOHrBqzvEnLxN575KbfyTBn3L3aI2/+ej40tWk vfRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=H1QjR+82mKDdAM86lvxkKFOo5eIQalM15456HEa3zXU=; b=CuDzxrHZCOEfqbkYAUMrs+uIUX5kuFncu/0NgK1N7eyaBmprOFSeDdSF9Wu5GP3ufb wSXLwTNiu+xQxIqLhszZteLR7mHydm+BOE2aGIaHfLqihjj/y2qShNT2JYyLJblkMBl4 kK7tS03HXaBKJi5mmknndkQkxP2GKmoJhCKitLs/TOV7yx59W8kUEuLVm4MBW2i6CtK7 hDH/BKcaGMfD8PCS3JuNHca0Qzj0Tsu/pzwzYaXgb4k2TFabgbqqMvZEcZzA5ulHea2Q hlhLOFfNCYn9VhCaUnNIOy2ow8zQV9UIXvmMUEAK+xKfIIIIz+VUdnEb44it836qSYIM phxQ== X-Gm-Message-State: AOAM5309IptRadeQPrsbgLAOdL822d1xQJtZm/TGe/znCkSh2FhiqJ53 mgjSpVZp9O+0aOHzoMoHE14= X-Received: by 2002:a05:651c:28d:: with SMTP id b13mr498080ljo.75.1611525422950; Sun, 24 Jan 2021 13:57:02 -0800 (PST) Received: from pc636 (h5ef52e3d.seluork.dyn.perspektivbredband.net. [94.245.46.61]) by smtp.gmail.com with ESMTPSA id y20sm1114655ljh.124.2021.01.24.13.57.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 24 Jan 2021 13:57:02 -0800 (PST) From: Uladzislau Rezki X-Google-Original-From: Uladzislau Rezki Date: Sun, 24 Jan 2021 22:57:00 +0100 To: "Zhang, Qiang" Cc: "Uladzislau Rezki (Sony)" , LKML , RCU , "Paul E . McKenney" , Michael Ellerman , Andrew Morton , Daniel Axtens , Frederic Weisbecker , Neeraj Upadhyay , Joel Fernandes , Peter Zijlstra , Michal Hocko , Thomas Gleixner , "Theodore Y . Ts'o" , Sebastian Andrzej Siewior , Oleksiy Avramchenko Subject: Re: =?utf-8?B?5Zue5aSN?= =?utf-8?Q?=3A?= [PATCH 3/3] kvfree_rcu: use migrate_disable/enable() Message-ID: <20210124215700.GB1076@pc636> References: <20210120162148.1973-1-urezki@gmail.com> <20210120162148.1973-3-urezki@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello, Zhang. > >________________________________________ > >发件人: Uladzislau Rezki (Sony) > >发送时间: 2021年1月21日 0:21 > >收件人: LKML; RCU; Paul E . McKenney; Michael Ellerman > >抄送: Andrew Morton; Daniel Axtens; Frederic Weisbecker; Neeraj >Upadhyay; Joel Fernandes; Peter Zijlstra; Michal Hocko; Thomas >Gleixner; Theodore Y . Ts'o; Sebastian Andrzej Siewior; Uladzislau >Rezki; Oleksiy Avramchenko > >主题: [PATCH 3/3] kvfree_rcu: use migrate_disable/enable() > > > >Since the page is obtained in a fully preemptible context, dropping > >the lock can lead to migration onto another CPU. As a result a prev. > >bnode of that CPU may be underutilised, because a decision has been > >made for a CPU that was run out of free slots to store a pointer. > > > >migrate_disable/enable() are now independent of RT, use it in order > >to prevent any migration during a page request for a specific CPU it > >is requested for. > > > Hello Rezki > > The critical migrate_disable/enable() area is not allowed to block, under RT and non RT. > There is such a description in preempt.h > > > * Notes on the implementation. > * > * The implementation is particularly tricky since existing code patterns > * dictate neither migrate_disable() nor migrate_enable() is allowed to block. > * This means that it cannot use cpus_read_lock() to serialize against hotplug, > * nor can it easily migrate itself into a pending affinity mask change on > * migrate_enable(). > How i interpret it is migrate_enable()/migrate_disable() are not allowed to use any blocking primitives, such as rwsem/mutexes/etc. in order to mark a current context as non-migratable. void migrate_disable(void) { struct task_struct *p = current; if (p->migration_disabled) { p->migration_disabled++; return; } preempt_disable(); this_rq()->nr_pinned++; p->migration_disabled = 1; preempt_enable(); } It does nothing that prevents you from doing schedule() or even wait for any event(mutex slow path behaviour), when the process is removed from the run-queue. I mean after the migrate_disable() is invoked. Or i miss something? > > How about the following changes: > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > index e7a226abff0d..2aa19537ac7c 100644 > --- a/kernel/rcu/tree.c > +++ b/kernel/rcu/tree.c > @@ -3488,12 +3488,10 @@ add_ptr_to_bulk_krc_lock(struct kfree_rcu_cpu **krcp, > (*krcp)->bkvhead[idx]->nr_records == KVFREE_BULK_MAX_ENTR) { > bnode = get_cached_bnode(*krcp); > if (!bnode && can_alloc) { > - migrate_disable(); > krc_this_cpu_unlock(*krcp, *flags); > bnode = (struct kvfree_rcu_bulk_data *) > __get_free_page(GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOMEMALLOC | __GFP_NOWARN); > - *krcp = krc_this_cpu_lock(flags); > - migrate_enable(); > + raw_spin_lock_irqsave(&(*krcp)->lock, *flags); > Hm.. Taking the former lock can lead to a pointer leaking, i mean a CPU associated with "krcp" might go offline during a page request process, so a queuing occurs on off-lined CPU. Apat of that, acquiring a former lock still does not solve: - CPU1 in process of page allocation; - CPU1 gets migrated to CPU2; - another task running on CPU1 also allocate a page; - both bnodes are added to krcp associated with CPU1. I agree that such scenario probably will never happen or i would say, can be considered as a corner case. We can drop the: [PATCH 3/3] kvfree_rcu: use migrate_disable/enable() and live with: an allocated bnode can be queued to another CPU, so its prev. "bnode" can be underutilized. What is also can be considered as a corner case. According to my tests, it is hard to achieve: Running kvfree_rcu() simultaneously in a tight loop, 1 000 000 allocations/freeing: - 64 CPUs and 64 threads showed 1 migration; - 64 CPUs and 128 threads showed 0 migrations; - 64 CPUs and 32 threads showed 0 migration. Thoughts? Thank you for your comments! -- Vlad Rezki