Received: by 10.192.165.148 with SMTP id m20csp3885029imm; Mon, 30 Apr 2018 08:01:51 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpvPw3tF5vcRcdmqm5RecqBCz5ZFDxRqEJ5TzrmBP/i8r0ju/LoGRnz6JCMTeKEwEM9fSE2 X-Received: by 10.98.69.137 with SMTP id n9mr11112029pfi.158.1525100511825; Mon, 30 Apr 2018 08:01:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525100511; cv=none; d=google.com; s=arc-20160816; b=l3orEPplAs0vryymHqgYWeqRLbxvH7N5zf3DzzevznG6tbYA7fxKdGUSdNwtu3GrPI 65pcgFhmy02sQg5GqgrLtmesEB8tQSsZMbk5WsmCBSMOJ0NQMkKSmGbI86ZtjSRh+Fo9 MPb8fLVRfkX/p+ug+ZkRffD3K+HxJMr3uJGqTJTIDNvhsUmgvxjVJUE2+k7lPBQMd6cA Tb64mlZdT1Nmo+norCBPAk6Ze8wfO/rFZg2slw7S4CjbFUMrqUwJSwEAoh/QireLUFji 0N9xL5wAt3LDFdpZFXG/+4HtK7Fx3SfGseXPX3krBdbCjmZhHa6QmsOtVtx5v9/6bn1Y dOgQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=sd88prHf5rtLnyO68gtc/59LXDPfxF6onmPanQ5rfZY=; b=kXoETbgEzTqZbNSbR7zYqLRYOFOX8zuyi57dTIDBCTOcthYFayDBpmKmtb0Ni9ozil bKdTuC10ih85ytHyzuI0frNkPUbga+h5xKLdNHON+uMC22EruVCguL9aFnf1bgJ+0uV4 6VsqrHHmGQqTP983UekKeIk0DT6dIifB/5wDca2BkYkxmm1SnNNu7lRgnTKYu3URIG6T fJKm3IDgWa4SLUTmv53YnZm6KvBjpZDpzFiIMjlxswuUNM5t2TWGMeDH0UJvghF83Y3M yPtPR43RBuTeQbnsytZ9y9LvnfJC8Q5svKU88++o8B3zngBja38eZcMnJm+IvYnUu1+q TzYQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=c4GeRREG; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k10-v6si6263346pgo.23.2018.04.30.08.01.36; Mon, 30 Apr 2018 08:01:51 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=c4GeRREG; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754724AbeD3O7h (ORCPT + 99 others); Mon, 30 Apr 2018 10:59:37 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:37980 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754503AbeD3O4R (ORCPT ); Mon, 30 Apr 2018 10:56:17 -0400 Received: by mail-pf0-f195.google.com with SMTP id o76so6928684pfi.5 for ; Mon, 30 Apr 2018 07:56:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sd88prHf5rtLnyO68gtc/59LXDPfxF6onmPanQ5rfZY=; b=c4GeRREGs7RxDuGSF6vEGLkMsMil9onAACkx5E1FWw03W1GAr5Z/I6oscBfR+Pzz3+ W2BRBBPVqKMW5Z2PfoUmZMK+Q8j48yfdi1MThYq2pPf82kfCF7Yjj0mwk5DkEhi5hYNG 7HSkwiRD9Ax/g7PB5PSNGZeDoywOpk/5iwgxqvG3bEM1xNKYfgCYRe7p3xzxsroI4Ie+ irbCvCuVds9ZEzcDrM26biKUriETUSpT9UNnibCGFUtZX+Tefyg+X/aI662PLO/LfATj JJg+SXl3BekzXGJnDIn1iPxJI7WiqW2Wc5HGQRMSPunK3hNlAUahMDA8oQljnkQRusqj 8SgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sd88prHf5rtLnyO68gtc/59LXDPfxF6onmPanQ5rfZY=; b=o8ZqzERfqzGSqhoYAKq3S2iU0vQ3ZjBoAGdp2zLeiGTYShCL4tmnoF0fjEdQ/z4hJH T3/7pxp//EU/RXnKdGvzZT6o2EVmtvFwmNGH3NelnuaucOdMQRb2zZbig+dQBKh7nSH9 nYEg4MCg7btWwnO0Yx7dLb/maHBlGC6WT5mi6NMeVuNZf/MxN53FInZNkeIPHvO0o4Cv iSigfZuGr4CV0g7fvIkhKFfZavrW8a9g20NzTKTRFcli5nCe88IqiUaZ/RgEvyQDReU1 g5APn4vgApc5Xydg6/WBe7FIQjfQGEsZrGWdc/CNsh4Kj2JUuMYxtm7NX3FeM7WbVceg P4Lw== X-Gm-Message-State: ALQs6tCxBOBpnnvn4LQqwS9/NNT3W8NrqbaDHagiftb28+jFj0GTuOU2 EM8vjKPWQG2T5C1wPawRm60yPQ== X-Received: by 2002:a17:902:d882:: with SMTP id b2-v6mr12631446plz.381.1525100176384; Mon, 30 Apr 2018 07:56:16 -0700 (PDT) Received: from roar.au.ibm.com (59-102-70-78.tpgi.com.au. [59.102.70.78]) by smtp.gmail.com with ESMTPSA id a12sm19132534pfe.78.2018.04.30.07.56.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 30 Apr 2018 07:56:15 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Cc: Nicholas Piggin , Benjamin Herrenschmidt , Greg Kroah-Hartman , Jiri Slaby , linux-kernel@vger.kernel.org Subject: [PATCH 02/15] powerpc/powernv: Fix OPAL console driver OPAL_BUSY loops Date: Tue, 1 May 2018 00:55:45 +1000 Message-Id: <20180430145558.4308-3-npiggin@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180430145558.4308-1-npiggin@gmail.com> References: <20180430145558.4308-1-npiggin@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The OPAL console driver does not delay in case it gets OPAL_BUSY or OPAL_BUSY_EVENT from firmware. It can't yet be made to sleep because it is called under spinlock, but it can be changed to the standard OPAL_BUSY loop form, and a delay added to keep it from hitting the firmware too frequently. Cc: Benjamin Herrenschmidt Signed-off-by: Nicholas Piggin --- arch/powerpc/platforms/powernv/opal.c | 38 ++++++++++++++++----------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index e695b836fd49..6b621d47ac29 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -378,33 +378,41 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) /* We still try to handle partial completions, though they * should no longer happen. */ - rc = OPAL_BUSY; - while(total_len > 0 && (rc == OPAL_BUSY || - rc == OPAL_BUSY_EVENT || rc == OPAL_SUCCESS)) { + + while (total_len > 0) { olen = cpu_to_be64(total_len); - rc = opal_console_write(vtermno, &olen, data); + + rc = OPAL_BUSY; + while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { + rc = opal_console_write(vtermno, &olen, data); + if (rc == OPAL_BUSY_EVENT) { + mdelay(OPAL_BUSY_DELAY_MS); + opal_poll_events(NULL); + } else if (rc == OPAL_BUSY) { + mdelay(OPAL_BUSY_DELAY_MS); + } + } + len = be64_to_cpu(olen); /* Closed or other error drop */ - if (rc != OPAL_SUCCESS && rc != OPAL_BUSY && - rc != OPAL_BUSY_EVENT) { - written += total_len; + if (rc != OPAL_SUCCESS) { + written += total_len; /* drop remaining chars */ break; } - if (rc == OPAL_SUCCESS) { - total_len -= len; - data += len; - written += len; - } + + total_len -= len; + data += len; + written += len; + /* This is a bit nasty but we need that for the console to * flush when there aren't any interrupts. We will clean * things a bit later to limit that to synchronous path * such as the kernel console and xmon/udbg */ - do + do { opal_poll_events(&evt); - while(rc == OPAL_SUCCESS && - (be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_OUTPUT)); + } while (be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_OUTPUT); } spin_unlock_irqrestore(&opal_write_lock, flags); return written; -- 2.17.0