From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_NEOMUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B6ABDECDE47 for ; Thu, 8 Nov 2018 19:41:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 75C9820840 for ; Thu, 8 Nov 2018 19:41:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 75C9820840 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726999AbeKIFSO (ORCPT ); Fri, 9 Nov 2018 00:18:14 -0500 Received: from metis.ext.pengutronix.de ([85.220.165.71]:39461 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725739AbeKIFSO (ORCPT ); Fri, 9 Nov 2018 00:18:14 -0500 Received: from ptx.hi.pengutronix.de ([2001:67c:670:100:1d::c0]) by metis.ext.pengutronix.de with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1gKqB3-00024l-B6; Thu, 08 Nov 2018 20:41:17 +0100 Received: from ukl by ptx.hi.pengutronix.de with local (Exim 4.89) (envelope-from ) id 1gKqB2-0002Ch-R6; Thu, 08 Nov 2018 20:41:16 +0100 Date: Thu, 8 Nov 2018 20:41:16 +0100 From: Uwe =?iso-8859-1?Q?Kleine-K=F6nig?= To: Bartosz Golaszewski Cc: Thomas Gleixner , linux-kernel@vger.kernel.org Subject: Re: [PATCH] irq/irq_sim: add locking Message-ID: <20181108194116.tjkku7hdqf67awuq@pengutronix.de> References: <20181108164748.31222-1-brgl@bgdev.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20181108164748.31222-1-brgl@bgdev.pl> User-Agent: NeoMutt/20170113 (1.7.2) X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::c0 X-SA-Exim-Mail-From: ukl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello Bartosz, On Thu, Nov 08, 2018 at 05:47:48PM +0100, Bartosz Golaszewski wrote: > Two threads can try to fire the irq_sim with different offsets and will > end up fighting for the irq_work asignment. To fix it: add a mutex and > lock it before firing. > > Suggested-by: Uwe Kleine-König > Signed-off-by: Bartosz Golaszewski > --- > include/linux/irq_sim.h | 1 + > kernel/irq/irq_sim.c | 5 +++++ > 2 files changed, 6 insertions(+) > > diff --git a/include/linux/irq_sim.h b/include/linux/irq_sim.h > index 630a57e55db6..676bfa0c12b9 100644 > --- a/include/linux/irq_sim.h > +++ b/include/linux/irq_sim.h > @@ -29,6 +29,7 @@ struct irq_sim { > int irq_base; > unsigned int irq_count; > struct irq_sim_irq_ctx *irqs; > + struct mutex lock; > }; > > int irq_sim_init(struct irq_sim *sim, unsigned int num_irqs); > diff --git a/kernel/irq/irq_sim.c b/kernel/irq/irq_sim.c > index dd20d0d528d4..2f06c24b51a0 100644 > --- a/kernel/irq/irq_sim.c > +++ b/kernel/irq/irq_sim.c > @@ -74,6 +74,7 @@ int irq_sim_init(struct irq_sim *sim, unsigned int num_irqs) > } > > init_irq_work(&sim->work_ctx.work, irq_sim_handle_irq); > + mutex_init(&sim->lock); > sim->irq_count = num_irqs; > > return sim->irq_base; > @@ -142,10 +143,14 @@ EXPORT_SYMBOL_GPL(devm_irq_sim_init); > */ > void irq_sim_fire(struct irq_sim *sim, unsigned int offset) > { > + mutex_lock(&sim->lock); > + > if (sim->irqs[offset].enabled) { > sim->work_ctx.irq = irq_sim_irqnum(sim, offset); > irq_work_queue(&sim->work_ctx.work); > } > + > + mutex_unlock(&sim->lock); This doesn't fix the issue I think. irq_work_queue() only schedules the work function. If after irq_sim_fire() returned but before the worker runs another irq_sim_fire() is issued the value is still overwritten. Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ |