Commit c6517b78 authored by Laura Abbott's avatar Laura Abbott Committed by Jonathan Corbet

doc: ioctl: Add some clarifications to botching-up-ioctls

- The guide currently says to pad the structure to a multiple of
  64-bits. This is not necessary in cases where the structure contains
  no 64-bit types. Clarify this concept to avoid unnecessary padding.
- When using __u64 to hold user pointers, blindly trying to do a cast to
  a void __user * may generate a warning on 32-bit systems about a cast
  from an integer to a pointer of different size. There is a macro to
  deal with this which hides an ugly double cast. Add a reference to
  this macro.
Signed-off-by: default avatarLaura Abbott <labbott@redhat.com>
Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent 95149971
...@@ -34,15 +34,18 @@ will need to add a a 32-bit compat layer: ...@@ -34,15 +34,18 @@ will need to add a a 32-bit compat layer:
64-bit platforms do. So we always need padding to the natural size to get 64-bit platforms do. So we always need padding to the natural size to get
this right. this right.
* Pad the entire struct to a multiple of 64-bits - the structure size will * Pad the entire struct to a multiple of 64-bits if the structure contains
otherwise differ on 32-bit versus 64-bit. Having a different structure size 64-bit types - the structure size will otherwise differ on 32-bit versus
hurts when passing arrays of structures to the kernel, or if the kernel 64-bit. Having a different structure size hurts when passing arrays of
checks the structure size, which e.g. the drm core does. structures to the kernel, or if the kernel checks the structure size, which
e.g. the drm core does.
* Pointers are __u64, cast from/to a uintprt_t on the userspace side and * Pointers are __u64, cast from/to a uintprt_t on the userspace side and
from/to a void __user * in the kernel. Try really hard not to delay this from/to a void __user * in the kernel. Try really hard not to delay this
conversion or worse, fiddle the raw __u64 through your code since that conversion or worse, fiddle the raw __u64 through your code since that
diminishes the checking tools like sparse can provide. diminishes the checking tools like sparse can provide. The macro
u64_to_user_ptr can be used in the kernel to avoid warnings about integers
and pointres of different sizes.
Basics Basics
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment