From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932387AbbJMVt5 (ORCPT ); Tue, 13 Oct 2015 17:49:57 -0400 Received: from mail-yk0-f169.google.com ([209.85.160.169]:36226 "EHLO mail-yk0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932069AbbJMVtz (ORCPT ); Tue, 13 Oct 2015 17:49:55 -0400 Date: Tue, 13 Oct 2015 17:49:52 -0400 From: Tejun Heo To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Lai Jiangshan , Shaohua Li Subject: [GIT PULL] workqueue fixes for v4.3-rc5 Message-ID: <20151013214952.GB23106@mtj.duckdns.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello, Linus. Single patch to fix delayed work being queued on the wrong CPU. This has been broken forever (v2.6.31+) but obviously doesn't trigger in most configurations. Thanks. The following changes since commit 9ffecb10283508260936b96022d4ee43a7798b4c: Linux 4.3-rc3 (2015-09-27 07:50:08 -0400) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git for-4.3-fixes for you to fetch changes up to 874bbfe600a660cba9c776b3957b1ce393151b76: workqueue: make sure delayed work run in local cpu (2015-09-30 13:06:46 -0400) ---------------------------------------------------------------- Shaohua Li (1): workqueue: make sure delayed work run in local cpu kernel/workqueue.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/workqueue.c b/kernel/workqueue.c index ca71582..bcb14ca 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1458,13 +1458,13 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq, timer_stats_timer_set_start_info(&dwork->timer); dwork->wq = wq; + /* timer isn't guaranteed to run in this cpu, record earlier */ + if (cpu == WORK_CPU_UNBOUND) + cpu = raw_smp_processor_id(); dwork->cpu = cpu; timer->expires = jiffies + delay; - if (unlikely(cpu != WORK_CPU_UNBOUND)) - add_timer_on(timer, cpu); - else - add_timer(timer); + add_timer_on(timer, cpu); } /**