From: Christian Zigotzky <chzigotzky@xenosoft.de>
To: linuxppc-dev@lists.ozlabs.org
Subject: Qoriq P5020 PowerPC board doesn't boot with the latest git version anymore
Date: Mon, 20 Nov 2017 00:34:14 +0100 [thread overview]
Message-ID: <d8bf23c2-1805-a9c3-566d-74c0f28e88e8@xenosoft.de> (raw)
In-Reply-To: <8ed2edc7-a14b-35b3-86c1-a9995f41df84@xenosoft.de>
[-- Attachment #1: Type: text/plain, Size: 1041 bytes --]
Hi All,
I created a patch for the git kernel today. (see attachment)
Without the patch, the latest git kernel doesn't boot on my Cyrus Plus
board.
Cheers,
Christian
On 19 November 2017 at 5:57PM, Christian Zigotzky wrote:
> Hi All,
>
> A little success. :-) I reverted the following files from the bad
> commit a8a217c22116eff6c120d753c9934089fb229af0 [1]:
>
> arch/powerpc/include/asm/spinlock.h
> kernel/locking/spinlock.c
> include/linux/spinlock_up.h
> include/linux/spinlock.h
> include/linux/rwlock.h
>
> After that I compiled the latest git kernel again. Then I was able to
> boot the latest git kernel on my Varisys Cyrus Plus board [2][3]. :-)
>
> That means the bug is in one of these files.
>
> Please help me to find the bug in these files above.
>
> Thanks,
> Christian
>
>
> [1]
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a8a217c22116eff6c120d753c9934089fb229af0
> [2] http://www.amigaos.net/hardware/133/amigaone-x5000
> [3] http://wiki.amiga.org/index.php?title=AmigaONE_X5000
>
[-- Attachment #2: spinlock_4.15-1.patch --]
[-- Type: text/x-patch, Size: 3207 bytes --]
--- a/arch/powerpc/include/asm/spinlock.h 2017-11-18 20:57:47.921703650 +0100
+++ b/arch/powerpc/include/asm/spinlock.h 2017-11-19 18:51:51.630906446 +0100
@@ -182,6 +182,9 @@ static inline void arch_spin_unlock(arch
* read-locks.
*/
+#define arch_read_can_lock(rw) ((rw)->lock >= 0)
+#define arch_write_can_lock(rw) (!(rw)->lock)
+
#ifdef CONFIG_PPC64
#define __DO_SIGN_EXTEND "extsw %0,%0\n"
#define WRLOCK_TOKEN LOCK_TOKEN /* it's negative */
--- a/kernel/locking/spinlock.c 2017-11-18 20:57:48.974708915 +0100
+++ b/kernel/locking/spinlock.c 2017-11-19 18:26:18.526892449 +0100
@@ -35,6 +35,9 @@
*/
#else
+#define raw_read_can_lock(l) read_can_lock(l)
+#define raw_write_can_lock(l) write_can_lock(l)
+
/*
* Some architectures can relax in favour of the CPU owning the lock.
*/
@@ -68,7 +71,7 @@ void __lockfunc __raw_##op##_lock(lockty
\
if (!(lock)->break_lock) \
(lock)->break_lock = 1; \
- while ((lock)->break_lock) \
+ while (!raw_##op##_can_lock(lock) && (lock)->break_lock)\
arch_##op##_relax(&lock->raw_lock); \
} \
(lock)->break_lock = 0; \
@@ -88,7 +91,7 @@ unsigned long __lockfunc __raw_##op##_lo
\
if (!(lock)->break_lock) \
(lock)->break_lock = 1; \
- while ((lock)->break_lock) \
+ while (!raw_##op##_can_lock(lock) && (lock)->break_lock)\
arch_##op##_relax(&lock->raw_lock); \
} \
(lock)->break_lock = 0; \
--- a/include/linux/spinlock_up.h 2017-11-18 20:57:38.788657985 +0100
+++ b/include/linux/spinlock_up.h 2017-11-19 18:48:19.787635450 +0100
@@ -69,4 +69,7 @@ static inline void arch_spin_unlock(arch
#define arch_spin_is_contended(lock) (((void)(lock), 0))
+#define arch_read_can_lock(lock) (((void)(lock), 1))
+#define arch_write_can_lock(lock) (((void)(lock), 1))
+
#endif /* __LINUX_SPINLOCK_UP_H */
--- a/include/linux/spinlock.h 2017-11-18 20:57:38.693657510 +0100
+++ b/include/linux/spinlock.h 2017-11-19 18:37:36.933284464 +0100
@@ -283,6 +283,12 @@ static inline void do_raw_spin_unlock(ra
1 : ({ local_irq_restore(flags); 0; }); \
})
+/**
+ * raw_spin_can_lock - would raw_spin_trylock() succeed?
+ * @lock: the spinlock in question.
+ */
+#define raw_spin_can_lock(lock) (!raw_spin_is_locked(lock))
+
/* Include rwlock functions */
#include <linux/rwlock.h>
@@ -395,6 +401,11 @@ static __always_inline int spin_is_conte
return raw_spin_is_contended(&lock->rlock);
}
+static __always_inline int spin_can_lock(spinlock_t *lock)
+{
+ return raw_spin_can_lock(&lock->rlock);
+}
+
#define assert_spin_locked(lock) assert_raw_spin_locked(&(lock)->rlock)
/*
--- a/include/linux/rwlock.h 2017-11-18 20:57:38.652657305 +0100
+++ b/include/linux/rwlock.h 2017-11-19 18:19:54.045970054 +0100
@@ -59,6 +59,9 @@ do { \
# define do_raw_write_unlock(rwlock) do {arch_write_unlock(&(rwlock)->raw_lock); __release(lock); } while (0)
#endif
+#define read_can_lock(rwlock) arch_read_can_lock(&(rwlock)->raw_lock)
+#define write_can_lock(rwlock) arch_write_can_lock(&(rwlock)->raw_lock)
+
/*
* Define the various rw_lock methods. Note we define these
* regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
next prev parent reply other threads:[~2017-11-19 23:34 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-18 22:27 Qoriq P5020 PowerPC board doesn't boot with the latest git version anymore Christian Zigotzky
2017-11-19 12:32 ` Christian Zigotzky
2017-11-19 16:57 ` Christian Zigotzky
2017-11-19 23:34 ` Christian Zigotzky [this message]
2017-11-22 11:28 ` Michael Ellerman
2017-11-22 12:44 ` Christian Zigotzky
2017-11-25 23:33 ` Christian Zigotzky
2017-11-28 10:37 ` Michael Ellerman
2017-11-29 10:35 ` Christian Zigotzky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d8bf23c2-1805-a9c3-566d-74c0f28e88e8@xenosoft.de \
--to=chzigotzky@xenosoft.de \
--cc=linuxppc-dev@lists.ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).