diff mbox series

[v1,4/4] lib/vsprintf: Split out sprintf() and friends

Message ID 20230804082619.61833-5-andriy.shevchenko@linux.intel.com (mailing list archive)
State New
Headers show
Series lib/vsprintf: Rework header inclusions | expand

Commit Message

Andy Shevchenko Aug. 4, 2023, 8:26 a.m. UTC
kernel.h is being used as a dump for all kinds of stuff for a long time.
sprintf() and friends are used in many drivers without need of the full
kernel.h dependency train with it.

Here is the attempt on cleaning it up by splitting out sprintf() and
friends.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 include/linux/kernel.h  | 30 +-----------------------------
 include/linux/sprintf.h | 24 ++++++++++++++++++++++++
 lib/vsprintf.c          |  1 +
 3 files changed, 26 insertions(+), 29 deletions(-)
 create mode 100644 include/linux/sprintf.h

Comments

Rasmus Villemoes Aug. 4, 2023, 9:31 a.m. UTC | #1
On 04/08/2023 10.26, Andy Shevchenko wrote:
> kernel.h is being used as a dump for all kinds of stuff for a long time.
> sprintf() and friends are used in many drivers without need of the full
> kernel.h dependency train with it.
> 
> Here is the attempt on cleaning it up by splitting out sprintf() and
> friends.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
>  include/linux/kernel.h  | 30 +-----------------------------
>  include/linux/sprintf.h | 24 ++++++++++++++++++++++++
>  lib/vsprintf.c          |  1 +
>  3 files changed, 26 insertions(+), 29 deletions(-)
>  create mode 100644 include/linux/sprintf.h
> 
> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
> index b9e76f717a7e..cee8fe87e9f4 100644
> --- a/include/linux/kernel.h
> +++ b/include/linux/kernel.h
> @@ -29,6 +29,7 @@
>  #include <linux/panic.h>
>  #include <linux/printk.h>
>  #include <linux/build_bug.h>
> +#include <linux/sprintf.h>
>  #include <linux/static_call_types.h>
>  #include <linux/instruction_pointer.h>
>  #include <asm/byteorder.h>
> @@ -203,35 +204,6 @@ static inline void might_fault(void) { }
>  
>  void do_exit(long error_code) __noreturn;
>  
> -extern int num_to_str(char *buf, int size,
> -		      unsigned long long num, unsigned int width);
> -
> -/* lib/printf utilities */
> -
> -extern __printf(2, 3) int sprintf(char *buf, const char * fmt, ...);
> -extern __printf(2, 0) int vsprintf(char *buf, const char *, va_list);
> -extern __printf(3, 4)
> -int snprintf(char *buf, size_t size, const char *fmt, ...);
> -extern __printf(3, 0)
> -int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
> -extern __printf(3, 4)
> -int scnprintf(char *buf, size_t size, const char *fmt, ...);
> -extern __printf(3, 0)
> -int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
> -extern __printf(2, 3) __malloc
> -char *kasprintf(gfp_t gfp, const char *fmt, ...);
> -extern __printf(2, 0) __malloc
> -char *kvasprintf(gfp_t gfp, const char *fmt, va_list args);
> -extern __printf(2, 0)
> -const char *kvasprintf_const(gfp_t gfp, const char *fmt, va_list args);
> -
> -extern __scanf(2, 3)
> -int sscanf(const char *, const char *, ...);
> -extern __scanf(2, 0)
> -int vsscanf(const char *, const char *, va_list);
> -
> -extern int no_hash_pointers_enable(char *str);
> -
>  extern int get_option(char **str, int *pint);
>  extern char *get_options(const char *str, int nints, int *ints);
>  extern unsigned long long memparse(const char *ptr, char **retptr);
> diff --git a/include/linux/sprintf.h b/include/linux/sprintf.h
> new file mode 100644
> index 000000000000..00d1fdc70a3e
> --- /dev/null
> +++ b/include/linux/sprintf.h
> @@ -0,0 +1,24 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _LINUX_KERNEL_SPRINTF_H_
> +#define _LINUX_KERNEL_SPRINTF_H_
> +
> +#include <linux/types.h>
> +

Shouldn't this at least also include compiler_attributes.h, to make it
self-contained?

As Marco said, please just declare no_hash_pointers in this file as
well. Perhaps with a comment about not accessing it unless one has good
reason, but I suppose that's true in general for all kernel global
variables, so maybe not worth it for this one.

Rasmus
Andy Shevchenko Aug. 4, 2023, 8:34 p.m. UTC | #2
On Fri, Aug 04, 2023 at 11:31:58AM +0200, Rasmus Villemoes wrote:
> On 04/08/2023 10.26, Andy Shevchenko wrote:

...

> > +#include <linux/types.h>
> 
> Shouldn't this at least also include compiler_attributes.h, to make it
> self-contained?

As I replied in the other email, this is guaranteed by types.h.
But if you insist, I can add it.

> As Marco said, please just declare no_hash_pointers in this file as
> well. Perhaps with a comment about not accessing it unless one has good
> reason, but I suppose that's true in general for all kernel global
> variables, so maybe not worth it for this one.

Sure, thank you for the review!
diff mbox series

Patch

diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index b9e76f717a7e..cee8fe87e9f4 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -29,6 +29,7 @@ 
 #include <linux/panic.h>
 #include <linux/printk.h>
 #include <linux/build_bug.h>
+#include <linux/sprintf.h>
 #include <linux/static_call_types.h>
 #include <linux/instruction_pointer.h>
 #include <asm/byteorder.h>
@@ -203,35 +204,6 @@  static inline void might_fault(void) { }
 
 void do_exit(long error_code) __noreturn;
 
-extern int num_to_str(char *buf, int size,
-		      unsigned long long num, unsigned int width);
-
-/* lib/printf utilities */
-
-extern __printf(2, 3) int sprintf(char *buf, const char * fmt, ...);
-extern __printf(2, 0) int vsprintf(char *buf, const char *, va_list);
-extern __printf(3, 4)
-int snprintf(char *buf, size_t size, const char *fmt, ...);
-extern __printf(3, 0)
-int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
-extern __printf(3, 4)
-int scnprintf(char *buf, size_t size, const char *fmt, ...);
-extern __printf(3, 0)
-int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
-extern __printf(2, 3) __malloc
-char *kasprintf(gfp_t gfp, const char *fmt, ...);
-extern __printf(2, 0) __malloc
-char *kvasprintf(gfp_t gfp, const char *fmt, va_list args);
-extern __printf(2, 0)
-const char *kvasprintf_const(gfp_t gfp, const char *fmt, va_list args);
-
-extern __scanf(2, 3)
-int sscanf(const char *, const char *, ...);
-extern __scanf(2, 0)
-int vsscanf(const char *, const char *, va_list);
-
-extern int no_hash_pointers_enable(char *str);
-
 extern int get_option(char **str, int *pint);
 extern char *get_options(const char *str, int nints, int *ints);
 extern unsigned long long memparse(const char *ptr, char **retptr);
diff --git a/include/linux/sprintf.h b/include/linux/sprintf.h
new file mode 100644
index 000000000000..00d1fdc70a3e
--- /dev/null
+++ b/include/linux/sprintf.h
@@ -0,0 +1,24 @@ 
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_KERNEL_SPRINTF_H_
+#define _LINUX_KERNEL_SPRINTF_H_
+
+#include <linux/types.h>
+
+int num_to_str(char *buf, int size, unsigned long long num, unsigned int width);
+
+__printf(2, 3) int sprintf(char *buf, const char * fmt, ...);
+__printf(2, 0) int vsprintf(char *buf, const char *, va_list);
+__printf(3, 4) int snprintf(char *buf, size_t size, const char *fmt, ...);
+__printf(3, 0) int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
+__printf(3, 4) int scnprintf(char *buf, size_t size, const char *fmt, ...);
+__printf(3, 0) int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
+__printf(2, 3) __malloc char *kasprintf(gfp_t gfp, const char *fmt, ...);
+__printf(2, 0) __malloc char *kvasprintf(gfp_t gfp, const char *fmt, va_list args);
+__printf(2, 0) const char *kvasprintf_const(gfp_t gfp, const char *fmt, va_list args);
+
+__scanf(2, 3) int sscanf(const char *, const char *, ...);
+__scanf(2, 0) int vsscanf(const char *, const char *, va_list);
+
+int no_hash_pointers_enable(char *str);
+
+#endif	/* _LINUX_KERNEL_SPRINTF_H */
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index eb0934d02722..e553bc9e18f3 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -34,6 +34,7 @@ 
 #include <linux/property.h>
 #include <linux/rtc.h>
 #include <linux/siphash.h>
+#include <linux/sprintf.h>
 #include <linux/stdarg.h>
 #include <linux/string_helpers.h>
 #include <linux/time.h>