linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] x86, bitops, variable_test_bit should return 1 not -1 on a match
@ 2015-08-19 17:18 Prarit Bhargava
  2015-08-21  6:51 ` Ingo Molnar
  0 siblings, 1 reply; 10+ messages in thread
From: Prarit Bhargava @ 2015-08-19 17:18 UTC (permalink / raw)
  To: linux-kernel
  Cc: Prarit Bhargava, Thomas Gleixner, Ingo Molnar, H. Peter Anvin,
	x86

This issue was noticed while debugging a CPU hotplug issue.  On x86
with (NR_CPUS > 1) the cpu_online() define is cpumask_test_cpu().
cpumask_test_cpu() should return 1 if the cpu is set in cpumask and
0 otherwise.

However, cpumask_test_cpu() returns -1 if the cpu in the cpumask is
set and 0 otherwise.  This happens because cpumask_test_cpu() calls
test_bit() which is a define that will call variable_test_bit().

variable_test_bit() calls the assembler instruction sbb (Subtract
with Borrow, " Subtracts the source from the destination, and subtracts 1
extra if the Carry Flag is set. Results are returned in "dest".)

A bit match results in -1 being returned from variable_test_bit() if a
match occurs, not 1 as the function is supposed to.  This can be easily
resolved by adding a "!!" to force 0 or 1 as a return.

It looks like the code never does, for example, (test_bit() == 1) so this
change should not have any impact.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Prarit Bhargava <prarit@redhat.com>
---
 arch/x86/include/asm/bitops.h |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h
index cfe3b95..a87a5fb 100644
--- a/arch/x86/include/asm/bitops.h
+++ b/arch/x86/include/asm/bitops.h
@@ -320,7 +320,7 @@ static inline int variable_test_bit(long nr, volatile const unsigned long *addr)
 		     : "=r" (oldbit)
 		     : "m" (*(unsigned long *)addr), "Ir" (nr));
 
-	return oldbit;
+	return !!oldbit;
 }
 
 #if 0 /* Fool kernel-doc since it doesn't do macros yet */
-- 
1.7.9.3


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2015-10-08 11:48 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-19 17:18 [PATCH] x86, bitops, variable_test_bit should return 1 not -1 on a match Prarit Bhargava
2015-08-21  6:51 ` Ingo Molnar
2015-08-21  8:08   ` H. Peter Anvin
2015-08-21 11:53     ` Prarit Bhargava
2015-08-24 18:22     ` [PATCH v2] " Prarit Bhargava
2015-10-07 23:27       ` Prarit Bhargava
2015-10-08  8:51         ` Ingo Molnar
2015-10-08 11:48     ` [PATCH] " Prarit Bhargava
2015-08-21 11:50   ` Prarit Bhargava
2015-08-22  9:14     ` Ingo Molnar

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).