Clang's context analysis reports:
  opal.c:454:7: error: spinlock 'opal_write_lock' is not held on every path 
through here [-Werror,-Wthread-safety-analysis]
  opal.c:493:3: error: releasing spinlock 'opal_write_lock' that was not held 
[-Werror,-Wthread-safety-analysis]

This patch rework the OPAL console write function to remove this
conditional locking to fix the reported build errors while enabling
Clang context analysis. We could have marked __context_unsafe(),
but this anyways simplifies the locking a bit.

Signed-off-by: Ritesh Harjani (IBM) <[email protected]>
---
 arch/powerpc/platforms/powernv/opal.c | 30 ++++++++++++++++++---------
 1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/platforms/powernv/opal.c 
b/arch/powerpc/platforms/powernv/opal.c
index 1946dbdc9fa1..aea83c4be76d 100644
--- a/arch/powerpc/platforms/powernv/opal.c
+++ b/arch/powerpc/platforms/powernv/opal.c
@@ -438,19 +438,13 @@ ssize_t opal_get_chars(uint32_t vtermno, u8 *buf, size_t 
count)
        return 0;
 }
 
-static ssize_t __opal_put_chars(uint32_t vtermno, const u8 *data,
-                               size_t total_len, bool atomic)
+static ssize_t __opal_put_chars_unlocked(uint32_t vtermno, const u8 *data,
+                                        size_t total_len, bool atomic)
 {
-       unsigned long flags = 0 /* shut up gcc */;
        ssize_t written;
        __be64 olen;
        s64 rc;
 
-       if (!opal.entry)
-               return -ENODEV;
-
-       if (atomic)
-               spin_lock_irqsave(&opal_write_lock, flags);
        rc = opal_console_write_buffer_space(vtermno, &olen);
        if (rc || be64_to_cpu(olen) < total_len) {
                /* Closed -> drop characters */
@@ -489,10 +483,26 @@ static ssize_t __opal_put_chars(uint32_t vtermno, const 
u8 *data,
        }
 
 out:
-       if (atomic)
+       return written;
+}
+
+static ssize_t __opal_put_chars(uint32_t vtermno, const u8 *data,
+                               size_t total_len, bool atomic)
+{
+       unsigned long flags = 0;
+       ssize_t written;
+
+       if (!opal.entry)
+               return -ENODEV;
+
+       if (atomic) {
+               spin_lock_irqsave(&opal_write_lock, flags);
+               written = __opal_put_chars_unlocked(vtermno, data, total_len, 
true);
                spin_unlock_irqrestore(&opal_write_lock, flags);
+               return written;
+       }
 
-       return written;
+       return __opal_put_chars_unlocked(vtermno, data, total_len, false);
 }
 
 ssize_t opal_put_chars(uint32_t vtermno, const u8 *data, size_t total_len)
-- 
2.39.5


Reply via email to