Received: by 10.223.148.5 with SMTP id 5csp6208960wrq; Wed, 17 Jan 2018 10:42:46 -0800 (PST) X-Google-Smtp-Source: ACJfBouKKoon0HfFCkibVYa8Gv3AvWnL6xwM3GJZmHipagZK1k0CHlSz0co4vkZ1vi7+QvKTZd7b X-Received: by 10.84.253.2 with SMTP id z2mr13825934pll.253.1516214566065; Wed, 17 Jan 2018 10:42:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516214566; cv=none; d=google.com; s=arc-20160816; b=O/ZuifkyW4ysfzheRtQxV/tB3gl9S4k4RH8VhmP7jrucSsm/52+J19wqtpvbgNxAg0 hgi+tnZ4RMpQLLwNG/Te9zV+6XJIc/wuQ4fCioI7ex6kXTgG0jmOYdH5dSm42D49gN3a vguUlfGiKGAV/ne/yOT4ka/GamZKAevHCKQhq6KYmk6dLIz7eolvk+9n+tG3dlt40rTj JwTxckqX+o0gkOcu07jbFHyKT2UBC1Tz4HJMMY4FsvlvIatNryQmzuwxVGarljNL3GMD yLjwJNVX4MV0YfXmIf8WCyuOXEpCHy0avuaTLEFt9HtjpnrIqvv5C3aXOjm1Pqt5eX3P AZLg== 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 :references:in-reply-to:message-id:subject:cc:to:from:date :dmarc-filter:arc-authentication-results; bh=KVhEr3ktmczIBvBiAc2vAO2Vq4V0zf64PaSrtAEJPeI=; b=FpoNDr8ihCjyZl7zu9rPiUi9s62vkgxyCuXz14WB3CRqdUZAOMquB4Nb7sw/20be9z dLXpgHvZRDFZLOaxuemxFIpvVqK+yW48oW3PaLMVEdO3DaceAwRywykRnUhdkLr0CzEj l3gj1RrfHY2HhbH9UOIY0goujmcmrIurDAY6clSgBplrpRhpeCLLZmYSHuMOjOOrMMEQ 1nZm7MZzq5TOXcXQtlG+07CRrErmxpKeZNdUrlPOGj+VFqgIQvOM/jP7Rd337NaQD/dx cWkEWN8VHMrAOJoLUOlErv/90v8XQykjxa9/30MtsTVCOZRhmwo0BQJ/Rj1NukLmjbQ5 WOGw== 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 l7si4331295pgn.307.2018.01.17.10.42.31; Wed, 17 Jan 2018 10:42:46 -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 S1754217AbeAQSmH (ORCPT + 99 others); Wed, 17 Jan 2018 13:42:07 -0500 Received: from mail.kernel.org ([198.145.29.99]:33662 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752268AbeAQSmF (ORCPT ); Wed, 17 Jan 2018 13:42:05 -0500 Received: from gandalf.local.home (cpe-172-100-180-131.stny.res.rr.com [172.100.180.131]) (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 6F16E21720; Wed, 17 Jan 2018 18:42:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6F16E21720 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=goodmis.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=rostedt@goodmis.org Date: Wed, 17 Jan 2018 13:42:01 -0500 From: Steven Rostedt To: Tejun Heo Cc: Petr Mladek , Sergey Senozhatsky , Sergey Senozhatsky , akpm@linux-foundation.org, linux-mm@kvack.org, Cong Wang , Dave Hansen , Johannes Weiner , Mel Gorman , Michal Hocko , Vlastimil Babka , Peter Zijlstra , Linus Torvalds , Jan Kara , Mathieu Desnoyers , Tetsuo Handa , rostedt@home.goodmis.org, Byungchul Park , Pavel Machek , linux-kernel@vger.kernel.org Subject: Re: [PATCH v5 0/2] printk: Console owner and waiter logic cleanup Message-ID: <20180117134201.0a9cbbbf@gandalf.local.home> In-Reply-To: <20180117121251.7283a56e@gandalf.local.home> References: <20180110140547.GZ3668920@devbig577.frc2.facebook.com> <20180110130517.6ff91716@vmware.local.home> <20180111045817.GA494@jagdpanzerIV> <20180111093435.GA24497@linux.suse> <20180111103845.GB477@jagdpanzerIV> <20180111112908.50de440a@vmware.local.home> <20180111203057.5b1a8f8f@gandalf.local.home> <20180111215547.2f66a23a@gandalf.local.home> <20180116194456.GS3460072@devbig577.frc2.facebook.com> <20180117091208.ezvuhumnsarz5thh@pathway.suse.cz> <20180117151509.GT3460072@devbig577.frc2.facebook.com> <20180117121251.7283a56e@gandalf.local.home> X-Mailer: Claws Mail 3.14.0 (GTK+ 2.24.31; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 17 Jan 2018 12:12:51 -0500 Steven Rostedt wrote: > @@ -2393,15 +2451,20 @@ void console_unlock(void) > * waiter waiting to take over. > */ > console_lock_spinning_enable(); > + offload = recursion_check_start(); > > stop_critical_timings(); /* don't trace print latency */ > call_console_drivers(ext_text, ext_len, text, len); > start_critical_timings(); > > + recursion_check_finish(offload); > + > if (console_lock_spinning_disable_and_check()) { > printk_safe_exit_irqrestore(flags); > return; > } > + if (offload) > + kick_offload_thread(); > Ah, major flaw in this code. The recursion check needs to be in printk() itself around the trylock. -- Steve diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 9cb943c90d98..31df145cc4d7 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -1826,6 +1826,63 @@ static size_t log_output(int facility, int level, enum log_flags lflags, const c /* Store it in the record log */ return log_store(facility, level, lflags, 0, dict, dictlen, text, text_len); } +/* + * Used for which context the printk is in. + * NMI = 0 + * IRQ = 1 + * SOFTIRQ = 2 + * NORMAL = 3 + * + * Stack ordered, where the lower number can preempt + * the higher number: mask &= mask - 1, will only clear + * the lowerest set bit. + */ +enum { + CTX_NMI, + CTX_IRQ, + CTX_SOFTIRQ, + CTX_NORMAL, +}; + +static DEFINE_PER_CPU(int, recursion_bits); + +static bool recursion_check_start(void) +{ + unsigned long pc = preempt_count(); + int val = this_cpu_read(recursion_bits); + + if (!(pc & (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET))) + bit = CTX_NORMAL; + else + bit = pc & NMI_MASK ? CTX_NMI : + pc & HARDIRQ_MASK ? CTX_IRQ : CTX_SOFTIRQ; + + if (unlikely(val & (1 << bit))) + return true; + + val |= (1 << bit); + this_cpu_write(recursion_bits, val); + return false; +} + +static void recursion_check_finish(bool offload) +{ + int val = this_cpu_read(recursion_bits); + + if (offload) + return; + + val &= val - 1; + this_cpu_write(recursion_bits, val); +} + +static void kick_offload_thread(void) +{ + /* + * Consoles are triggering printks, offload the printks + * to another CPU to hopefully avoid a lockup. + */ +} asmlinkage int vprintk_emit(int facility, int level, const char *dict, size_t dictlen, @@ -1895,12 +1952,14 @@ asmlinkage int vprintk_emit(int facility, int level, /* If called from the scheduler, we can not call up(). */ if (!in_sched) { + bool offload; /* * Disable preemption to avoid being preempted while holding * console_sem which would prevent anyone from printing to * console */ preempt_disable(); + offload = recursion_check_start(); /* * Try to acquire and then immediately release the console * semaphore. The release will print out buffers and wake up @@ -1908,7 +1967,12 @@ asmlinkage int vprintk_emit(int facility, int level, */ if (console_trylock_spinning()) console_unlock(); + + recursion_check_finish(offload); preempt_enable(); + + if (offload) + kick_offload_thread(); } return printed_len;