Received: by 10.223.185.116 with SMTP id b49csp1015765wrg; Fri, 16 Feb 2018 10:51:54 -0800 (PST) X-Google-Smtp-Source: AH8x224VAyaG03APSL4qJOqNHtm0qKjHGYrs+vJS4pdA87nq2h2C2Rk524ZmXBUgjDhHNoEb5smW X-Received: by 2002:a17:902:7614:: with SMTP id k20-v6mr6672760pll.343.1518807114180; Fri, 16 Feb 2018 10:51:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518807114; cv=none; d=google.com; s=arc-20160816; b=nRVRSLwN/CMB81QY3HSwSbIYohw6ZPd3iAm0abY/t8XVSHM2oFhqyQpJfdFIfbOdxn gBSuQcjN722B5PMdrGUR9KDSakLJuwVYs7R9FRWGuaor2ew1NzRB7D/q4WF810zafarp 95MbbHOWvXToRtlrklspN5VihJb10IX98Rs9rwKEc1pApL56fTcL/SmCtqDSXbmAPdD4 x4qnZPbjyDzRNPw8VeyxwaiDw3Y8ZRFweqMzszQPfDegMd68zOTX0ZLMUguRWOzYVJ3r 5igc4iZ0qeG/X95c4UnPyPv4Ek2PaokbCAoWW08NTEbFW7eUSBAaHNf42ZCkAK6zXnRe TnhQ== 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-transfer-encoding:content-disposition:mime-version :references:message-id:subject:cc:to:from:date :arc-authentication-results; bh=NpcjUqRpLudNR7JE6en4BXyQ+5w5DnG1NApeObTqfTI=; b=OHAJCF3KqeNf/09H8nOE77oTTHWGqBm7syKCeIt5vhO3ps6m0bRxF7KKtt87KHQ6QZ JJXHxbVHQusi/jqKbAKInqdjxE/x8WIOwvvmyQQ14sq7H/OPNRFr/91avP96LKnXjx7o pg/R5bIgokdCwINJoRXa4ruPjKTEhQ7sTHZc5mw9PsjljLWCXTKLCRuBUOKd5pcGq5Y4 d9O5MRKhKQ4CZT9/wd/BT41VHjItEEc0Nh8meajy0Qp/wCEgXhWSqSqzCIMwHx/y6qJl 1oj5x31DjvZQMQQen8dKlwPTMI5/lIDaMmag1B3WPpYOZ7KhOF2P5EQ0fs+kjUjsziT8 ep/g== ARC-Authentication-Results: i=1; mx.google.com; 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 n7si4326175pga.670.2018.02.16.10.51.39; Fri, 16 Feb 2018 10:51:54 -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; 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 S1755301AbeBPIxJ convert rfc822-to-8bit (ORCPT + 99 others); Fri, 16 Feb 2018 03:53:09 -0500 Received: from Galois.linutronix.de ([146.0.238.70]:55689 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755229AbeBPIxI (ORCPT ); Fri, 16 Feb 2018 03:53:08 -0500 Received: from bigeasy by Galois.linutronix.de with local (Exim 4.80) (envelope-from ) id 1embiE-0006JB-QH; Fri, 16 Feb 2018 09:49:46 +0100 Date: Fri, 16 Feb 2018 09:53:03 +0100 From: Sebastian Andrzej Siewior To: Steven Rostedt Cc: 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: <20180216085302.ptzq5yspmdq3zlh6@linutronix.de> 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=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8BIT In-Reply-To: <20180215150707.49cc2332@gandalf.local.home> User-Agent: NeoMutt/20171215 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2018-02-15 15:07:07 [-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. correct but… > > 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. That __tasklet_schedule_common() part is usually invoked from an interrupt context which attempts to schedule the tasklet so it should with invoked with interrupts off. However there was one warn_on() because something early in the boot managed to invoke it without interrupts disabled (which I missed). Okay, granted, fixed. As for the second invocation (tasklet_action_common() part) is always invoked in BH-disabled context (even if called from ksoftirqd) so you are never preemptible() and can't switch CPUs. So I am going to correct this patch as you suggested but I don't see the reason to do the same in the second one. > -- Steve Sebastian