Received: by 10.223.185.116 with SMTP id b49csp810713wrg; Fri, 16 Feb 2018 07:33:38 -0800 (PST) X-Google-Smtp-Source: AH8x226QdEAdPwCZ33dXyTpiZ1/ZB9rzVjqAU1ejbniUYvv0JXJgixzRohu2fvGp1y3fw0fX7xIg X-Received: by 10.99.110.199 with SMTP id j190mr4943626pgc.404.1518795217922; Fri, 16 Feb 2018 07:33:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518795217; cv=none; d=google.com; s=arc-20160816; b=YzndzMbGUIM3fwag/O0LZKdIOBGDspI2BW7Qsdba28rT5iClaQBoOjhhIVB+zpmlu0 lGcMgSmFgh8hPU96GAfZi0xutlhYrc3pXsZAMMkB0h/YEW9S0W1k/hvTUdxo5eJjuo1I RkIhiUXhBsL6BQm1Y8lqT6xALGaNdTkDBbTga+tMN8cv56IeKKI2dvRVVztN3H6GEVek 38BGxzO/H8VEFx32YMFIhRSNRcJNhSbnxedaK199XJNyRm+W/ett8oogac4vpixgu6Ww rirkQ9GwOc9TrDkphl0Av4C1Mfge4PR3De/hoQ1VMYH7zdnK5mZOMpPiM6vnqRC1+fVn OnIQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=2uLe8tZnleqTHjaIe66dVJW1tDYnWbpxM0Bm1utMMIo=; b=zAu7vvI2Kyede+IIi2KOjIBcMhg3D69fXBbBCKQ6sg0Z+DMEkBWGZKbyYVgHkuc3yB I6m2QZUDxNEQvKmceWzETu/JXwBbeR4u4cIOKIggxLSY3r9pBPPMYFtsWxo7w4HuiPOi AnYnGpX+kClasAj1A8NI3ixHB3JO1cSRExjhcBtUncECwH5nhyvJFARhquDsUrEbR7nS M7/j2/9KDASdK1itxEiufySm1uOFJV428V0L9XI9Wm8gPadhSOBa+969rt7trtSrGDr6 Y8qHlnU9xs22VBj+9KgPTt485VuSNYb/O+sOf519ZyTFRnJ70t2PYT0dAaIXCSeZVUWk CC0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@eso.teric.us header.s=mail header.b=LUAcikYk; 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 97-v6si1592168plm.149.2018.02.16.07.33.23; Fri, 16 Feb 2018 07:33:37 -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=@eso.teric.us header.s=mail header.b=LUAcikYk; 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 S1756230AbeBOWbZ (ORCPT + 99 others); Thu, 15 Feb 2018 17:31:25 -0500 Received: from eso.teric.us ([69.164.192.171]:60378 "EHLO eso.teric.us" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756203AbeBOWbX (ORCPT ); Thu, 15 Feb 2018 17:31:23 -0500 Received: from neo.teric.us (neo.teric.us [198.58.100.135]) by eso.teric.us (Postfix) with ESMTPS id 5EC681036F; Thu, 15 Feb 2018 16:31:23 -0600 (CST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eso.teric.us; s=mail; t=1518733883; bh=2uLe8tZnleqTHjaIe66dVJW1tDYnWbpxM0Bm1utMMIo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=LUAcikYk0zcZEmS/0e6An6Td6t8IPVmmE2qVDlHSYY5rPtF+WFhw9vwijrjQauhPa +DDwgsfOCl+LWfOMHW0WtT4QbnOYGNDc0vC6Uqk1FMANJA7s71EHrFWDL+DDeLeWDj 7HpPiYf7ExJMkaUyTwsVoUYdRecZylmg/G/rQCDKZ2qe8o/svdtQfetIQllograSuH hjtQK8jaYpIsOL2NmvRi7ash9jirs4oREp08Mb+j9OaK8ft6t0BmNRv0QDCokqbkfo oVTKnNOXDUWgOD4vb9WRYamXWgfxJWcDXm58un8HHITnGK/zqTNTuAhM3bqkdLqSEc PZHDIAV2I6ySw== Received: by neo.teric.us (Postfix, from userid 1002) id 34F01185FDB; Thu, 15 Feb 2018 16:31:23 -0600 (CST) Date: Thu, 15 Feb 2018 16:31:23 -0600 From: Julia Cartwright To: Steven Rostedt Cc: Sebastian Andrzej Siewior , mingo@kernel.org, linux-kernel@vger.kernel.org, tglx@linutronix.de, Ingo Molnar Subject: Re: [PATCH 1/2] kernel/sofirq: consolidate common code in __tasklet_schedule() + _hi_ Message-ID: <20180215223123.GB1924@kryptos.localdomain> References: <20180215172042.31573-1-bigeasy@linutronix.de> <20180215172042.31573-2-bigeasy@linutronix.de> <20180215150707.49cc2332@gandalf.local.home> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180215150707.49cc2332@gandalf.local.home> User-Agent: Mutt/1.8.3 (2017-05-23) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Feb 15, 2018 at 03:07:07PM -0500, Steven Rostedt wrote: > On Thu, 15 Feb 2018 18:20:41 +0100 > Sebastian Andrzej Siewior wrote: > > > -void __tasklet_schedule(struct tasklet_struct *t) > > +static void __tasklet_schedule_common(struct tasklet_struct *t, > > + struct tasklet_head *head, > > + unsigned int softirq_nr) > > { > > unsigned long flags; > > > > local_irq_save(flags); > > If you look at the original patch, it did not move local_irq_save() > into the common function. > > > t->next = NULL; > > - *__this_cpu_read(tasklet_vec.tail) = t; > > - __this_cpu_write(tasklet_vec.tail, &(t->next)); > > - raise_softirq_irqoff(TASKLET_SOFTIRQ); > > + *head->tail = t; > > + head->tail = &(t->next); > > + raise_softirq_irqoff(softirq_nr); > > local_irq_restore(flags); > > } > > + > > +void __tasklet_schedule(struct tasklet_struct *t) > > +{ > > + __tasklet_schedule_common(t, this_cpu_ptr(&tasklet_vec), > > What can happen is, we reference (tasklet_vec) on one CPU, get > preempted (running in ksoftirqd), scheduled on another CPU, then when > inside the common code, we are executing on a different CPU than the > tasklet is for. The rasise_softirq() is happening on the wrong CPU. > > The local_irq_save() can't be moved to the common function. It must be > done by each individual function. Well, it can be, but the percpu access needs to go with it; so an alternative solution would be the below. I'm also wondering whether the t->next = NULL assignment could be lifted out from irqs-disabled region. Julia diff --git a/kernel/softirq.c b/kernel/softirq.c index fa7ed89a9fcf..177de3640c78 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -461,12 +461,14 @@ static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec); static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec); static void __tasklet_schedule_common(struct tasklet_struct *t, - struct tasklet_head *head, + struct tasklet_head __percpu *headp, unsigned int softirq_nr) { + struct tasklet_head *head; unsigned long flags; local_irq_save(flags); + head = this_cpu_ptr(headp); t->next = NULL; *head->tail = t; head->tail = &(t->next); @@ -476,14 +478,14 @@ static void __tasklet_schedule_common(struct tasklet_struct *t, void __tasklet_schedule(struct tasklet_struct *t) { - __tasklet_schedule_common(t, this_cpu_ptr(&tasklet_vec), + __tasklet_schedule_common(t, &tasklet_vec, TASKLET_SOFTIRQ); } EXPORT_SYMBOL(__tasklet_schedule); void __tasklet_hi_schedule(struct tasklet_struct *t) { - __tasklet_schedule_common(t, this_cpu_ptr(&tasklet_hi_vec), + __tasklet_schedule_common(t, &tasklet_hi_vec, HI_SOFTIRQ); } EXPORT_SYMBOL(__tasklet_hi_schedule);