Skip to contentSkip to conversation

bitops.h: move out get_count_order[_long]() from __KERNEL__ scope

PATCH Superseded zijun_hu 3 participants 10 messages Aug 16, 2016 – Aug 18, 2016 Bitops API

lore
Share & tools
lore

zijun_hu

author
#0 lore raw

PATCH 1/1 bitops.h: move out get_count_order[_long]() from __KERNEL__ scope

From: zijun_hu <[email protected]>

move out get_count_order[_long]() definitions from scope limited by macro __KERNEL__

---
this patch is based on the newest mmotm/linux-next tree and can be applied directly

 include/linux/bitops.h | 52 +++++++++++++++++++++++++-------------------------
 1 file changed, 26 insertions(+), 26 deletions(-)
include/linux/bitops.h +26 -26
index 6f202c8fe4a6..a83c822c35c2 100644
@@ -181,6 +181,32 @@ static inline unsigned fls_long(unsigned long l)
 	return fls64(l);
 }
 
+static inline int get_count_order(unsigned int count)
+{
+	int order;
+
+	order = fls(count) - 1;
+	if (count & (count - 1))
+		order++;
+	return order;
+}
+
+/**
+ * get_count_order_long - get order after rounding @l up to power of 2
+ * @l: parameter
+ *
+ * it is same as get_count_order() but with long type parameter
+ */
+static inline int get_count_order_long(unsigned long l)
+{
+	if (l == 0UL)
+		return -1;
+	else if (l & (l - 1UL))
+		return (int)fls_long(l);
+	else
+		return (int)fls_long(l) - 1;
+}
+
 /**
  * __ffs64 - find first set bit in a 64 bit word
  * @word: The 64 bit word
@@ -233,32 +259,6 @@ static inline unsigned long __ffs64(u64 word)
 })
 #endif
 
-static inline int get_count_order(unsigned int count)
-{
-	int order;
-
-	order = fls(count) - 1;
-	if (count & (count - 1))
-		order++;
-	return order;
-}
-
-/**
- * get_count_order_long - get order after rounding @l up to power of 2
- * @l: parameter
- *
- * it is same as get_count_order() but with long type parameter
- */
-static inline int get_count_order_long(unsigned long l)
-{
-	if (l == 0UL)
-		return -1;
-	else if (l & (l - 1UL))
-		return (int)fls_long(l);
-	else
-		return (int)fls_long(l) - 1;
-}
-
 #ifndef find_last_bit
 /**
  * find_last_bit - find the last set bit in a memory region
Signature · 1 line
1.9.1
#1 lore raw

Hi,

Quoted 5 lines · On Tue, 16 Aug 2016 14:27:04 +0800 zijun_hu <[email protected]> wrote:

From: zijun_hu <[email protected]>

move out get_count_order[_long]() definitions from scope limited by macro __KERNEL__

Why do you need to do this? You say why in the commit message.

Signature · 2 lines
Cheers,
Stephen Rothwell
author
#2 lore raw
Quoted 11 lines · Stephen Rothwell

Hi,

Quoted 5 lines · On Tue, 16 Aug 2016 14:27:04 +0800 zijun_hu <[email protected]> wrote:

From: zijun_hu <[email protected]>

move out get_count_order[_long]() definitions from scope limited by macro __KERNEL__

Why do you need to do this? You say why in the commit message.

1, it make both functions available in wider region regardless of
whether macro __KERNEL__ is defined
2, get_count_order() locates out off region limited by macro __KERNEL__
before the recent commit c513b4cd2fe9 ("mm-vmalloc-fix-align-value-calculation-error-v2-fix-fix")
it maybe more perfect to keep its original region and place its counterpart get_count_order_long() nearly

thanks for your reply

author
#3 lore raw

PATCH RESEND 1/1 bitops.h: move out get_count_order[_long]() from __KERNEL__ scope

In reply to zijun_hu

From: zijun_hu <[email protected]>

move out get_count_order[_long]() definitions from scope limited by macro __KERNEL__

it not only make both functions available in wider region regardless of whether __KERNEL__ is defined but also keep original region for get_count_order() before the recent commit c513b4cd2fe9 ("mm-vmalloc-fix-align-value-calculation-error-v2-fix-fix")

---
this patch is based on the newest mmotm/linux-next tree and can be applied directly

 include/linux/bitops.h | 52 +++++++++++++++++++++++++-------------------------
 1 file changed, 26 insertions(+), 26 deletions(-)
include/linux/bitops.h +26 -26
index 6f202c8fe4a6..a83c822c35c2 100644
@@ -181,6 +181,32 @@ static inline unsigned fls_long(unsigned long l)
 	return fls64(l);
 }
 
+static inline int get_count_order(unsigned int count)
+{
+	int order;
+
+	order = fls(count) - 1;
+	if (count & (count - 1))
+		order++;
+	return order;
+}
+
+/**
+ * get_count_order_long - get order after rounding @l up to power of 2
+ * @l: parameter
+ *
+ * it is same as get_count_order() but with long type parameter
+ */
+static inline int get_count_order_long(unsigned long l)
+{
+	if (l == 0UL)
+		return -1;
+	else if (l & (l - 1UL))
+		return (int)fls_long(l);
+	else
+		return (int)fls_long(l) - 1;
+}
+
 /**
  * __ffs64 - find first set bit in a 64 bit word
  * @word: The 64 bit word
@@ -233,32 +259,6 @@ static inline unsigned long __ffs64(u64 word)
 })
 #endif
 
-static inline int get_count_order(unsigned int count)
-{
-	int order;
-
-	order = fls(count) - 1;
-	if (count & (count - 1))
-		order++;
-	return order;
-}
-
-/**
- * get_count_order_long - get order after rounding @l up to power of 2
- * @l: parameter
- *
- * it is same as get_count_order() but with long type parameter
- */
-static inline int get_count_order_long(unsigned long l)
-{
-	if (l == 0UL)
-		return -1;
-	else if (l & (l - 1UL))
-		return (int)fls_long(l);
-	else
-		return (int)fls_long(l) - 1;
-}
-
 #ifndef find_last_bit
 /**
  * find_last_bit - find the last set bit in a memory region
Signature · 1 line
1.9.1
#4 lore raw
Quoted 9 lines · zijun_hu

From: zijun_hu <[email protected]>

move out get_count_order[_long]() definitions from scope limited by macro __KERNEL__

it not only make both functions available in wider region regardless of whether __KERNEL__ is defined but also keep original region for get_count_order() before the recent commit c513b4cd2fe9 ("mm-vmalloc-fix-align-value-calculation-error-v2-fix-fix")

What the hell is anything without __KERNEL__ doing with linux/bitops.h in the first place? IOW, why do we have those ifdefs at all?

author
#5 lore raw
Quoted 6 lines · Al Viro
Quoted 5 lines · zijun_hu

From: zijun_hu <[email protected]>

move out get_count_order[_long]() definitions from scope limited by macro __KERNEL__

Quoted 8 lines
Quoted 4 lines

it not only make both functions available in wider region regardless of whether __KERNEL__ is defined but also keep original region for get_count_order() before the recent commit c513b4cd2fe9 ("mm-vmalloc-fix-align-value-calculation-error-v2-fix-fix")

What the hell is anything without __KERNEL__ doing with linux/bitops.h in the first place? IOW, why do we have those ifdefs at all?

__KERNEL__ is used to indicate the relevant sections within kernel headers can't be exported to or used by user space

let me illuminate this patch background firstly
i and Andrew develop another patch to fix a mm issue recently, that patch move get_count_order() into __KERNEL__ scope, so touch the function's scope property we don't need to touch or care

the aim of this patch is undoing our unnecessary changes

#6 lore raw
Quoted 6 lines · zijun_hu
Quoted 3 lines

What the hell is anything without __KERNEL__ doing with linux/bitops.h in the first place? IOW, why do we have those ifdefs at all?

__KERNEL__ is used to indicate the relevant sections within kernel headers can't be exported to or used by user space

ITYM "used to be used". These days it's "everything outside of */uapi/*.h can't be exported"...

author
#7 lore raw
Quoted 11 lines · Al Viro
Quoted 6 lines · zijun_hu
Quoted 3 lines

What the hell is anything without __KERNEL__ doing with linux/bitops.h in the first place? IOW, why do we have those ifdefs at all?

__KERNEL__ is used to indicate the relevant sections within kernel headers can't be exported to or used by user space

ITYM "used to be used". These days it's "everything outside of */uapi/*.h can't be exported"...

i conclude one purpose of __KERNEL__ from the following kernel files

scripts/headers_install.sh:
echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]" echo
echo "Prepares kernel header files for use by user space, by removing" echo "all compiler.h definitions and #includes, removing any" echo "#ifdef __KERNEL__ sections, and putting __underscores__ around" echo "asm/inline/volatile keywords."
echo
......
scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed"

Documentation/kbuild/makefiles.txt:
The kernel includes a set of headers that is exported to userspace. Many headers can be exported as-is but other headers require a minimal pre-processing before they are ready for user-space. The pre-processing does:
- drop kernel-specific annotations
- drop include of compiler.h
- drop all sections that are kernel internal (guarded by ifdef __KERNEL__)

scripts/Makefile.headersinst:
# ========================================================================== # Installing headers
#

# header-y  - list files to be installed. They are preprocessed
#             to remove __KERNEL__ section of the file
# genhdr-y  - Same as header-y but in a generated/ directory
#
# ==========================================================================
#8 lore raw
Quoted 9 lines · zijun_hu

Documentation/kbuild/makefiles.txt:
The kernel includes a set of headers that is exported to userspace. Many headers can be exported as-is but other headers require a minimal pre-processing before they are ready for user-space. The pre-processing does:
- drop kernel-specific annotations
- drop include of compiler.h
- drop all sections that are kernel internal (guarded by ifdef __KERNEL__)

Quoted 7 lines

scripts/Makefile.headersinst:
# ========================================================================== # Installing headers
#

# header-y  - list files to be installed. They are preprocessed
#             to remove __KERNEL__ section of the file
# genhdr-y  - Same as header-y but in a generated/ directory

Quite. Now, could you show me where bitops.h is mentioned in any header-y assignments?

Stuff outside of */uapi/* is not exported at all.

author
#9 lore raw
Quoted 19 lines · Al Viro
Quoted 9 lines · zijun_hu

Documentation/kbuild/makefiles.txt:
The kernel includes a set of headers that is exported to userspace. Many headers can be exported as-is but other headers require a minimal pre-processing before they are ready for user-space. The pre-processing does:
- drop kernel-specific annotations
- drop include of compiler.h
- drop all sections that are kernel internal (guarded by ifdef __KERNEL__)

Quoted 7 lines

scripts/Makefile.headersinst:
# ========================================================================== # Installing headers
#

# header-y  - list files to be installed. They are preprocessed
#             to remove __KERNEL__ section of the file
# genhdr-y  - Same as header-y but in a generated/ directory
Quoted 3 lines

Quite. Now, could you show me where bitops.h is mentioned in any header-y assignments?

you are right bitops.h isn't mentioned in any header-y my aim is making macro __KERNEL__ purpose or history purpose clear it isn't a bad thing to follow __KERNEL__ purpose
it maybe look nicer to keep get_counter_order() original scope

that don't matter since the current scope works well also

Quoted 2 lines

Stuff outside of */uapi/* is not exported at all.