From: Guenter Roeck <linux@roeck-us.net>
To: James Hogan <jhogan@kernel.org>
Cc: Ralf Baechle <ralf@linux-mips.org>,
linux-mips@linux-mips.org, linux-kernel@vger.kernel.org,
Guenter Roeck <linux@roeck-us.net>
Subject: [RFC PATCH] MIPS: Provide cmpxchg64 for 32-bit builds
Date: Mon, 12 Feb 2018 14:37:01 -0800 [thread overview]
Message-ID: <1518475021-3337-1-git-send-email-linux@roeck-us.net> (raw)
Since commit 60f481b970386 ("i40e: change flags to use 64 bits"),
the i40e driver uses cmpxchg64(). This causes mips:allmodconfig builds
to fail with
drivers/net/ethernet/intel/i40e/i40e_ethtool.c:
In function 'i40e_set_priv_flags':
drivers/net/ethernet/intel/i40e/i40e_ethtool.c:4443:2: error:
implicit declaration of function 'cmpxchg64'
Implement a poor-mans-version of cmpxchg64() to fix the problem for 32-bit
mips builds. The code is derived from sparc32, but only uses a single
spinlock.
Fixes: 60f481b970386 ("i40e: change flags to use 64 bits")
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
Compile-tested only.
arch/mips/include/asm/cmpxchg.h | 3 +++
arch/mips/kernel/cmpxchg.c | 17 +++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/arch/mips/include/asm/cmpxchg.h b/arch/mips/include/asm/cmpxchg.h
index 89e9fb7976fe..9f7b1df95b99 100644
--- a/arch/mips/include/asm/cmpxchg.h
+++ b/arch/mips/include/asm/cmpxchg.h
@@ -206,6 +206,9 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
#ifndef CONFIG_SMP
#define cmpxchg64(ptr, o, n) cmpxchg64_local((ptr), (o), (n))
+#else
+u64 __cmpxchg_u64(u64 *ptr, u64 old, u64 new);
+#define cmpxchg64(ptr, old, new) __cmpxchg_u64(ptr, old, new)
#endif
#endif
diff --git a/arch/mips/kernel/cmpxchg.c b/arch/mips/kernel/cmpxchg.c
index 0b9535bc2c53..30216beb2334 100644
--- a/arch/mips/kernel/cmpxchg.c
+++ b/arch/mips/kernel/cmpxchg.c
@@ -9,6 +9,7 @@
*/
#include <linux/bitops.h>
+#include <linux/spinlock.h>
#include <asm/cmpxchg.h>
unsigned long __xchg_small(volatile void *ptr, unsigned long val, unsigned int size)
@@ -107,3 +108,19 @@ unsigned long __cmpxchg_small(volatile void *ptr, unsigned long old,
return old;
}
}
+
+static DEFINE_SPINLOCK(cmpxchg_lock);
+
+u64 __cmpxchg_u64(u64 *ptr, u64 old, u64 new)
+{
+ unsigned long flags;
+ u64 prev;
+
+ spin_lock_irqsave(&cmpxchg_lock, flags);
+ if ((prev = *ptr) == old)
+ *ptr = new;
+ spin_unlock_irqrestore(&cmpxchg_lock, flags);
+
+ return prev;
+}
+EXPORT_SYMBOL(__cmpxchg_u64);
--
2.7.4
next reply other threads:[~2018-02-12 22:37 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-12 22:37 Guenter Roeck [this message]
2018-02-12 23:42 ` [RFC PATCH] MIPS: Provide cmpxchg64 for 32-bit builds James Hogan
2018-02-12 23:56 ` Guenter Roeck
2018-02-14 21:02 ` Michael, Alice
2018-02-14 21:36 ` Keller, Jacob E
2018-03-12 23:12 ` James Hogan
2018-03-12 23:17 ` Keller, Jacob E
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=1518475021-3337-1-git-send-email-linux@roeck-us.net \
--to=linux@roeck-us.net \
--cc=jhogan@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=ralf@linux-mips.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.