Received: by 2002:a25:ef43:0:0:0:0:0 with SMTP id w3csp281263ybm; Tue, 26 May 2020 16:57:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxc2qMw0Mt8i0v2yjn23b61CEfT+j0Hs0BVNaTaIacC4NhBWHpo+BynTRVcmpgcWC+H3muL X-Received: by 2002:aa7:c9c9:: with SMTP id i9mr21646722edt.166.1590537426996; Tue, 26 May 2020 16:57:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590537426; cv=none; d=google.com; s=arc-20160816; b=CIqvidE2uoNGIIbvnPog1z/1X4kCgifnxUpR0CwejEILLrqOhKu8WOD6nuwJ0em+ne dHGce0W1Pq5ISowzXcGe0x8ns3bgRV5aKcO0R1ua0lZZYa03ogTOIlC7ne4J5JvFz5f2 y8OTFKlS5d7T0x2A2wQvtBLPhJrfOCclG/yvxf/oyeBC4gTxfkFcuS4nMDhKB3AQjEJl d5EjYDulBSyWoV8xySx/nWIMR5/K9VL5TBYiGV8A8noiVSlhPueOPuqz4ArEDLlxJDjz L1dkHs73w5wB09+I4taNFbi4iKW+fu8nlz3RyduzL8EeAXyfhbZjKA2eioHj/WkhtBLY i6nA== 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:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=635XO67FL1OhBeXk9GFFJRmQz5+du0MBaoAvpIlr9CM=; b=c2uo89Vx9PQ0oasrctWKkqj6ZwoEL7ThQyWb83+ljDBk9gwTLYYsqaDAwNmOTseiB6 MCwXZiwByTZDMlQdweffDY6eUgabU7HkXPkaF1PdfJkJI/dksE/w4Gnr8SLhcF6FKgzP sdyDfFH1JPN7lpQYTWlbQm9RZIq2suyUMNAB7I2NU8fXf4Mz+IzVaKxoX7eZqrtzZSPK tU5IbqRKCFYbffF+P8Wdg3eRnhaW4InjdXJQCRUVzX63H0HUtuow8zoZHpQgyhvTWC72 Iy0AivV0rsu5LqewPHUMmxuVyiN9Hl4mad2e84Ay2O+gotZTTCYWaNc3DdQJaX8vY0Yh IbNA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ezpIp8Re; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id p21si759289ejw.285.2020.05.26.16.56.43; Tue, 26 May 2020 16:57:06 -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=@kernel.org header.s=default header.b=ezpIp8Re; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2403797AbgEZT3t (ORCPT + 99 others); Tue, 26 May 2020 15:29:49 -0400 Received: from mail.kernel.org ([198.145.29.99]:55360 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390211AbgEZTBH (ORCPT ); Tue, 26 May 2020 15:01:07 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4AA9D2086A; Tue, 26 May 2020 19:01:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1590519666; bh=8E0sLew2Jr0zphB0VSQglmqOBcvFzFjkzDJzRHNfIl0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ezpIp8Re3jvEOuDG3I0krEUOJdZRzZe5IBKh9jGyAst55Y/LPYMeE9ETmovfb6wqF SuloPuCzrw/KjuqJhAhZJbYrCWXTo3Ft6t5nNBWZKMpXiFljGDECGuvw7gFbHIL168 jxeo6IELUIfKqOXDlp+/qU0+vZrVoJ+t319wddQ0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mathias Krause , Herbert Xu , Ben Hutchings Subject: [PATCH 4.14 04/59] padata: ensure the reorder timer callback runs on the correct CPU Date: Tue, 26 May 2020 20:52:49 +0200 Message-Id: <20200526183908.427562948@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200526183907.123822792@linuxfoundation.org> References: <20200526183907.123822792@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mathias Krause commit cf5868c8a22dc2854b96e9569064bb92365549ca upstream. The reorder timer function runs on the CPU where the timer interrupt was handled which is not necessarily one of the CPUs of the 'pcpu' CPU mask set. Ensure the padata_reorder() callback runs on the correct CPU, which is one in the 'pcpu' CPU mask set and, preferrably, the next expected one. Do so by comparing the current CPU with the expected target CPU. If they match, call padata_reorder() right away. If they differ, schedule a work item on the target CPU that does the padata_reorder() call for us. Signed-off-by: Mathias Krause Signed-off-by: Herbert Xu Cc: Ben Hutchings Signed-off-by: Greg Kroah-Hartman --- include/linux/padata.h | 2 ++ kernel/padata.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) --- a/include/linux/padata.h +++ b/include/linux/padata.h @@ -85,6 +85,7 @@ struct padata_serial_queue { * @swork: work struct for serialization. * @pd: Backpointer to the internal control structure. * @work: work struct for parallelization. + * @reorder_work: work struct for reordering. * @num_obj: Number of objects that are processed by this cpu. * @cpu_index: Index of the cpu. */ @@ -93,6 +94,7 @@ struct padata_parallel_queue { struct padata_list reorder; struct parallel_data *pd; struct work_struct work; + struct work_struct reorder_work; atomic_t num_obj; int cpu_index; }; --- a/kernel/padata.c +++ b/kernel/padata.c @@ -282,11 +282,51 @@ static void padata_reorder(struct parall return; } +static void invoke_padata_reorder(struct work_struct *work) +{ + struct padata_parallel_queue *pqueue; + struct parallel_data *pd; + + local_bh_disable(); + pqueue = container_of(work, struct padata_parallel_queue, reorder_work); + pd = pqueue->pd; + padata_reorder(pd); + local_bh_enable(); +} + static void padata_reorder_timer(unsigned long arg) { struct parallel_data *pd = (struct parallel_data *)arg; + unsigned int weight; + int target_cpu, cpu; - padata_reorder(pd); + cpu = get_cpu(); + + /* We don't lock pd here to not interfere with parallel processing + * padata_reorder() calls on other CPUs. We just need any CPU out of + * the cpumask.pcpu set. It would be nice if it's the right one but + * it doesn't matter if we're off to the next one by using an outdated + * pd->processed value. + */ + weight = cpumask_weight(pd->cpumask.pcpu); + target_cpu = padata_index_to_cpu(pd, pd->processed % weight); + + /* ensure to call the reorder callback on the correct CPU */ + if (cpu != target_cpu) { + struct padata_parallel_queue *pqueue; + struct padata_instance *pinst; + + /* The timer function is serialized wrt itself -- no locking + * needed. + */ + pinst = pd->pinst; + pqueue = per_cpu_ptr(pd->pqueue, target_cpu); + queue_work_on(target_cpu, pinst->wq, &pqueue->reorder_work); + } else { + padata_reorder(pd); + } + + put_cpu(); } static void padata_serial_worker(struct work_struct *serial_work) @@ -413,6 +453,7 @@ static void padata_init_pqueues(struct p __padata_list_init(&pqueue->reorder); __padata_list_init(&pqueue->parallel); INIT_WORK(&pqueue->work, padata_parallel_worker); + INIT_WORK(&pqueue->reorder_work, invoke_padata_reorder); atomic_set(&pqueue->num_obj, 0); } }