Re: [PATCH] uapi: Make __{u,s}64 match {u,}int64_t in userspace

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Cyril,

On 11/22/21 17:43, Cyril Hrubis wrote:
This changes the __u64 and __s64 in userspace on 64bit platforms from
long long (unsigned) int to just long (unsigned) int in order to match
the uint64_t and int64_t size in userspace.

This allows us to use the kernel structure definitions in userspace. For
example we can use PRIu64 and PRId64 modifiers in printf() to print
structure members. Morever with this there would be no need to redefine
these structures in libc implementations as it is done now.

Consider for example the newly added statx() syscall. If we use the
header from uapi we will get warnings when attempting to print it's
members as:

	printf("%" PRIu64 "\n", stx.stx_size);

We get:

	warning: format '%lu' expects argument of type 'long unsigned int',
	         but argument 5 has type '__u64' {aka 'long long unsigned int'}

After this patch the types match and no warnings are generated.
This would make it even easier to ignore the existence of different kernel types, and let userspace use standard types.

Related recent discussion:
<https://lore.kernel.org/linux-man/20210423230609.13519-1-alx.manpages@xxxxxxxxx/>


Signed-off-by: Cyril Hrubis <chrubis@xxxxxxx>

Acked-by: Alejandro Colomar <alx.manpages@xxxxxxxxx>

Thanks,
Alex

---
  include/uapi/asm-generic/types.h | 11 +++++++++--
  1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/include/uapi/asm-generic/types.h b/include/uapi/asm-generic/types.h
index dfaa50d99d8f..ae748a3678a4 100644
--- a/include/uapi/asm-generic/types.h
+++ b/include/uapi/asm-generic/types.h
@@ -1,9 +1,16 @@
  /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
  #ifndef _ASM_GENERIC_TYPES_H
  #define _ASM_GENERIC_TYPES_H
+
+#include <asm/bitsperlong.h>
+
  /*
- * int-ll64 is used everywhere now.
+ * int-ll64 is used everywhere in kernel now.
   */
-#include <asm-generic/int-ll64.h>
+#if __BITS_PER_LONG == 64 && !defined(__KERNEL__)

BTW, C2X adds LONG_WIDTH in <limits.h> (and in general TYPE_WIDTH) to get the bits of a long.

+# include <asm-generic/int-l64.h>
+#else
+# include <asm-generic/int-ll64.h>
+#endif
#endif /* _ASM_GENERIC_TYPES_H */




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux