Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp3693803ybv; Mon, 10 Feb 2020 04:50:38 -0800 (PST) X-Google-Smtp-Source: APXvYqy+JKgMWFMCKe995d/woZx/NERPlb4PZOgRHIXN7yzSMtoh0He9I3PGs4mK4EmRAn2Osmkr X-Received: by 2002:aca:c7ca:: with SMTP id x193mr732093oif.70.1581339038181; Mon, 10 Feb 2020 04:50:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581339038; cv=none; d=google.com; s=arc-20160816; b=u76R7TLf8AiaD1JStmw+WSSqa2qW3rfpP10uUbpAzkc7BcGJUkCQSqgqX7g+APe8gS Ex3/oK2aNx5z1joM9iMl+6adJ7NsulREOHm3rwfXJORqzMzX9aVGMqkYj6+PlI1wVcnk 8A/bCGNsJjm3b8iMeVkMPlZXA20E9cj6FB3bu+5HLGq3OJwxGqtYlQHiVfqq0Py7GOlG uEj8HWmI78W5dIHp6rtPdd+H+tr7UTqvQ4v2aEfmPTd/tZmIacRLczXan2e/LeoBJjM4 Hky/o0XxtFZLUoQ6bG13e1K5AyUyU3ZukcP5irK+a2OiX4IdDQOAwYXmsw2yWf4eN9PT JXzg== 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=FxYAqWcsyroCMx8KjZCUpwYO2ZURHp7fllJqpKQzYsw=; b=VBgRR/0UKEtdVfO7BJdDdZA4G2l0LCIZk3yQKnaeesd74NwTkJmDJmK2L1OsayrChH c4atIeuHjrTJ8SmSdMx4qHHEhawvtEQ55YjoH8WcMijSBt7jqdqhUSWc4SLsiIcuE1Qx k5rzDkDSsz4C/R2pbme8AsaCc5R/fHnMRgUlDqwS7gJIcaUmBazkI4d6/+72PZg1zOMA DychZcgzto9Cxe2Sjf6tYchcjAPkwuH74wjH/VYS8OphB3WnZ4qjbXQ1h3En6HRimcq4 WYikoTXrSfpxeh/BV1msAVmw8zN2IQfb1K9QoK5EeG1jSKZ4oLtv+93bu8pJqsMiTQWo AwRQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=GCUgcsLq; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s5si154902otd.141.2020.02.10.04.50.27; Mon, 10 Feb 2020 04:50: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=@kernel.org header.s=default header.b=GCUgcsLq; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730619AbgBJMoT (ORCPT + 99 others); Mon, 10 Feb 2020 07:44:19 -0500 Received: from mail.kernel.org ([198.145.29.99]:40726 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729362AbgBJMkc (ORCPT ); Mon, 10 Feb 2020 07:40:32 -0500 Received: from localhost (unknown [209.37.97.194]) (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 34BB324672; Mon, 10 Feb 2020 12:40:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1581338432; bh=J05NzwZemBlr80XEvaHzlzPsIv40DKlhVAFBil0eImg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GCUgcsLqfFjfPLgHedF6hT67X8ziyEsy67Jao5cZ96vh+h97LV+wXTSAQAV4rSmxh XeeE7K78m+qF+A6unzj0rpEO8saSh4vx3yFWeMkDFscjFCzHxYHRwgWT6f980i0L3A z4Gtz1dVkksWIqKEfL70T6wFKuq522F61cp8DelU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Herbert Xu , Daniel Jordan Subject: [PATCH 5.5 120/367] padata: Remove broken queue flushing Date: Mon, 10 Feb 2020 04:30:33 -0800 Message-Id: <20200210122435.803392067@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200210122423.695146547@linuxfoundation.org> References: <20200210122423.695146547@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: Herbert Xu commit 07928d9bfc81640bab36f5190e8725894d93b659 upstream. The function padata_flush_queues is fundamentally broken because it cannot force padata users to complete the request that is underway. IOW padata has to passively wait for the completion of any outstanding work. As it stands flushing is used in two places. Its use in padata_stop is simply unnecessary because nothing depends on the queues to be flushed afterwards. The other use in padata_replace is more substantial as we depend on it to free the old pd structure. This patch instead uses the pd->refcnt to dynamically free the pd structure once all requests are complete. Fixes: 2b73b07ab8a4 ("padata: Flush the padata queues actively") Cc: Signed-off-by: Herbert Xu Reviewed-by: Daniel Jordan Signed-off-by: Herbert Xu Signed-off-by: Greg Kroah-Hartman --- kernel/padata.c | 43 ++++++++++++------------------------------- 1 file changed, 12 insertions(+), 31 deletions(-) --- a/kernel/padata.c +++ b/kernel/padata.c @@ -35,6 +35,8 @@ #define MAX_OBJ_NUM 1000 +static void padata_free_pd(struct parallel_data *pd); + static int padata_index_to_cpu(struct parallel_data *pd, int cpu_index) { int cpu, target_cpu; @@ -283,6 +285,7 @@ static void padata_serial_worker(struct struct padata_serial_queue *squeue; struct parallel_data *pd; LIST_HEAD(local_list); + int cnt; local_bh_disable(); squeue = container_of(serial_work, struct padata_serial_queue, work); @@ -292,6 +295,8 @@ static void padata_serial_worker(struct list_replace_init(&squeue->serial.list, &local_list); spin_unlock(&squeue->serial.lock); + cnt = 0; + while (!list_empty(&local_list)) { struct padata_priv *padata; @@ -301,9 +306,12 @@ static void padata_serial_worker(struct list_del_init(&padata->list); padata->serial(padata); - atomic_dec(&pd->refcnt); + cnt++; } local_bh_enable(); + + if (atomic_sub_and_test(cnt, &pd->refcnt)) + padata_free_pd(pd); } /** @@ -440,7 +448,7 @@ static struct parallel_data *padata_allo padata_init_squeues(pd); atomic_set(&pd->seq_nr, -1); atomic_set(&pd->reorder_objects, 0); - atomic_set(&pd->refcnt, 0); + atomic_set(&pd->refcnt, 1); spin_lock_init(&pd->lock); pd->cpu = cpumask_first(pd->cpumask.pcpu); INIT_WORK(&pd->reorder_work, invoke_padata_reorder); @@ -466,29 +474,6 @@ static void padata_free_pd(struct parall kfree(pd); } -/* Flush all objects out of the padata queues. */ -static void padata_flush_queues(struct parallel_data *pd) -{ - int cpu; - struct padata_parallel_queue *pqueue; - struct padata_serial_queue *squeue; - - for_each_cpu(cpu, pd->cpumask.pcpu) { - pqueue = per_cpu_ptr(pd->pqueue, cpu); - flush_work(&pqueue->work); - } - - if (atomic_read(&pd->reorder_objects)) - padata_reorder(pd); - - for_each_cpu(cpu, pd->cpumask.cbcpu) { - squeue = per_cpu_ptr(pd->squeue, cpu); - flush_work(&squeue->work); - } - - BUG_ON(atomic_read(&pd->refcnt) != 0); -} - static void __padata_start(struct padata_instance *pinst) { pinst->flags |= PADATA_INIT; @@ -502,10 +487,6 @@ static void __padata_stop(struct padata_ pinst->flags &= ~PADATA_INIT; synchronize_rcu(); - - get_online_cpus(); - padata_flush_queues(pinst->pd); - put_online_cpus(); } /* Replace the internal control structure with a new one. */ @@ -526,8 +507,8 @@ static void padata_replace(struct padata if (!cpumask_equal(pd_old->cpumask.cbcpu, pd_new->cpumask.cbcpu)) notification_mask |= PADATA_CPU_SERIAL; - padata_flush_queues(pd_old); - padata_free_pd(pd_old); + if (atomic_dec_and_test(&pd_old->refcnt)) + padata_free_pd(pd_old); if (notification_mask) blocking_notifier_call_chain(&pinst->cpumask_change_notifier,