Received: by 10.192.165.148 with SMTP id m20csp3883820imm; Mon, 30 Apr 2018 08:01:05 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrfMSI6eZ7Ge8b6WTYAARkf5OOvYhczxC1oda/hJxF/3lgvuDD7IphpnJ+DbP/fEkWXlamf X-Received: by 2002:a17:902:624:: with SMTP id 33-v6mr12788000plg.361.1525100465448; Mon, 30 Apr 2018 08:01:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525100465; cv=none; d=google.com; s=arc-20160816; b=UHRUIMJEj1BNuYTyymMZktRU7QSC236k/X4VdRKKE4kI2yuOuI1HBiByksVMofDzfY 43sXgGFCyUzIPKAsVyCLHPK+wMXD+BNmpc0YaNuKJ5Zm42ePNQsrtA4RhZag6GX5Elqh 0Zad/YAm7Vt11YAZxBAQGnyBkCzXQ70v89ECsRFtzPVhdV3G2AMBWEcu+B1+IY3r7TiD Eb/XOBoGBOe1rsHUvUohZD7Wle1SK9Zh+uMEhY6EodhY+zY9CTcJeE8fnzWg/zdMub8N S0JNVcYCngtTbSAVf+g/bg9AHFe98z/4eMNIY+hIw3NYG8yoAAurM7dRDWhQeLIEKcID 6Wvw== 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=SvWggEvXFINj4TyAf7RlNRk9htPQfKrW9/6sSoqyrXQ=; b=I6mr2Svo+kd0HSAIf63EnSxljyZBC3cFOP19ZQOvD3XnnrcInHw3Sp/u7acY/Nq1Xx h6IrrikMLFt6WEhUi0423psUcQ7H5Nq0HWfsPEOiS7sJ181ZNpfRcYGCdsCirXMAXO6H 0VUzZjXkK2PNF0EQ3aaDUkCkWEJCyvi5MVuJnDgAuzvURuNjlfl+8V9+vHNBFyAy2up/ KX7YqmtdGMC3qQH9+hx2ZDia/fB81oEe2AJxjaZ/AJrgvVuRl2k9DBYMzAvaQV39buVk zn0mv3471H2nm0b8eV6PCBVjqCKNInU0kX4UyYK3WUi5h2HXwxrj6zQs8twNRxOMPSnh xzMg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=O4NyOF+h; 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 1-v6si7564229plw.519.2018.04.30.08.00.46; Mon, 30 Apr 2018 08:01:05 -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=O4NyOF+h; 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 S1754640AbeD3O4f (ORCPT + 99 others); Mon, 30 Apr 2018 10:56:35 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:35001 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754625AbeD3O4c (ORCPT ); Mon, 30 Apr 2018 10:56:32 -0400 Received: by mail-pf0-f194.google.com with SMTP id j5so6938804pfh.2 for ; Mon, 30 Apr 2018 07:56:32 -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=SvWggEvXFINj4TyAf7RlNRk9htPQfKrW9/6sSoqyrXQ=; b=O4NyOF+hsZ/y4UQFWpC2/h5Gdq7/7G2fstieVAKM0srr4LG1h2aqzdexfRnIlLwXYD MYt3fKA1D3Gd+bbKWi+zTBx71TQXSGSC/XYXayDXX+jDcZCGzFo9ATnEGeSP1v4QssTA 61FV9pxm5CBOEeQUwenA8Qs8xSqauChslAkdy9UWHI9TnZzwVH15ctGnIVsQgIwfSxTC 3t7sF9nP6WUXblxRBHKhogZXXkw6z9UIVG0beHxjoGn9fe1d0DPSWfBGmDxlzAG+HQv6 CusN61MsuvyI2HJrUXHpvwL6cXfdvXWAaPi9UREei6wshdFPzY//KhRBJO8P1/YbypBx l9kg== 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=SvWggEvXFINj4TyAf7RlNRk9htPQfKrW9/6sSoqyrXQ=; b=OOWPpbgJWFzuQWmG4qU5DUCJhZ2g3HVFE4XZ6CqtS+kZadPtW4eZMtMZP0QXeO2FS7 0oaZk0g8yP3f1FlJMaclch7q8jCc6ow8kllWQXC8E5ytCsSBCMQNtfBRMWcBvanPnEp4 qZmt+BNOEth03Xbfy+H8w/55ux2HE6i2ViYb0jOiE/JqjCw0f91FLUDNlzi2jZ/yzNTn p/TVaYx4/adH0Aw1x1bddC3XaEJLF4aRRa/MEsXdx9p/wVfRLjSV8W268IqBXVIOZDrO i5Xi9ZdzogLBATrp/sSUnikKGe1dTBeZKa1OfMTrbJxlGBRn9WGjlVdH0K9D7JJrU4Sg eqRA== X-Gm-Message-State: ALQs6tBdUkdkHbeQiA07Jt6JidI4YUdxNkxag//+PWdBqoTHStZI02iA ctrTXbVeSq4vKAHo0pRY1cY= X-Received: by 10.98.251.20 with SMTP id x20mr12334994pfm.48.1525100191740; Mon, 30 Apr 2018 07:56:31 -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.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 30 Apr 2018 07:56:30 -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 06/15] powerpc/powernv: Remove OPALv1 support from opal console driver Date: Tue, 1 May 2018 00:55:49 +1000 Message-Id: <20180430145558.4308-7-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 opal_put_chars deals with partial writes because in OPALv1, opal_console_write_buffer_space did not work correctly. That firmware is not supported. This reworks the opal_put_chars code to no longer deal with partial writes by turning them into full writes. Partial write handling is still supported in terms of what gets returned to the caller, but it may not go to the console atomically. A warning message is printed in this case. This allows console flushing to be moved out of the opal_write_lock spinlock. That could cause the lock to be held for long periods if the console is busy (especially if it was being spammed by firmware), which is dangerous because the lock is taken by xmon to debug the system. Flushing outside the lock improves the situation a bit. Cc: Benjamin Herrenschmidt Signed-off-by: Nicholas Piggin --- arch/powerpc/platforms/powernv/opal.c | 86 +++++++++++++-------------- 1 file changed, 40 insertions(+), 46 deletions(-) diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 6640fccbf30c..0ddb63226695 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -346,10 +346,10 @@ int opal_get_chars(uint32_t vtermno, char *buf, int count) int opal_put_chars(uint32_t vtermno, const char *data, int total_len) { - int written = 0; - __be64 olen; - s64 len, rc; unsigned long flags; + int written; + __be64 olen; + s64 rc; if (!opal.entry) return -ENODEV; @@ -357,62 +357,56 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len) /* We want put_chars to be atomic to avoid mangling of hvsi * packets. To do that, we first test for room and return * -EAGAIN if there isn't enough. - * - * Unfortunately, opal_console_write_buffer_space() doesn't - * appear to work on opal v1, so we just assume there is - * enough room and be done with it */ spin_lock_irqsave(&opal_write_lock, flags); rc = opal_console_write_buffer_space(vtermno, &olen); - len = be64_to_cpu(olen); - if (rc || len < total_len) { - spin_unlock_irqrestore(&opal_write_lock, flags); + if (rc || be64_to_cpu(olen) < total_len) { /* Closed -> drop characters */ if (rc) - return total_len; - opal_flush_console(vtermno); - return -EAGAIN; + written = total_len; + else + written = -EAGAIN; + goto out; } - /* We still try to handle partial completions, though they - * should no longer happen. - */ - - while (total_len > 0) { - olen = cpu_to_be64(total_len); - - 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) { - written += total_len; /* drop remaining chars */ - break; + /* Should not get a partial write here because space is available. */ + olen = cpu_to_be64(total_len); + rc = opal_console_write(vtermno, &olen, data); + if (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { + if (rc == OPAL_BUSY_EVENT) { + mdelay(OPAL_BUSY_DELAY_MS); + opal_poll_events(NULL); + } else if (rc == OPAL_BUSY_EVENT) { + mdelay(OPAL_BUSY_DELAY_MS); } + written = -EAGAIN; + goto out; + } - total_len -= len; - data += len; - written += len; + /* Closed or other error drop */ + if (rc != OPAL_SUCCESS) { + written = opal_error_code(rc); + goto out; + } - /* 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 - */ - opal_flush_console(vtermno); + written = be64_to_cpu(olen); + if (written < total_len) { + /* Should not happen */ + pr_warn("atomic console write returned partial len=%d written=%d\n", total_len, written); + if (!written) + written = -EAGAIN; } + +out: spin_unlock_irqrestore(&opal_write_lock, flags); + /* 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 + */ + opal_flush_console(vtermno); + return written; } -- 2.17.0