[GIT PULL] remove in-kernel calls to syscalls

2018-04-02 Thread Dominik Brodowski
 to sys_getdents64()
  fs: add ksys_ioctl() helper; remove in-kernel calls to sys_ioctl()
  fs: add ksys_lseek() helper; remove in-kernel calls to sys_lseek()
  fs: add ksys_read() helper; remove in-kernel calls to sys_read()
  fs: add ksys_sync() helper; remove in-kernel calls to sys_sync()
  kernel: add ksys_unshare() helper; remove in-kernel calls to sys_unshare()
  kernel: add ksys_setsid() helper; remove in-kernel call to sys_setsid()

To reach the goal to get rid of all in-kernel calls to syscalls for x86, we
need to handle a few further syscalls called from compat syscalls in x86 and
(mostly) from other architectures. Those could be made generic making use of
Al Viro's macro trickery. For v4.17, I'd suggest to keep it simple:

  fs: add ksys_sync_file_range helper(); remove in-kernel calls to syscall
  fs: add ksys_truncate() wrapper; remove in-kernel calls to sys_truncate()
  fs: add ksys_p{read,write}64() helpers; remove in-kernel calls to syscalls
  fs: add ksys_fallocate() wrapper; remove in-kernel calls to sys_fallocate()
  mm: add ksys_fadvise64_64() helper; remove in-kernel call to 
sys_fadvise64_64()
  mm: add ksys_mmap_pgoff() helper; remove in-kernel calls to sys_mmap_pgoff()
  mm: add ksys_readahead() helper; remove in-kernel calls to sys_readahead()
  x86/ioport: add ksys_ioperm() helper; remove in-kernel calls to sys_ioperm()

Then, throw in two fixes for x86:

  x86: fix sys_sigreturn() return type to be long, not unsigned long
  x86/sigreturn: use SYSCALL_DEFINE0 (by Michael Tautschnig)

... and clean up the three places where many syscalls are referenced or
prototyped (kernel/sys_ni.c, include/linux/syscalls.h and
include/linux/compat.h):

  kexec: move sys_kexec_load() prototype to syscalls.h
  syscalls: sort syscall prototypes in include/linux/syscalls.h
  net: remove compat_sys_*() prototypes from net/compat.h
  syscalls: sort syscall prototypes in include/linux/compat.h
  syscalls/x86: auto-create compat_sys_*() prototypes
  kernel/sys_ni: sort cond_syscall() entries
  kernel/sys_ni: remove {sys_,sys_compat} from cond_syscall definitions

Last but not least, add a patch by Howard McLauchlan to whitelist all syscalls
for error injection:

  bpf: whitelist all syscalls for error injection (by Howard McLauchlan)


Dominik Brodowski (107):
  syscalls: define and explain goal to not call syscalls in the kernel
  kernel: use kernel_wait4() instead of sys_wait4()
  kernel: open-code sys_rt_sigpending() in sys_sigpending()
  kexec: call do_kexec_load() in compat syscall directly
  mm: use do_futex() instead of sys_futex() in mm_release()
  x86: use _do_fork() in compat_sys_x86_clone()
  x86: remove compat_sys_x86_waitpid()
  net: socket: add __sys_recvfrom() helper; remove in-kernel call to syscall
  net: socket: add __sys_sendto() helper; remove in-kernel call to syscall
  net: socket: add __sys_accept4() helper; remove in-kernel call to syscall
  net: socket: add __sys_socket() helper; remove in-kernel call to syscall
  net: socket: add __sys_bind() helper; remove in-kernel call to syscall
  net: socket: add __sys_connect() helper; remove in-kernel call to syscall
  net: socket: add __sys_listen() helper; remove in-kernel call to syscall
  net: socket: add __sys_getsockname() helper; remove in-kernel call to 
syscall
  net: socket: add __sys_getpeername() helper; remove in-kernel call to 
syscall
  net: socket: add __sys_socketpair() helper; remove in-kernel call to 
syscall
  net: socket: add __sys_shutdown() helper; remove in-kernel call to syscall
  net: socket: add __sys_setsockopt() helper; remove in-kernel call to 
syscall
  net: socket: add __sys_getsockopt() helper; remove in-kernel call to 
syscall
  net: socket: add do_sys_recvmmsg() helper; remove in-kernel call to 
syscall
  net: socket: move check for forbid_cmsg_compat to __sys_...msg()
  net: socket: replace calls to sys_send() with __sys_sendto()
  net: socket: replace call to sys_recv() with __sys_recvfrom()
  net: socket: add __compat_sys_recvfrom() helper; remove in-kernel call to 
compat syscall
  net: socket: add __compat_sys_setsockopt() helper; remove in-kernel call 
to compat syscall
  net: socket: add __compat_sys_getsockopt() helper; remove in-kernel call 
to compat syscall
  net: socket: add __compat_sys_recvmmsg() helper; remove in-kernel call to 
compat syscall
  net: socket: add __compat_sys_...msg() helpers; remove in-kernel calls to 
compat syscalls
  ipc: add semtimedop syscall/compat_syscall wrappers
  ipc: add semget syscall wrapper
  ipc: add semctl syscall/compat_syscall wrappers
  ipc: add msgget syscall wrapper
  ipc: add shmget syscall wrapper
  ipc: add shmdt syscall wrapper
  ipc: add shmctl syscall/compat_syscall wrappers
  ipc: add msgctl syscall/compat_syscall wrappers
  ipc: add msgrcv

Re: [PATCH 000/109] remove in-kernel calls to syscalls

2018-03-29 Thread Dominik Brodowski
On Thu, Mar 29, 2018 at 02:46:44PM +, David Laight wrote:
> From: Dominik Brodowski
> > Sent: 29 March 2018 15:42
> > On Thu, Mar 29, 2018 at 07:20:27AM -0700, Matthew Wilcox wrote:
> > > On Thu, Mar 29, 2018 at 01:22:37PM +0200, Dominik Brodowski wrote:
> > > > At least on 64-bit x86, it will likely be a hard requirement from v4.17
> > > > onwards to not call system call functions in the kernel: It is better to
> > > > use use a different calling convention for system calls there, where
> > > > struct pt_regs is decoded on-the-fly in a syscall wrapper which then 
> > > > hands
> > > > processing over to the actual syscall function. This means that only 
> > > > those
> > > > parameters which are actually needed for a specific syscall are passed 
> > > > on
> > > > during syscall entry, instead of filling in six CPU registers with 
> > > > random
> > > > user space content all the time (which may cause serious trouble down 
> > > > the
> > > > call chain).[*]
> > >
> > > How do we stop new ones from springing up?  Some kind of linker trick
> > > like was used to, er, "dissuade" people from using gets()?
> > 
> > Once the patches which modify the syscall calling convention are merged,
> > it won't compile on 64-bit x86, but bark loudly. That should frighten 
> > anyone.
> > Meow.
> 
> Should be pretty easy to ensure the prototypes aren't in any normal header.

That's exactly why the compile will fail.

> Renaming the global symbols (to not match the function name) will make it
> much harder to call them as well.

That still depends on the exact design of the patchset, which is still under
review.

Thanks,
Dominik


Re: [PATCH 000/109] remove in-kernel calls to syscalls

2018-03-29 Thread Dominik Brodowski
On Thu, Mar 29, 2018 at 07:20:27AM -0700, Matthew Wilcox wrote:
> On Thu, Mar 29, 2018 at 01:22:37PM +0200, Dominik Brodowski wrote:
> > At least on 64-bit x86, it will likely be a hard requirement from v4.17
> > onwards to not call system call functions in the kernel: It is better to
> > use use a different calling convention for system calls there, where 
> > struct pt_regs is decoded on-the-fly in a syscall wrapper which then hands
> > processing over to the actual syscall function. This means that only those
> > parameters which are actually needed for a specific syscall are passed on
> > during syscall entry, instead of filling in six CPU registers with random
> > user space content all the time (which may cause serious trouble down the
> > call chain).[*]
> 
> How do we stop new ones from springing up?  Some kind of linker trick
> like was used to, er, "dissuade" people from using gets()?

Once the patches which modify the syscall calling convention are merged,
it won't compile on 64-bit x86, but bark loudly. That should frighten anyone.
Meow.

Thanks,
Dominik


[PATCH 017/109] net: socket: add __sys_socketpair() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_socketpair() allows us to avoid the
internal calls to the sys_socketpair() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  2 +-
 net/socket.c   | 11 ---
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 9ba003e92fea..dbdddf0d079e 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -372,5 +372,7 @@ extern int __sys_getsockname(int fd, struct sockaddr __user 
*usockaddr,
 int __user *usockaddr_len);
 extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
 int __user *usockaddr_len);
+extern int __sys_socketpair(int family, int type, int protocol,
+   int __user *usockvec);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 74017f618eb1..04db26316438 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -832,7 +832,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2]));
break;
case SYS_SOCKETPAIR:
-   ret = sys_socketpair(a0, a1, a[2], compat_ptr(a[3]));
+   ret = __sys_socketpair(a0, a1, a[2], compat_ptr(a[3]));
break;
case SYS_SEND:
ret = sys_send(a0, compat_ptr(a1), a[2], a[3]);
diff --git a/net/socket.c b/net/socket.c
index 007fb9483279..5861821f46f5 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1368,8 +1368,7 @@ SYSCALL_DEFINE3(socket, int, family, int, type, int, 
protocol)
  * Create a pair of connected sockets.
  */
 
-SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
-   int __user *, usockvec)
+int __sys_socketpair(int family, int type, int protocol, int __user *usockvec)
 {
struct socket *sock1, *sock2;
int fd1, fd2, err;
@@ -1454,6 +1453,12 @@ SYSCALL_DEFINE4(socketpair, int, family, int, type, int, 
protocol,
return err;
 }
 
+SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
+   int __user *, usockvec)
+{
+   return __sys_socketpair(family, type, protocol, usockvec);
+}
+
 /*
  * Bind a name to a socket. Nothing much to do here since it's
  * the protocol's responsibility to handle the local address.
@@ -2521,7 +2526,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
  (int __user *)a[2]);
break;
case SYS_SOCKETPAIR:
-   err = sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
+   err = __sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
break;
case SYS_SEND:
err = sys_send(a0, (void __user *)a1, a[2], a[3]);
-- 
2.16.3



[PATCH 013/109] net: socket: add __sys_connect() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_connect() allows us to avoid the
internal calls to the sys_connect() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  2 +-
 net/socket.c   | 11 ---
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index e9cee272da13..7daa344d7320 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -365,5 +365,7 @@ extern int __sys_accept4(int fd, struct sockaddr __user 
*upeer_sockaddr,
 int __user *upeer_addrlen, int flags);
 extern int __sys_socket(int family, int type, int protocol);
 extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
+extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
+int addrlen);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index bba555b1d863..7ab6352268f3 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -817,7 +817,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_bind(a0, compat_ptr(a1), a[2]);
break;
case SYS_CONNECT:
-   ret = sys_connect(a0, compat_ptr(a1), a[2]);
+   ret = __sys_connect(a0, compat_ptr(a1), a[2]);
break;
case SYS_LISTEN:
ret = sys_listen(a0, a1);
diff --git a/net/socket.c b/net/socket.c
index 291cdae97341..64bdfdf6c6e7 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1633,8 +1633,7 @@ SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user 
*, upeer_sockaddr,
  * include the -EINPROGRESS status for such sockets.
  */
 
-SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
-   int, addrlen)
+int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1660,6 +1659,12 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user 
*, uservaddr,
return err;
 }
 
+SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
+   int, addrlen)
+{
+   return __sys_connect(fd, uservaddr, addrlen);
+}
+
 /*
  * Get the local address ('name') of a socket object. Move the obtained
  * name to user space.
@@ -2479,7 +2484,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_CONNECT:
-   err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
+   err = __sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_LISTEN:
err = sys_listen(a0, a1);
-- 
2.16.3



[PATCH 000/109] remove in-kernel calls to syscalls

2018-03-29 Thread Dominik Brodowski
[ While most parts of this patch set have been sent out already at least
  once, I send out *all* patches to lkml once again as this whole series
  touches several different subsystems in sensitive areas. ]

System calls are interaction points between userspace and the kernel.
Therefore, system call functions such as sys_xyzzy() or compat_sys_xyzzy()
should only be called from userspace via the syscall table, but not from
elsewhere in the kernel.

At least on 64-bit x86, it will likely be a hard requirement from v4.17
onwards to not call system call functions in the kernel: It is better to
use use a different calling convention for system calls there, where 
struct pt_regs is decoded on-the-fly in a syscall wrapper which then hands
processing over to the actual syscall function. This means that only those
parameters which are actually needed for a specific syscall are passed on
during syscall entry, instead of filling in six CPU registers with random
user space content all the time (which may cause serious trouble down the
call chain).[*]

Moreover, rules on how data may be accessed may differ between kernel data
and user data.  This is another reason why calling sys_xyzzy() is
generally a bad idea, and -- at most -- acceptable in arch-specific code.


This patchset removes all in-kernel calls to syscall functions in the
kernel with the exception of arch/. On top of this, it cleans up the
three places where many syscalls are referenced or prototyped, namely
kernel/sys_ni.c, include/linux/syscalls.h and include/linux/compat.h.
Patches 1 to 101 have been sent out earlier, namely
- part 1 ( 
http://lkml.kernel.org/r/20180315190529.20943-1-li...@dominikbrodowski.net )
- part 2 ( 
http://lkml.kernel.org/r/20180316170614.5392-1-li...@dominikbrodowski.net )
- part 3 ( 
http://lkml.kernel.org/r/20180322090059.19361-1-li...@dominikbrodowski.net ).

Changes since these earlier versions are:

- I have added a lot more documentation and improved the commit messages,
  namely to explain the naming convention and the rationale of this
  patches.

- ACKs/Reviewed-by (thanks!) were added .

- Shuffle the patches around to have them grouped together systematically:

First goes a patch which defines the goal and explains the rationale:

  syscalls: define and explain goal to not call syscalls in the kernel

A few codepaths can trivially be converted to existing in-kernel interfaces:

  kernel: use kernel_wait4() instead of sys_wait4()
  kernel: open-code sys_rt_sigpending() in sys_sigpending()
  kexec: call do_kexec_load() in compat syscall directly
  mm: use do_futex() instead of sys_futex() in mm_release()
  x86: use _do_fork() in compat_sys_x86_clone()
  x86: remove compat_sys_x86_waitpid()

Then follow many patches which only affect specfic subsystems each, and
replace sys_*() with internal helpers named __sys_*() or do_sys_*(). Let's
start with net/:

  net: socket: add __sys_recvfrom() helper; remove in-kernel call to syscall
  net: socket: add __sys_sendto() helper; remove in-kernel call to syscall
  net: socket: add __sys_accept4() helper; remove in-kernel call to syscall
  net: socket: add __sys_socket() helper; remove in-kernel call to syscall
  net: socket: add __sys_bind() helper; remove in-kernel call to syscall
  net: socket: add __sys_connect() helper; remove in-kernel call to syscall
  net: socket: add __sys_listen() helper; remove in-kernel call to syscall
  net: socket: add __sys_getsockname() helper; remove in-kernel call to syscall
  net: socket: add __sys_getpeername() helper; remove in-kernel call to syscall
  net: socket: add __sys_socketpair() helper; remove in-kernel call to syscall
  net: socket: add __sys_shutdown() helper; remove in-kernel call to syscall
  net: socket: add __sys_setsockopt() helper; remove in-kernel call to syscall
  net: socket: add __sys_getsockopt() helper; remove in-kernel call to syscall
  net: socket: add do_sys_recvmmsg() helper; remove in-kernel call to syscall
  net: socket: move check for forbid_cmsg_compat to __sys_...msg()
  net: socket: replace calls to sys_send() with __sys_sendto()
  net: socket: replace call to sys_recv() with __sys_recvfrom()
  net: socket: add __compat_sys_recvfrom() helper; remove in-kernel call to 
compat syscall
  net: socket: add __compat_sys_setsockopt() helper; remove in-kernel call to 
compat syscall
  net: socket: add __compat_sys_getsockopt() helper; remove in-kernel call to 
compat syscall
  net: socket: add __compat_sys_recvmmsg() helper; remove in-kernel call to 
compat syscall
  net: socket: add __compat_sys_...msg() helpers; remove in-kernel calls to 
compat syscalls

The changes in ipc/ are limited to this specific subsystem. The wrappers are
named ksys_*() to denote that these functions are meant as a drop-in replacement
for the syscalls.

  ipc: add semtimedop syscall/compat_syscall wrappers
  ipc: add semget syscall wrapper
  ipc: add semctl syscall/compat_syscall wrappers
  ipc: add msgget syscall 

[PATCH 020/109] net: socket: add __sys_getsockopt() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_getsockopt() allows us to avoid the
internal calls to the sys_getsockopt() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/socket.c | 14 ++
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index 5dd2e39a6cd4..a05289b1f863 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1918,8 +1918,8 @@ SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, 
optname,
  * to pass a user mode parameter for the protocols to sort out.
  */
 
-SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
-   char __user *, optval, int __user *, optlen)
+static int __sys_getsockopt(int fd, int level, int optname,
+   char __user *optval, int __user *optlen)
 {
int err, fput_needed;
struct socket *sock;
@@ -1944,6 +1944,12 @@ SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, 
optname,
return err;
 }
 
+SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
+   char __user *, optval, int __user *, optlen)
+{
+   return __sys_getsockopt(fd, level, optname, optval, optlen);
+}
+
 /*
  * Shutdown a socket.
  */
@@ -2563,8 +2569,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
break;
case SYS_GETSOCKOPT:
err =
-   sys_getsockopt(a0, a1, a[2], (char __user *)a[3],
-  (int __user *)a[4]);
+   __sys_getsockopt(a0, a1, a[2], (char __user *)a[3],
+(int __user *)a[4]);
break;
case SYS_SENDMSG:
err = sys_sendmsg(a0, (struct user_msghdr __user *)a1, a[2]);
-- 
2.16.3



[PATCH 022/109] net: socket: move check for forbid_cmsg_compat to __sys_...msg()

2018-03-29 Thread Dominik Brodowski
The non-compat codepaths for sys_...msg() verify that MSG_CMSG_COMPAT
is not set. By moving this check to the __sys_...msg() functions
(and making it dependent on a static flag passed to this function), we
can call the __sys...msg() functions instead of the syscall functions
in all cases. __sys_recvmmsg() does not need this trickery, as the
check is handled within the do_sys_recvmmsg() function internal to
net/socket.c.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 13 +
 net/compat.c   |  8 +---
 net/socket.c   | 38 +++---
 3 files changed, 37 insertions(+), 22 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index cad120e4ed4b..e2b6bd4fe977 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -346,13 +346,18 @@ extern int put_cmsg(struct msghdr*, int level, int type, 
int len, void *data);
 
 struct timespec;
 
-/* The __sys_...msg variants allow MSG_CMSG_COMPAT */
-extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned 
flags);
-extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned 
flags);
+/* The __sys_...msg variants allow MSG_CMSG_COMPAT iff
+ * forbid_cmsg_compat==false
+ */
+extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg,
+ unsigned int flags, bool forbid_cmsg_compat);
+extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg,
+ unsigned int flags, bool forbid_cmsg_compat);
 extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int 
vlen,
  unsigned int flags, struct timespec *timeout);
 extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
- unsigned int vlen, unsigned int flags);
+ unsigned int vlen, unsigned int flags,
+ bool forbid_cmsg_compat);
 
 /* helpers which do the actual work for syscalls */
 extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
diff --git a/net/compat.c b/net/compat.c
index f1ec23e9dfce..5caa48987bb2 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -736,19 +736,21 @@ static unsigned char nas[21] = {
 
 COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, 
unsigned int, flags)
 {
-   return __sys_sendmsg(fd, (struct user_msghdr __user *)msg, flags | 
MSG_CMSG_COMPAT);
+   return __sys_sendmsg(fd, (struct user_msghdr __user *)msg,
+flags | MSG_CMSG_COMPAT, false);
 }
 
 COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
   unsigned int, vlen, unsigned int, flags)
 {
return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
- flags | MSG_CMSG_COMPAT);
+ flags | MSG_CMSG_COMPAT, false);
 }
 
 COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, 
unsigned int, flags)
 {
-   return __sys_recvmsg(fd, (struct user_msghdr __user *)msg, flags | 
MSG_CMSG_COMPAT);
+   return __sys_recvmsg(fd, (struct user_msghdr __user *)msg,
+flags | MSG_CMSG_COMPAT, false);
 }
 
 COMPAT_SYSCALL_DEFINE4(recv, int, fd, void __user *, buf, compat_size_t, len, 
unsigned int, flags)
diff --git a/net/socket.c b/net/socket.c
index 54d19b0edab1..a70793a7ce78 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2137,12 +2137,16 @@ static int ___sys_sendmsg(struct socket *sock, struct 
user_msghdr __user *msg,
  * BSD sendmsg interface
  */
 
-long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned flags)
+long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
+  bool forbid_cmsg_compat)
 {
int fput_needed, err;
struct msghdr msg_sys;
struct socket *sock;
 
+   if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
+   return -EINVAL;
+
sock = sockfd_lookup_light(fd, , _needed);
if (!sock)
goto out;
@@ -2156,9 +2160,7 @@ long __sys_sendmsg(int fd, struct user_msghdr __user 
*msg, unsigned flags)
 
 SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr __user *, msg, unsigned 
int, flags)
 {
-   if (flags & MSG_CMSG_COMPAT)
-   return -EINVAL;
-   return __sys_sendmsg(fd, msg, flags);
+   return __sys_sendmsg(fd, msg, flags, true);
 }
 
 /*
@@ -2166,7 +2168,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr 
__user *, msg, unsigned int
  */
 
 int __sys_sendmmsg(int fd, struct mmsghdr __u

[PATCH 008/109] net: socket: add __sys_recvfrom() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_recvfrom() allows us to avoid the
internal calls to the sys_recvfrom() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  6 ++
 net/compat.c   |  3 ++-
 net/socket.c   | 21 +
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 9286a5a8c60c..40cc93b91628 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -353,4 +353,10 @@ extern int __sys_recvmmsg(int fd, struct mmsghdr __user 
*mmsg, unsigned int vlen
  unsigned int flags, struct timespec *timeout);
 extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
  unsigned int vlen, unsigned int flags);
+
+/* helpers which do the actual work for syscalls */
+extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
+ unsigned int flags, struct sockaddr __user *addr,
+ int __user *addr_len);
+
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 22381719718c..2d8186c277b2 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -760,7 +760,8 @@ COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, 
buf, compat_size_t, len
   unsigned int, flags, struct sockaddr __user *, addr,
   int __user *, addrlen)
 {
-   return sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr, 
addrlen);
+   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr,
+ addrlen);
 }
 
 COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
diff --git a/net/socket.c b/net/socket.c
index a93c99b518ca..712d99d8680f 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1767,10 +1767,8 @@ SYSCALL_DEFINE4(send, int, fd, void __user *, buff, 
size_t, len,
  * sender. We verify the buffers are writable and if needed move the
  * sender address from kernel to user space.
  */
-
-SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
-   unsigned int, flags, struct sockaddr __user *, addr,
-   int __user *, addr_len)
+int __sys_recvfrom(int fd, void __user *ubuf, size_t size, unsigned int flags,
+  struct sockaddr __user *addr, int __user *addr_len)
 {
struct socket *sock;
struct iovec iov;
@@ -1810,6 +1808,13 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, 
size_t, size,
return err;
 }
 
+SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
+   unsigned int, flags, struct sockaddr __user *, addr,
+   int __user *, addr_len)
+{
+   return __sys_recvfrom(fd, ubuf, size, flags, addr, addr_len);
+}
+
 /*
  * Receive a datagram from a socket.
  */
@@ -1817,7 +1822,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, 
size_t, size,
 SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, size_t, size,
unsigned int, flags)
 {
-   return sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
+   return __sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
 }
 
 /*
@@ -2486,9 +2491,9 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
break;
case SYS_RECVFROM:
-   err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
-  (struct sockaddr __user *)a[4],
-  (int __user *)a[5]);
+   err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
+(struct sockaddr __user *)a[4],
+(int __user *)a[5]);
break;
case SYS_SHUTDOWN:
err = sys_shutdown(a0, a1);
-- 
2.16.3



[PATCH 019/109] net: socket: add __sys_setsockopt() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_setsockopt() allows us to avoid the
internal calls to the sys_setsockopt() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  1 +
 net/socket.c   | 13 ++---
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index b205138b69f1..cad120e4ed4b 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -376,4 +376,5 @@ extern int __sys_socketpair(int family, int type, int 
protocol,
int __user *usockvec);
 extern int __sys_shutdown(int fd, int how);
 
+
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/socket.c b/net/socket.c
index ad5dfd6a1d59..5dd2e39a6cd4 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1878,8 +1878,8 @@ SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, 
size_t, size,
  * to pass the user mode parameter for the protocols to sort out.
  */
 
-SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
-   char __user *, optval, int, optlen)
+static int __sys_setsockopt(int fd, int level, int optname,
+   char __user *optval, int optlen)
 {
int err, fput_needed;
struct socket *sock;
@@ -1907,6 +1907,12 @@ SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, 
optname,
return err;
 }
 
+SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
+   char __user *, optval, int, optlen)
+{
+   return __sys_setsockopt(fd, level, optname, optval, optlen);
+}
+
 /*
  * Get a socket option. Because we don't know the option lengths we have
  * to pass a user mode parameter for the protocols to sort out.
@@ -2552,7 +2558,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_shutdown(a0, a1);
break;
case SYS_SETSOCKOPT:
-   err = sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]);
+   err = __sys_setsockopt(a0, a1, a[2], (char __user *)a[3],
+  a[4]);
break;
case SYS_GETSOCKOPT:
err =
-- 
2.16.3



[PATCH 015/109] net: socket: add __sys_getsockname() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_getsockname() allows us to avoid the
internal calls to the sys_getsockname() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  2 +-
 net/socket.c   | 14 ++
 3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 7e37af25509d..ef0226a61b03 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -368,5 +368,7 @@ extern int __sys_bind(int fd, struct sockaddr __user 
*umyaddr, int addrlen);
 extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
 int addrlen);
 extern int __sys_listen(int fd, int backlog);
+extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
+int __user *usockaddr_len);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index c80cb973f383..efd28d02608c 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -826,7 +826,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
break;
case SYS_GETSOCKNAME:
-   ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
+   ret = __sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
break;
case SYS_GETPEERNAME:
ret = sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2]));
diff --git a/net/socket.c b/net/socket.c
index 67d9d70a4734..b61e0d20f37b 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1675,8 +1675,8 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user 
*, uservaddr,
  * name to user space.
  */
 
-SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
-   int __user *, usockaddr_len)
+int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
+ int __user *usockaddr_len)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1701,6 +1701,12 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr 
__user *, usockaddr,
return err;
 }
 
+SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
+   int __user *, usockaddr_len)
+{
+   return __sys_getsockname(fd, usockaddr, usockaddr_len);
+}
+
 /*
  * Get the remote address ('name') of a socket object. Move the obtained
  * name to user space.
@@ -2500,8 +2506,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
break;
case SYS_GETSOCKNAME:
err =
-   sys_getsockname(a0, (struct sockaddr __user *)a1,
-   (int __user *)a[2]);
+   __sys_getsockname(a0, (struct sockaddr __user *)a1,
+ (int __user *)a[2]);
break;
case SYS_GETPEERNAME:
err =
-- 
2.16.3



[PATCH 021/109] net: socket: add do_sys_recvmmsg() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper do_sys_recvmmsg() allows us to avoid the
internal calls to the sys_getsockopt() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/socket.c | 17 -
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index a05289b1f863..54d19b0edab1 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2445,9 +2445,9 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, 
unsigned int vlen,
return datagrams;
 }
 
-SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
-   unsigned int, vlen, unsigned int, flags,
-   struct timespec __user *, timeout)
+static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
+  unsigned int vlen, unsigned int flags,
+  struct timespec __user *timeout)
 {
int datagrams;
struct timespec timeout_sys;
@@ -2470,6 +2470,13 @@ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user 
*, mmsg,
return datagrams;
 }
 
+SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
+   unsigned int, vlen, unsigned int, flags,
+   struct timespec __user *, timeout)
+{
+   return do_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
+}
+
 #ifdef __ARCH_WANT_SYS_SOCKETCALL
 /* Argument list sizes for sys_socketcall */
 #define AL(x) ((x) * sizeof(unsigned long))
@@ -2582,8 +2589,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = sys_recvmsg(a0, (struct user_msghdr __user *)a1, a[2]);
break;
case SYS_RECVMMSG:
-   err = sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3],
-  (struct timespec __user *)a[4]);
+   err = do_sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2],
+ a[3], (struct timespec __user *)a[4]);
break;
case SYS_ACCEPT4:
err = __sys_accept4(a0, (struct sockaddr __user *)a1,
-- 
2.16.3



[PATCH 010/109] net: socket: add __sys_accept4() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_accept4() allows us to avoid the
internal calls to the sys_accept4() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  4 ++--
 net/socket.c   | 20 +---
 3 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 54b85abc7265..6a9840271676 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -361,5 +361,7 @@ extern int __sys_recvfrom(int fd, void __user *ubuf, size_t 
size,
 extern int __sys_sendto(int fd, void __user *buff, size_t len,
unsigned int flags, struct sockaddr __user *addr,
int addr_len);
+extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
+int __user *upeer_addrlen, int flags);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index fc82982d9b84..0ff9f7451b6f 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -823,7 +823,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = sys_listen(a0, a1);
break;
case SYS_ACCEPT:
-   ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
+   ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
break;
case SYS_GETSOCKNAME:
ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
@@ -873,7 +873,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
  compat_ptr(a[4]));
break;
case SYS_ACCEPT4:
-   ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]);
+   ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]);
break;
default:
ret = -EINVAL;
diff --git a/net/socket.c b/net/socket.c
index 3f037a21ba5e..45f6ea0d57a5 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1519,8 +1519,8 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog)
  * clean when we restucture accept also.
  */
 
-SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
-   int __user *, upeer_addrlen, int, flags)
+int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
+ int __user *upeer_addrlen, int flags)
 {
struct socket *sock, *newsock;
struct file *newfile;
@@ -1599,10 +1599,16 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr 
__user *, upeer_sockaddr,
goto out_put;
 }
 
+SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
+   int __user *, upeer_addrlen, int, flags)
+{
+   return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, flags);
+}
+
 SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr,
int __user *, upeer_addrlen)
 {
-   return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
+   return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
 }
 
 /*
@@ -2469,8 +2475,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = sys_listen(a0, a1);
break;
case SYS_ACCEPT:
-   err = sys_accept4(a0, (struct sockaddr __user *)a1,
- (int __user *)a[2], 0);
+   err = __sys_accept4(a0, (struct sockaddr __user *)a1,
+   (int __user *)a[2], 0);
break;
case SYS_GETSOCKNAME:
err =
@@ -2525,8 +2531,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
   (struct timespec __user *)a[4]);
break;
case SYS_ACCEPT4:
-   err = sys_accept4(a0, (struct sockaddr __user *)a1,
- (int __user *)a[2], a[3]);
+   err = __sys_accept4(a0, (struct sockaddr __user *)a1,
+   (int __user *)a[2], a[3]);
break;
default:
err = -EINVAL;
-- 
2.16.3



[PATCH 027/109] net: socket: add __compat_sys_getsockopt() helper; remove in-kernel call to compat syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __compat_sys_getsockopt() allows us to avoid
the internal calls to the compat_sys_getsockopt() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 16 
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 75bfcbbb2e3e..cdf5b0c1b962 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -509,8 +509,9 @@ int compat_sock_get_timestampns(struct sock *sk, struct 
timespec __user *usersta
 }
 EXPORT_SYMBOL(compat_sock_get_timestampns);
 
-COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
-  char __user *, optval, int __user *, optlen)
+static int __compat_sys_getsockopt(int fd, int level, int optname,
+  char __user *optval,
+  int __user *optlen)
 {
int err;
struct socket *sock = sockfd_lookup(fd, );
@@ -536,6 +537,12 @@ COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, 
int, optname,
return err;
 }
 
+COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
+  char __user *, optval, int __user *, optlen)
+{
+   return __compat_sys_getsockopt(fd, level, optname, optval, optlen);
+}
+
 struct compat_group_req {
__u32gr_interface;
struct __kernel_sockaddr_storage gr_group
@@ -874,8 +881,9 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
  compat_ptr(a[3]), a[4]);
break;
case SYS_GETSOCKOPT:
-   ret = compat_sys_getsockopt(a0, a1, a[2],
-   compat_ptr(a[3]), compat_ptr(a[4]));
+   ret = __compat_sys_getsockopt(a0, a1, a[2],
+ compat_ptr(a[3]),
+ compat_ptr(a[4]));
break;
case SYS_SENDMSG:
ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
-- 
2.16.3



[PATCH 025/109] net: socket: add __compat_sys_recvfrom() helper; remove in-kernel call to compat syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __compat_sys_recvfrom() allows us to avoid
the internal calls to the compat_sys_recvfrom() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 23 ---
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 9e0d030063ad..513adc8d0e0f 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -753,18 +753,25 @@ COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct 
compat_msghdr __user *, msg, uns
 flags | MSG_CMSG_COMPAT, false);
 }
 
+static inline long __compat_sys_recvfrom(int fd, void __user *buf,
+compat_size_t len, unsigned int flags,
+struct sockaddr __user *addr,
+int __user *addrlen)
+{
+   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr,
+ addrlen);
+}
+
 COMPAT_SYSCALL_DEFINE4(recv, int, fd, void __user *, buf, compat_size_t, len, 
unsigned int, flags)
 {
-   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, NULL,
- NULL);
+   return __compat_sys_recvfrom(fd, buf, len, flags, NULL, NULL);
 }
 
 COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, 
len,
   unsigned int, flags, struct sockaddr __user *, addr,
   int __user *, addrlen)
 {
-   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr,
- addrlen);
+   return __compat_sys_recvfrom(fd, buf, len, flags, addr, addrlen);
 }
 
 COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
@@ -845,11 +852,13 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user 
*, args)
   compat_ptr(a[4]), a[5]);
break;
case SYS_RECV:
-   ret = compat_sys_recv(a0, compat_ptr(a1), a[2], a[3]);
+   ret = __compat_sys_recvfrom(a0, compat_ptr(a1), a[2], a[3],
+   NULL, NULL);
break;
case SYS_RECVFROM:
-   ret = compat_sys_recvfrom(a0, compat_ptr(a1), a[2], a[3],
- compat_ptr(a[4]), compat_ptr(a[5]));
+   ret = __compat_sys_recvfrom(a0, compat_ptr(a1), a[2], a[3],
+   compat_ptr(a[4]),
+   compat_ptr(a[5]));
break;
case SYS_SHUTDOWN:
ret = __sys_shutdown(a0, a1);
-- 
2.16.3



[PATCH 012/109] net: socket: add __sys_bind() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_bind() allows us to avoid the
internal calls to the sys_bind() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 1 +
 net/compat.c   | 2 +-
 net/socket.c   | 9 +++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index f8d040434a13..e9cee272da13 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -364,5 +364,6 @@ extern int __sys_sendto(int fd, void __user *buff, size_t 
len,
 extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
 int __user *upeer_addrlen, int flags);
 extern int __sys_socket(int family, int type, int protocol);
+extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 5b3b74c5812e..bba555b1d863 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -814,7 +814,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_socket(a0, a1, a[2]);
break;
case SYS_BIND:
-   ret = sys_bind(a0, compat_ptr(a1), a[2]);
+   ret = __sys_bind(a0, compat_ptr(a1), a[2]);
break;
case SYS_CONNECT:
ret = sys_connect(a0, compat_ptr(a1), a[2]);
diff --git a/net/socket.c b/net/socket.c
index 07f379e50def..291cdae97341 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1462,7 +1462,7 @@ SYSCALL_DEFINE4(socketpair, int, family, int, type, int, 
protocol,
  * the protocol layer (having also checked the address is ok).
  */
 
-SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
+int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1485,6 +1485,11 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, 
umyaddr, int, addrlen)
return err;
 }
 
+SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
+{
+   return __sys_bind(fd, umyaddr, addrlen);
+}
+
 /*
  * Perform a listen. Basically, we allow the protocol to do anything
  * necessary for a listen, and if that works, we mark the socket as
@@ -2471,7 +2476,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_socket(a0, a1, a[2]);
break;
case SYS_BIND:
-   err = sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
+   err = __sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_CONNECT:
err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
-- 
2.16.3



[PATCH 029/109] net: socket: add __compat_sys_...msg() helpers; remove in-kernel calls to compat syscalls

2018-03-29 Thread Dominik Brodowski
Using the net-internal helpers __compat_sys_...msg() allows us to avoid
the internal calls to the compat_sys_...msg() syscalls.
compat_sys_recvmmsg() is handled in a different patch.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 37 ++---
 1 file changed, 30 insertions(+), 7 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 7b2ae42a1598..5ae7437d3853 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -747,25 +747,48 @@ static unsigned char nas[21] = {
 };
 #undef AL
 
-COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, 
unsigned int, flags)
+static inline long __compat_sys_sendmsg(int fd,
+   struct compat_msghdr __user *msg,
+   unsigned int flags)
 {
return __sys_sendmsg(fd, (struct user_msghdr __user *)msg,
 flags | MSG_CMSG_COMPAT, false);
 }
 
-COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
-  unsigned int, vlen, unsigned int, flags)
+COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg,
+  unsigned int, flags)
+{
+   return __compat_sys_sendmsg(fd, msg, flags);
+}
+
+static inline long __compat_sys_sendmmsg(int fd,
+struct compat_mmsghdr __user *mmsg,
+unsigned int vlen, unsigned int flags)
 {
return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
  flags | MSG_CMSG_COMPAT, false);
 }
 
-COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, 
unsigned int, flags)
+COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
+  unsigned int, vlen, unsigned int, flags)
+{
+   return __compat_sys_sendmmsg(fd, mmsg, vlen, flags);
+}
+
+static inline long __compat_sys_recvmsg(int fd,
+   struct compat_msghdr __user *msg,
+   unsigned int flags)
 {
return __sys_recvmsg(fd, (struct user_msghdr __user *)msg,
 flags | MSG_CMSG_COMPAT, false);
 }
 
+COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg,
+  unsigned int, flags)
+{
+   return __compat_sys_recvmsg(fd, msg, flags);
+}
+
 static inline long __compat_sys_recvfrom(int fd, void __user *buf,
 compat_size_t len, unsigned int flags,
 struct sockaddr __user *addr,
@@ -893,13 +916,13 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user 
*, args)
  compat_ptr(a[4]));
break;
case SYS_SENDMSG:
-   ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
+   ret = __compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
break;
case SYS_SENDMMSG:
-   ret = compat_sys_sendmmsg(a0, compat_ptr(a1), a[2], a[3]);
+   ret = __compat_sys_sendmmsg(a0, compat_ptr(a1), a[2], a[3]);
break;
case SYS_RECVMSG:
-   ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
+   ret = __compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
break;
case SYS_RECVMMSG:
ret = __compat_sys_recvmmsg(a0, compat_ptr(a1), a[2], a[3],
-- 
2.16.3



[PATCH 104/109] net: remove compat_sys_*() prototypes from net/compat.h

2018-03-29 Thread Dominik Brodowski
As the syscall functions should only be called from the system call table
but not from elsewhere in the kernel, it is sufficient that they are
defined in linux/compat.h.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/net/compat.h | 11 ---
 1 file changed, 11 deletions(-)

diff --git a/include/net/compat.h b/include/net/compat.h
index a91bea80b9fc..4c6d75612b6c 100644
--- a/include/net/compat.h
+++ b/include/net/compat.h
@@ -44,17 +44,6 @@ int compat_sock_get_timestampns(struct sock *, struct 
timespec __user *);
 int get_compat_msghdr(struct msghdr *, struct compat_msghdr __user *,
  struct sockaddr __user **, struct iovec **);
 struct sock_fprog __user *get_compat_bpf_fprog(char __user *optval);
-asmlinkage long compat_sys_sendmsg(int, struct compat_msghdr __user *,
-  unsigned int);
-asmlinkage long compat_sys_sendmmsg(int, struct compat_mmsghdr __user *,
-   unsigned int, unsigned int);
-asmlinkage long compat_sys_recvmsg(int, struct compat_msghdr __user *,
-  unsigned int);
-asmlinkage long compat_sys_recvmmsg(int, struct compat_mmsghdr __user *,
-   unsigned int, unsigned int,
-   struct compat_timespec __user *);
-asmlinkage long compat_sys_getsockopt(int, int, int, char __user *,
- int __user *);
 int put_cmsg_compat(struct msghdr*, int, int, int, void *);
 
 int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *,
-- 
2.16.3



[PATCH 023/109] net: socket: replace calls to sys_send() with __sys_sendto()

2018-03-29 Thread Dominik Brodowski
sys_send() merely expands the parameters to __sys_sendto() by NULL and 0.
Open-code this in the two places which used sys_send() as a wrapper to
__sys_sendto().

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 2 +-
 net/socket.c | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 5caa48987bb2..d55982ff5c59 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -837,7 +837,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_socketpair(a0, a1, a[2], compat_ptr(a[3]));
break;
case SYS_SEND:
-   ret = sys_send(a0, compat_ptr(a1), a[2], a[3]);
+   ret = __sys_sendto(a0, compat_ptr(a1), a[2], a[3], NULL, 0);
break;
case SYS_SENDTO:
ret = __sys_sendto(a0, compat_ptr(a1), a[2], a[3],
diff --git a/net/socket.c b/net/socket.c
index a70793a7ce78..92de21bb1a2e 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2558,7 +2558,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
break;
case SYS_SEND:
-   err = sys_send(a0, (void __user *)a1, a[2], a[3]);
+   err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
+  NULL, 0);
break;
case SYS_SENDTO:
err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
-- 
2.16.3



[PATCH 011/109] net: socket: add __sys_socket() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_socket() allows us to avoid the
internal calls to the sys_socket() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 1 +
 net/compat.c   | 2 +-
 net/socket.c   | 9 +++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 6a9840271676..f8d040434a13 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -363,5 +363,6 @@ extern int __sys_sendto(int fd, void __user *buff, size_t 
len,
int addr_len);
 extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
 int __user *upeer_addrlen, int flags);
+extern int __sys_socket(int family, int type, int protocol);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 0ff9f7451b6f..5b3b74c5812e 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -811,7 +811,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
 
switch (call) {
case SYS_SOCKET:
-   ret = sys_socket(a0, a1, a[2]);
+   ret = __sys_socket(a0, a1, a[2]);
break;
case SYS_BIND:
ret = sys_bind(a0, compat_ptr(a1), a[2]);
diff --git a/net/socket.c b/net/socket.c
index 45f6ea0d57a5..07f379e50def 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1332,7 +1332,7 @@ int sock_create_kern(struct net *net, int family, int 
type, int protocol, struct
 }
 EXPORT_SYMBOL(sock_create_kern);
 
-SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
+int __sys_socket(int family, int type, int protocol)
 {
int retval;
struct socket *sock;
@@ -1359,6 +1359,11 @@ SYSCALL_DEFINE3(socket, int, family, int, type, int, 
protocol)
return sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
 }
 
+SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
+{
+   return __sys_socket(family, type, protocol);
+}
+
 /*
  * Create a pair of connected sockets.
  */
@@ -2463,7 +2468,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
 
switch (call) {
case SYS_SOCKET:
-   err = sys_socket(a0, a1, a[2]);
+   err = __sys_socket(a0, a1, a[2]);
break;
case SYS_BIND:
err = sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
-- 
2.16.3



[PATCH 018/109] net: socket: add __sys_shutdown() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_shutdown() allows us to avoid the
internal calls to the sys_shutdown() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 1 +
 net/compat.c   | 2 +-
 net/socket.c   | 9 +++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index dbdddf0d079e..b205138b69f1 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -374,5 +374,6 @@ extern int __sys_getpeername(int fd, struct sockaddr __user 
*usockaddr,
 int __user *usockaddr_len);
 extern int __sys_socketpair(int family, int type, int protocol,
int __user *usockvec);
+extern int __sys_shutdown(int fd, int how);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 04db26316438..f1ec23e9dfce 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -849,7 +849,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
  compat_ptr(a[4]), compat_ptr(a[5]));
break;
case SYS_SHUTDOWN:
-   ret = sys_shutdown(a0, a1);
+   ret = __sys_shutdown(a0, a1);
break;
case SYS_SETSOCKOPT:
ret = compat_sys_setsockopt(a0, a1, a[2],
diff --git a/net/socket.c b/net/socket.c
index 5861821f46f5..ad5dfd6a1d59 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1942,7 +1942,7 @@ SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, 
optname,
  * Shutdown a socket.
  */
 
-SYSCALL_DEFINE2(shutdown, int, fd, int, how)
+int __sys_shutdown(int fd, int how)
 {
int err, fput_needed;
struct socket *sock;
@@ -1957,6 +1957,11 @@ SYSCALL_DEFINE2(shutdown, int, fd, int, how)
return err;
 }
 
+SYSCALL_DEFINE2(shutdown, int, fd, int, how)
+{
+   return __sys_shutdown(fd, how);
+}
+
 /* A couple of helpful macros for getting the address of the 32/64 bit
  * fields which are the same type (int / unsigned) on our platforms.
  */
@@ -2544,7 +2549,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
 (int __user *)a[5]);
break;
case SYS_SHUTDOWN:
-   err = sys_shutdown(a0, a1);
+   err = __sys_shutdown(a0, a1);
break;
case SYS_SETSOCKOPT:
err = sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]);
-- 
2.16.3



[PATCH 014/109] net: socket: add __sys_listen() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_listen() allows us to avoid the
internal calls to the sys_listen() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 1 +
 net/compat.c   | 2 +-
 net/socket.c   | 9 +++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 7daa344d7320..7e37af25509d 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -367,5 +367,6 @@ extern int __sys_socket(int family, int type, int protocol);
 extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
 extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
 int addrlen);
+extern int __sys_listen(int fd, int backlog);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 7ab6352268f3..c80cb973f383 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -820,7 +820,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_connect(a0, compat_ptr(a1), a[2]);
break;
case SYS_LISTEN:
-   ret = sys_listen(a0, a1);
+   ret = __sys_listen(a0, a1);
break;
case SYS_ACCEPT:
ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
diff --git a/net/socket.c b/net/socket.c
index 64bdfdf6c6e7..67d9d70a4734 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1496,7 +1496,7 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, 
umyaddr, int, addrlen)
  * ready for listening.
  */
 
-SYSCALL_DEFINE2(listen, int, fd, int, backlog)
+int __sys_listen(int fd, int backlog)
 {
struct socket *sock;
int err, fput_needed;
@@ -1517,6 +1517,11 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog)
return err;
 }
 
+SYSCALL_DEFINE2(listen, int, fd, int, backlog)
+{
+   return __sys_listen(fd, backlog);
+}
+
 /*
  * For accept, we attempt to create a new socket, set up the link
  * with the client, wake up the client, then return the new
@@ -2487,7 +2492,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_LISTEN:
-   err = sys_listen(a0, a1);
+   err = __sys_listen(a0, a1);
break;
case SYS_ACCEPT:
err = __sys_accept4(a0, (struct sockaddr __user *)a1,
-- 
2.16.3



[PATCH 009/109] net: socket: add __sys_sendto() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_sendto() allows us to avoid the
internal calls to the sys_sendto() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  3 +++
 net/compat.c   |  3 ++-
 net/socket.c   | 19 ---
 3 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 40cc93b91628..54b85abc7265 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -358,5 +358,8 @@ extern int __sys_sendmmsg(int fd, struct mmsghdr __user 
*mmsg,
 extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
  unsigned int flags, struct sockaddr __user *addr,
  int __user *addr_len);
+extern int __sys_sendto(int fd, void __user *buff, size_t len,
+   unsigned int flags, struct sockaddr __user *addr,
+   int addr_len);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 2d8186c277b2..fc82982d9b84 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -838,7 +838,8 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = sys_send(a0, compat_ptr(a1), a[2], a[3]);
break;
case SYS_SENDTO:
-   ret = sys_sendto(a0, compat_ptr(a1), a[2], a[3], 
compat_ptr(a[4]), a[5]);
+   ret = __sys_sendto(a0, compat_ptr(a1), a[2], a[3],
+  compat_ptr(a[4]), a[5]);
break;
case SYS_RECV:
ret = compat_sys_recv(a0, compat_ptr(a1), a[2], a[3]);
diff --git a/net/socket.c b/net/socket.c
index 712d99d8680f..3f037a21ba5e 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1711,10 +1711,8 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr 
__user *, usockaddr,
  * space and check the user space data area is readable before invoking
  * the protocol.
  */
-
-SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
-   unsigned int, flags, struct sockaddr __user *, addr,
-   int, addr_len)
+int __sys_sendto(int fd, void __user *buff, size_t len, unsigned int flags,
+struct sockaddr __user *addr,  int addr_len)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1752,6 +1750,13 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, 
size_t, len,
return err;
 }
 
+SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
+   unsigned int, flags, struct sockaddr __user *, addr,
+   int, addr_len)
+{
+   return __sys_sendto(fd, buff, len, flags, addr, addr_len);
+}
+
 /*
  * Send a datagram down a socket.
  */
@@ -1759,7 +1764,7 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, 
size_t, len,
 SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
unsigned int, flags)
 {
-   return sys_sendto(fd, buff, len, flags, NULL, 0);
+   return __sys_sendto(fd, buff, len, flags, NULL, 0);
 }
 
 /*
@@ -2484,8 +2489,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = sys_send(a0, (void __user *)a1, a[2], a[3]);
break;
case SYS_SENDTO:
-   err = sys_sendto(a0, (void __user *)a1, a[2], a[3],
-(struct sockaddr __user *)a[4], a[5]);
+   err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
+  (struct sockaddr __user *)a[4], a[5]);
break;
case SYS_RECV:
err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
-- 
2.16.3



[PATCH 016/109] net: socket: add __sys_getpeername() helper; remove in-kernel call to syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __sys_getpeername() allows us to avoid the
internal calls to the sys_getpeername() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  2 +-
 net/socket.c   | 14 ++
 3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index ef0226a61b03..9ba003e92fea 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -370,5 +370,7 @@ extern int __sys_connect(int fd, struct sockaddr __user 
*uservaddr,
 extern int __sys_listen(int fd, int backlog);
 extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
 int __user *usockaddr_len);
+extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
+int __user *usockaddr_len);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index efd28d02608c..74017f618eb1 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -829,7 +829,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
break;
case SYS_GETPEERNAME:
-   ret = sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2]));
+   ret = __sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2]));
break;
case SYS_SOCKETPAIR:
ret = sys_socketpair(a0, a1, a[2], compat_ptr(a[3]));
diff --git a/net/socket.c b/net/socket.c
index b61e0d20f37b..007fb9483279 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1712,8 +1712,8 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr 
__user *, usockaddr,
  * name to user space.
  */
 
-SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
-   int __user *, usockaddr_len)
+int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
+ int __user *usockaddr_len)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1738,6 +1738,12 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr 
__user *, usockaddr,
return err;
 }
 
+SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
+   int __user *, usockaddr_len)
+{
+   return __sys_getpeername(fd, usockaddr, usockaddr_len);
+}
+
 /*
  * Send a datagram to a given address. We move the address into kernel
  * space and check the user space data area is readable before invoking
@@ -2511,8 +2517,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
break;
case SYS_GETPEERNAME:
err =
-   sys_getpeername(a0, (struct sockaddr __user *)a1,
-   (int __user *)a[2]);
+   __sys_getpeername(a0, (struct sockaddr __user *)a1,
+ (int __user *)a[2]);
break;
case SYS_SOCKETPAIR:
err = sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
-- 
2.16.3



[PATCH 026/109] net: socket: add __compat_sys_setsockopt() helper; remove in-kernel call to compat syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __compat_sys_setsockopt() allows us to avoid
the internal calls to the compat_sys_setsockopt() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 14 ++
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 513adc8d0e0f..75bfcbbb2e3e 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -383,8 +383,8 @@ static int compat_sock_setsockopt(struct socket *sock, int 
level, int optname,
return sock_setsockopt(sock, level, optname, optval, optlen);
 }
 
-COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
-  char __user *, optval, unsigned int, optlen)
+static int __compat_sys_setsockopt(int fd, int level, int optname,
+  char __user *optval, unsigned int optlen)
 {
int err;
struct socket *sock = sockfd_lookup(fd, );
@@ -410,6 +410,12 @@ COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, 
int, optname,
return err;
 }
 
+COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
+  char __user *, optval, unsigned int, optlen)
+{
+   return __compat_sys_setsockopt(fd, level, optname, optval, optlen);
+}
+
 static int do_get_sock_timeout(struct socket *sock, int level, int optname,
char __user *optval, int __user *optlen)
 {
@@ -864,8 +870,8 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_shutdown(a0, a1);
break;
case SYS_SETSOCKOPT:
-   ret = compat_sys_setsockopt(a0, a1, a[2],
-   compat_ptr(a[3]), a[4]);
+   ret = __compat_sys_setsockopt(a0, a1, a[2],
+ compat_ptr(a[3]), a[4]);
break;
case SYS_GETSOCKOPT:
ret = compat_sys_getsockopt(a0, a1, a[2],
-- 
2.16.3



[PATCH 024/109] net: socket: replace call to sys_recv() with __sys_recvfrom()

2018-03-29 Thread Dominik Brodowski
sys_recv() merely expands the parameters to __sys_recvfrom() by NULL and
NULL. Open-code this in the two places which used sys_recv() as a wrapper
to __sys_recvfrom().

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 3 ++-
 net/socket.c | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index d55982ff5c59..9e0d030063ad 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -755,7 +755,8 @@ COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct 
compat_msghdr __user *, msg, uns
 
 COMPAT_SYSCALL_DEFINE4(recv, int, fd, void __user *, buf, compat_size_t, len, 
unsigned int, flags)
 {
-   return sys_recv(fd, buf, len, flags | MSG_CMSG_COMPAT);
+   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, NULL,
+ NULL);
 }
 
 COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, 
len,
diff --git a/net/socket.c b/net/socket.c
index 92de21bb1a2e..03702f08aa62 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2566,7 +2566,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
   (struct sockaddr __user *)a[4], a[5]);
break;
case SYS_RECV:
-   err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
+   err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
+NULL, NULL);
break;
case SYS_RECVFROM:
err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
-- 
2.16.3



[PATCH 028/109] net: socket: add __compat_sys_recvmmsg() helper; remove in-kernel call to compat syscall

2018-03-29 Thread Dominik Brodowski
Using the net-internal helper __compat_sys_recvmmsg() allows us to avoid
the internal calls to the compat_sys_recvmmsg() syscall.

This patch is part of a series which removes in-kernel calls to syscalls.
On this basis, the syscall entry path can be streamlined. For details, see
http://lkml.kernel.org/r/20180325162527.ga17...@light.dominikbrodowski.net

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 17 -
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index cdf5b0c1b962..7b2ae42a1598 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -787,9 +787,9 @@ COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, 
buf, compat_size_t, len
return __compat_sys_recvfrom(fd, buf, len, flags, addr, addrlen);
 }
 
-COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
-  unsigned int, vlen, unsigned int, flags,
-  struct compat_timespec __user *, timeout)
+static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
+unsigned int vlen, unsigned int flags,
+struct compat_timespec __user *timeout)
 {
int datagrams;
struct timespec ktspec;
@@ -809,6 +809,13 @@ COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct 
compat_mmsghdr __user *, mmsg,
return datagrams;
 }
 
+COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
+  unsigned int, vlen, unsigned int, flags,
+  struct compat_timespec __user *, timeout)
+{
+   return __compat_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
+}
+
 COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args)
 {
u32 a[AUDITSC_ARGS];
@@ -895,8 +902,8 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
break;
case SYS_RECVMMSG:
-   ret = compat_sys_recvmmsg(a0, compat_ptr(a1), a[2], a[3],
- compat_ptr(a[4]));
+   ret = __compat_sys_recvmmsg(a0, compat_ptr(a1), a[2], a[3],
+   compat_ptr(a[4]));
break;
case SYS_ACCEPT4:
ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]);
-- 
2.16.3



[PATCH 106/109] syscalls/x86: auto-create compat_sys_*() prototypes

2018-03-29 Thread Dominik Brodowski
compat_sys_*() functions are no longer called from within the kernel on
x86 except from the system call table. Linking the system call does not
require compat_sys_*() function prototypes at least on x86. Therefore,
generate compat_sys_*() prototypes on-the-fly within the
COMPAT_SYSCALL_DEFINEx() macro, and remove x86-specific prototypes from
various header files.

Suggested-by: Andy Lutomirski <l...@kernel.org>
Cc: Arnd Bergmann <a...@arndb.de>
Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Andi Kleen <a...@linux.intel.com>
Cc: Ingo Molnar <mi...@redhat.com>
Cc: Andrew Morton <a...@linux-foundation.org>
Cc: Al Viro <v...@zeniv.linux.org.uk>
Cc: x...@kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 arch/x86/ia32/ia32_signal.c |  1 -
 arch/x86/ia32/sys_ia32.c|  2 +-
 arch/x86/include/asm/sys_ia32.h | 64 -
 include/linux/compat.h  | 17 ++-
 4 files changed, 4 insertions(+), 80 deletions(-)
 delete mode 100644 arch/x86/include/asm/sys_ia32.h

diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index 41c671854642..86b1341cba9a 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -33,7 +33,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 
 /*
diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c
index bd8a7020b9a7..11ef7b7c9cc8 100644
--- a/arch/x86/ia32/sys_ia32.c
+++ b/arch/x86/ia32/sys_ia32.c
@@ -47,7 +47,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 
 #define AA(__x)((unsigned long)(__x))
 
diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h
deleted file mode 100644
index 2ee6e3b96656..
--- a/arch/x86/include/asm/sys_ia32.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * sys_ia32.h - Linux ia32 syscall interfaces
- *
- * Copyright (c) 2008 Jaswinder Singh Rajput
- *
- * This file is released under the GPLv2.
- * See the file COPYING for more details.
- */
-
-#ifndef _ASM_X86_SYS_IA32_H
-#define _ASM_X86_SYS_IA32_H
-
-#ifdef CONFIG_COMPAT
-
-#include 
-#include 
-#include 
-#include 
-#include 
-#include 
-
-/* ia32/sys_ia32.c */
-asmlinkage long compat_sys_x86_truncate64(const char __user *, unsigned long,
- unsigned long);
-asmlinkage long compat_sys_x86_ftruncate64(unsigned int, unsigned long,
-  unsigned long);
-
-asmlinkage long compat_sys_x86_stat64(const char __user *,
- struct stat64 __user *);
-asmlinkage long compat_sys_x86_lstat64(const char __user *,
-  struct stat64 __user *);
-asmlinkage long compat_sys_x86_fstat64(unsigned int, struct stat64 __user *);
-asmlinkage long compat_sys_x86_fstatat(unsigned int, const char __user *,
- struct stat64 __user *, int);
-struct mmap_arg_struct32;
-asmlinkage long compat_sys_x86_mmap(struct mmap_arg_struct32 __user *);
-
-asmlinkage long compat_sys_x86_pread(unsigned int, char __user *, u32, u32,
-u32);
-asmlinkage long compat_sys_x86_pwrite(unsigned int, const char __user *, u32,
- u32, u32);
-
-asmlinkage long compat_sys_x86_fadvise64_64(int, __u32, __u32, __u32, __u32,
-   int);
-
-asmlinkage ssize_t compat_sys_x86_readahead(int, unsigned int, unsigned int,
-   size_t);
-asmlinkage long compat_sys_x86_sync_file_range(int, unsigned int, unsigned int,
-  unsigned int, unsigned int,
-  int);
-asmlinkage long compat_sys_x86_fadvise64(int, unsigned int, unsigned int,
-size_t, int);
-asmlinkage long compat_sys_x86_fallocate(int, int, unsigned int, unsigned int,
-unsigned int, unsigned int);
-asmlinkage long compat_sys_x86_clone(unsigned long, unsigned long, int __user 
*,
-unsigned long, int __user *);
-
-/* ia32/ia32_signal.c */
-asmlinkage long sys32_sigreturn(void);
-asmlinkage long sys32_rt_sigreturn(void);
-
-#endif /* CONFIG_COMPAT */
-
-#endif /* _ASM_X86_SYS_IA32_H */
diff --git a/include/linux/compat.h b/include/linux/compat.h
index f881cce627f6..8cb8710db0ab 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -49,6 +49,7 @@
COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
 
 #define COMPAT_SYSCALL_DEFINEx(x, name, ...)   \
+   asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))\
__attribute__((alias(__stringify(compat_SyS##name))

Re: [PATCH -next 00/22] remove in-kernel syscall invocations (part 2 == netdev)

2018-03-16 Thread Dominik Brodowski
On Fri, Mar 16, 2018 at 02:30:21PM -0400, David Miller wrote:
> From: Dominik Brodowski <li...@dominikbrodowski.net>
> Date: Fri, 16 Mar 2018 18:05:52 +0100
> 
> > The rationale of this change is described in patch 1 of part 1[*] as 
> > follows:
> > 
> > The syscall entry points to the kernel defined by SYSCALL_DEFINEx()
> > and COMPAT_SYSCALL_DEFINEx() should only be called from userspace
> > through kernel entry points, but not from the kernel itself. This
> > will allow cleanups and optimizations to the entry paths *and* to
> > the parts of the kernel code which currently need to pretend to be
> > userspace in order to make use of syscalls.
> > 
> > At present, these patches are based on v4.16-rc5; there is one trivial
> > conflict against net-next. Dave, I presume that you prefer to take them
> > through net-next? If you want to, I can re-base them against net-next.
> > If you prefer otherwise, though, I can route them as part of my whole
> > syscall series.
> 
> So the transformations themeselves are relatively trivial, so on that
> aspect I don't have any problems with these changes.

Thank you for your fast feedback.

> But overall I have to wonder.
> 
> I imagine one of the things you'd like to do is declare that syscall
> entries use a different (better) argument passing scheme.  For
> example, passing values in registers instead of on the stack.

Well, sort of. Currently, x86-64 decodes all six registers unconditionally:

regs->ax = sys_call_table[nr](
regs->di, regs->si, regs->dx,
regs->r10, regs->r8, regs->r9);

so that in do_syscall_64(), we have to get six parameters from the
stack:

mov0x38(%rbx),%rcx
mov0x60(%rbx),%rdx
mov0x68(%rbx),%rsi
mov0x70(%rbx),%rdi
mov0x40(%rbx),%r9
mov0x48(%rbx),%r8

Instead, the aim is to do

regs->ax = sys_call_table[nr](regs)

... which results in just a register rename operation:

mov%rbp,%rdi

> But in situations where you split out the system call function
> completely into one of these "helpers", the compiler is going
> to have two choices:
> 
> 1) Expand the helper into the syscall function inline, thus we end up
>with two copies of the function.

That's only sensible for very short stubs, which just call another function
(e.g. __compat_sys_sendmsg()).

> 2) Call the helper from the syscall function.  Well, then the compiler
>will need to pop the syscal obtained arguments from the registers
>onto the stack.
> 
> So this doesn't seem like such a total win to me.
> 
> Maybe you can explain things better to ease my concerns.

For example, for sys_recv() and sys_recvfrom(), if all is complete, this
results in:

sys_x86_64_recv:
callq <__fentry__>
/* decode struct pt_regs for exactly those parameters
 * we care about
 */
mov0x38(%rdi),%rcx
xor%r9d,%r9d
xor%r8d,%r8d
mov0x60(%rdi),%rdx
mov0x68(%rdi),%rsi
mov0x70(%rdi),%rdi

/* call __sys_recvfrom */
callq  <__sys_recvfrom>

/* cleanup and return */
cltq
retq

That's only obtaining four entries from the stack, and two register clearing
operations; sys_x86_64_recvfrom is similar (6 movs from stack, one register
rename mov, no xor).

__sys_recvfrom() then does the actual work, starting with pushing some
register contect out of the way and moving registers around, more or less
what SyS_recvfrom() does today.

So the result is nothing spectacular or unusual, but pretty equivalent and
possibly even shorter compared to current codepath.

Thanks,
Dominik


[PATCH -next 21/22] net: socket: add __compat_sys_recvmmsg() helper; remove in-kernel call to compat syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __compat_sys_recvmmsg() allows us to avoid
the internal calls to the compat_sys_recvmmsg() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 17 -
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index cdf5b0c1b962..7b2ae42a1598 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -787,9 +787,9 @@ COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, 
buf, compat_size_t, len
return __compat_sys_recvfrom(fd, buf, len, flags, addr, addrlen);
 }
 
-COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
-  unsigned int, vlen, unsigned int, flags,
-  struct compat_timespec __user *, timeout)
+static int __compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
+unsigned int vlen, unsigned int flags,
+struct compat_timespec __user *timeout)
 {
int datagrams;
struct timespec ktspec;
@@ -809,6 +809,13 @@ COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct 
compat_mmsghdr __user *, mmsg,
return datagrams;
 }
 
+COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
+  unsigned int, vlen, unsigned int, flags,
+  struct compat_timespec __user *, timeout)
+{
+   return __compat_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
+}
+
 COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, args)
 {
u32 a[AUDITSC_ARGS];
@@ -895,8 +902,8 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
break;
case SYS_RECVMMSG:
-   ret = compat_sys_recvmmsg(a0, compat_ptr(a1), a[2], a[3],
- compat_ptr(a[4]));
+   ret = __compat_sys_recvmmsg(a0, compat_ptr(a1), a[2], a[3],
+   compat_ptr(a[4]));
break;
case SYS_ACCEPT4:
ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]);
-- 
2.16.2



[PATCH -next 08/22] net: socket: add __sys_getsockname() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_getsockname() allows us to avoid the
internal calls to the sys_getsockname() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  2 +-
 net/socket.c   | 14 ++
 3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 7e37af25509d..ef0226a61b03 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -368,5 +368,7 @@ extern int __sys_bind(int fd, struct sockaddr __user 
*umyaddr, int addrlen);
 extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
 int addrlen);
 extern int __sys_listen(int fd, int backlog);
+extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
+int __user *usockaddr_len);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index c80cb973f383..efd28d02608c 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -826,7 +826,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
break;
case SYS_GETSOCKNAME:
-   ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
+   ret = __sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
break;
case SYS_GETPEERNAME:
ret = sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2]));
diff --git a/net/socket.c b/net/socket.c
index 67d9d70a4734..b61e0d20f37b 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1675,8 +1675,8 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user 
*, uservaddr,
  * name to user space.
  */
 
-SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
-   int __user *, usockaddr_len)
+int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
+ int __user *usockaddr_len)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1701,6 +1701,12 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr 
__user *, usockaddr,
return err;
 }
 
+SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
+   int __user *, usockaddr_len)
+{
+   return __sys_getsockname(fd, usockaddr, usockaddr_len);
+}
+
 /*
  * Get the remote address ('name') of a socket object. Move the obtained
  * name to user space.
@@ -2500,8 +2506,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
break;
case SYS_GETSOCKNAME:
err =
-   sys_getsockname(a0, (struct sockaddr __user *)a1,
-   (int __user *)a[2]);
+   __sys_getsockname(a0, (struct sockaddr __user *)a1,
+ (int __user *)a[2]);
break;
case SYS_GETPEERNAME:
err =
-- 
2.16.2



[PATCH -next 03/22] net: socket: add __sys_accept4() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_accept4() allows us to avoid the
internal calls to the sys_accept4() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  4 ++--
 net/socket.c   | 20 +---
 3 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 54b85abc7265..6a9840271676 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -361,5 +361,7 @@ extern int __sys_recvfrom(int fd, void __user *ubuf, size_t 
size,
 extern int __sys_sendto(int fd, void __user *buff, size_t len,
unsigned int flags, struct sockaddr __user *addr,
int addr_len);
+extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
+int __user *upeer_addrlen, int flags);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index fc82982d9b84..0ff9f7451b6f 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -823,7 +823,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = sys_listen(a0, a1);
break;
case SYS_ACCEPT:
-   ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
+   ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
break;
case SYS_GETSOCKNAME:
ret = sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
@@ -873,7 +873,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
  compat_ptr(a[4]));
break;
case SYS_ACCEPT4:
-   ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]);
+   ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]);
break;
default:
ret = -EINVAL;
diff --git a/net/socket.c b/net/socket.c
index 3f037a21ba5e..45f6ea0d57a5 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1519,8 +1519,8 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog)
  * clean when we restucture accept also.
  */
 
-SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
-   int __user *, upeer_addrlen, int, flags)
+int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
+ int __user *upeer_addrlen, int flags)
 {
struct socket *sock, *newsock;
struct file *newfile;
@@ -1599,10 +1599,16 @@ SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr 
__user *, upeer_sockaddr,
goto out_put;
 }
 
+SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
+   int __user *, upeer_addrlen, int, flags)
+{
+   return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, flags);
+}
+
 SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr,
int __user *, upeer_addrlen)
 {
-   return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
+   return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
 }
 
 /*
@@ -2469,8 +2475,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = sys_listen(a0, a1);
break;
case SYS_ACCEPT:
-   err = sys_accept4(a0, (struct sockaddr __user *)a1,
- (int __user *)a[2], 0);
+   err = __sys_accept4(a0, (struct sockaddr __user *)a1,
+   (int __user *)a[2], 0);
break;
case SYS_GETSOCKNAME:
err =
@@ -2525,8 +2531,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
   (struct timespec __user *)a[4]);
break;
case SYS_ACCEPT4:
-   err = sys_accept4(a0, (struct sockaddr __user *)a1,
- (int __user *)a[2], a[3]);
+   err = __sys_accept4(a0, (struct sockaddr __user *)a1,
+   (int __user *)a[2], a[3]);
break;
default:
err = -EINVAL;
-- 
2.16.2



[PATCH -next 15/22] net: socket: move check for forbid_cmsg_compat to __sys_...msg()

2018-03-16 Thread Dominik Brodowski
The non-compat codepaths for sys_...msg() verify that MSG_CMSG_COMPAT
is not set. By moving this check to the __sys_...msg() functions
(and making it dependent on a static flag passed to this function), we
can call the __sys...msg() functions instead of the syscall functions
in all cases. __sys_recvmmsg() does not need this trickery, as the
check is handled within the do_sys_recvmmsg() function internal to
net/socket.c.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 13 +
 net/compat.c   |  8 +---
 net/socket.c   | 38 +++---
 3 files changed, 37 insertions(+), 22 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index cad120e4ed4b..e2b6bd4fe977 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -346,13 +346,18 @@ extern int put_cmsg(struct msghdr*, int level, int type, 
int len, void *data);
 
 struct timespec;
 
-/* The __sys_...msg variants allow MSG_CMSG_COMPAT */
-extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned 
flags);
-extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned 
flags);
+/* The __sys_...msg variants allow MSG_CMSG_COMPAT iff
+ * forbid_cmsg_compat==false
+ */
+extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg,
+ unsigned int flags, bool forbid_cmsg_compat);
+extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg,
+ unsigned int flags, bool forbid_cmsg_compat);
 extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int 
vlen,
  unsigned int flags, struct timespec *timeout);
 extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
- unsigned int vlen, unsigned int flags);
+ unsigned int vlen, unsigned int flags,
+ bool forbid_cmsg_compat);
 
 /* helpers which do the actual work for syscalls */
 extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
diff --git a/net/compat.c b/net/compat.c
index f1ec23e9dfce..5caa48987bb2 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -736,19 +736,21 @@ static unsigned char nas[21] = {
 
 COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, 
unsigned int, flags)
 {
-   return __sys_sendmsg(fd, (struct user_msghdr __user *)msg, flags | 
MSG_CMSG_COMPAT);
+   return __sys_sendmsg(fd, (struct user_msghdr __user *)msg,
+flags | MSG_CMSG_COMPAT, false);
 }
 
 COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
   unsigned int, vlen, unsigned int, flags)
 {
return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
- flags | MSG_CMSG_COMPAT);
+ flags | MSG_CMSG_COMPAT, false);
 }
 
 COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, 
unsigned int, flags)
 {
-   return __sys_recvmsg(fd, (struct user_msghdr __user *)msg, flags | 
MSG_CMSG_COMPAT);
+   return __sys_recvmsg(fd, (struct user_msghdr __user *)msg,
+flags | MSG_CMSG_COMPAT, false);
 }
 
 COMPAT_SYSCALL_DEFINE4(recv, int, fd, void __user *, buf, compat_size_t, len, 
unsigned int, flags)
diff --git a/net/socket.c b/net/socket.c
index 72cdaaeccb85..3dcace0ca3d9 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2137,12 +2137,16 @@ static int ___sys_sendmsg(struct socket *sock, struct 
user_msghdr __user *msg,
  * BSD sendmsg interface
  */
 
-long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned flags)
+long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
+  bool forbid_cmsg_compat)
 {
int fput_needed, err;
struct msghdr msg_sys;
struct socket *sock;
 
+   if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
+   return -EINVAL;
+
sock = sockfd_lookup_light(fd, , _needed);
if (!sock)
goto out;
@@ -2156,9 +2160,7 @@ long __sys_sendmsg(int fd, struct user_msghdr __user 
*msg, unsigned flags)
 
 SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr __user *, msg, unsigned 
int, flags)
 {
-   if (flags & MSG_CMSG_COMPAT)
-   return -EINVAL;
-   return __sys_sendmsg(fd, msg, flags);
+   return __sys_sendmsg(fd, msg, flags, true);
 }
 
 /*
@@ -2166,7 +2168,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr 
__user *, msg, unsigned int
  */
 
 int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
-  unsigned int flags)
+  unsigned int flags, bool forbid_cmsg_compat)
 {
int fput_needed, err, datagrams;
struct socket *sock;
@@ -2176,6 +2178,9 @@ int __sys_sendmmsg(i

[PATCH -next 17/22] net: socket: replace call to sys_recv() with __sys_recvfrom()

2018-03-16 Thread Dominik Brodowski
sys_recv() merely expands the parameters to __sys_recvfrom() by NULL and
NULL. Open-code this in the two places which used sys_recv() as a wrapper
to __sys_recvfrom().

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 3 ++-
 net/socket.c | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index d55982ff5c59..9e0d030063ad 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -755,7 +755,8 @@ COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct 
compat_msghdr __user *, msg, uns
 
 COMPAT_SYSCALL_DEFINE4(recv, int, fd, void __user *, buf, compat_size_t, len, 
unsigned int, flags)
 {
-   return sys_recv(fd, buf, len, flags | MSG_CMSG_COMPAT);
+   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, NULL,
+ NULL);
 }
 
 COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, 
len,
diff --git a/net/socket.c b/net/socket.c
index c4fb60be194b..34cf4b163f8f 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2566,7 +2566,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
   (struct sockaddr __user *)a[4], a[5]);
break;
case SYS_RECV:
-   err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
+   err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
+NULL, NULL);
break;
case SYS_RECVFROM:
err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
-- 
2.16.2



[PATCH -next 02/22] net: socket: add __sys_sendto() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_sendto() allows us to avoid the
internal calls to the sys_sendto() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  3 +++
 net/compat.c   |  3 ++-
 net/socket.c   | 19 ---
 3 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 40cc93b91628..54b85abc7265 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -358,5 +358,8 @@ extern int __sys_sendmmsg(int fd, struct mmsghdr __user 
*mmsg,
 extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
  unsigned int flags, struct sockaddr __user *addr,
  int __user *addr_len);
+extern int __sys_sendto(int fd, void __user *buff, size_t len,
+   unsigned int flags, struct sockaddr __user *addr,
+   int addr_len);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 2d8186c277b2..fc82982d9b84 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -838,7 +838,8 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = sys_send(a0, compat_ptr(a1), a[2], a[3]);
break;
case SYS_SENDTO:
-   ret = sys_sendto(a0, compat_ptr(a1), a[2], a[3], 
compat_ptr(a[4]), a[5]);
+   ret = __sys_sendto(a0, compat_ptr(a1), a[2], a[3],
+  compat_ptr(a[4]), a[5]);
break;
case SYS_RECV:
ret = compat_sys_recv(a0, compat_ptr(a1), a[2], a[3]);
diff --git a/net/socket.c b/net/socket.c
index 712d99d8680f..3f037a21ba5e 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1711,10 +1711,8 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr 
__user *, usockaddr,
  * space and check the user space data area is readable before invoking
  * the protocol.
  */
-
-SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
-   unsigned int, flags, struct sockaddr __user *, addr,
-   int, addr_len)
+int __sys_sendto(int fd, void __user *buff, size_t len, unsigned int flags,
+struct sockaddr __user *addr,  int addr_len)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1752,6 +1750,13 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, 
size_t, len,
return err;
 }
 
+SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
+   unsigned int, flags, struct sockaddr __user *, addr,
+   int, addr_len)
+{
+   return __sys_sendto(fd, buff, len, flags, addr, addr_len);
+}
+
 /*
  * Send a datagram down a socket.
  */
@@ -1759,7 +1764,7 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, 
size_t, len,
 SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
unsigned int, flags)
 {
-   return sys_sendto(fd, buff, len, flags, NULL, 0);
+   return __sys_sendto(fd, buff, len, flags, NULL, 0);
 }
 
 /*
@@ -2484,8 +2489,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = sys_send(a0, (void __user *)a1, a[2], a[3]);
break;
case SYS_SENDTO:
-   err = sys_sendto(a0, (void __user *)a1, a[2], a[3],
-(struct sockaddr __user *)a[4], a[5]);
+   err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
+  (struct sockaddr __user *)a[4], a[5]);
break;
case SYS_RECV:
err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
-- 
2.16.2



[PATCH -next 10/22] net: socket: add __sys_socketpair() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_socketpair() allows us to avoid the
internal calls to the sys_socketpair() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  2 +-
 net/socket.c   | 11 ---
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 9ba003e92fea..dbdddf0d079e 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -372,5 +372,7 @@ extern int __sys_getsockname(int fd, struct sockaddr __user 
*usockaddr,
 int __user *usockaddr_len);
 extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
 int __user *usockaddr_len);
+extern int __sys_socketpair(int family, int type, int protocol,
+   int __user *usockvec);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 74017f618eb1..04db26316438 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -832,7 +832,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2]));
break;
case SYS_SOCKETPAIR:
-   ret = sys_socketpair(a0, a1, a[2], compat_ptr(a[3]));
+   ret = __sys_socketpair(a0, a1, a[2], compat_ptr(a[3]));
break;
case SYS_SEND:
ret = sys_send(a0, compat_ptr(a1), a[2], a[3]);
diff --git a/net/socket.c b/net/socket.c
index 007fb9483279..5861821f46f5 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1368,8 +1368,7 @@ SYSCALL_DEFINE3(socket, int, family, int, type, int, 
protocol)
  * Create a pair of connected sockets.
  */
 
-SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
-   int __user *, usockvec)
+int __sys_socketpair(int family, int type, int protocol, int __user *usockvec)
 {
struct socket *sock1, *sock2;
int fd1, fd2, err;
@@ -1454,6 +1453,12 @@ SYSCALL_DEFINE4(socketpair, int, family, int, type, int, 
protocol,
return err;
 }
 
+SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
+   int __user *, usockvec)
+{
+   return __sys_socketpair(family, type, protocol, usockvec);
+}
+
 /*
  * Bind a name to a socket. Nothing much to do here since it's
  * the protocol's responsibility to handle the local address.
@@ -2521,7 +2526,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
  (int __user *)a[2]);
break;
case SYS_SOCKETPAIR:
-   err = sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
+   err = __sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
break;
case SYS_SEND:
err = sys_send(a0, (void __user *)a1, a[2], a[3]);
-- 
2.16.2



[PATCH -next 13/22] net: socket: add __sys_getsockopt() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_getsockopt() allows us to avoid the
internal calls to the sys_getsockopt() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/socket.c | 14 ++
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index 5dd2e39a6cd4..a05289b1f863 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1918,8 +1918,8 @@ SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, 
optname,
  * to pass a user mode parameter for the protocols to sort out.
  */
 
-SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
-   char __user *, optval, int __user *, optlen)
+static int __sys_getsockopt(int fd, int level, int optname,
+   char __user *optval, int __user *optlen)
 {
int err, fput_needed;
struct socket *sock;
@@ -1944,6 +1944,12 @@ SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, 
optname,
return err;
 }
 
+SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
+   char __user *, optval, int __user *, optlen)
+{
+   return __sys_getsockopt(fd, level, optname, optval, optlen);
+}
+
 /*
  * Shutdown a socket.
  */
@@ -2563,8 +2569,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
break;
case SYS_GETSOCKOPT:
err =
-   sys_getsockopt(a0, a1, a[2], (char __user *)a[3],
-  (int __user *)a[4]);
+   __sys_getsockopt(a0, a1, a[2], (char __user *)a[3],
+(int __user *)a[4]);
break;
case SYS_SENDMSG:
err = sys_sendmsg(a0, (struct user_msghdr __user *)a1, a[2]);
-- 
2.16.2



[PATCH -next 01/22] net: socket: add __sys_recvfrom() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_recvfrom() allows us to avoid the
internal calls to the sys_recvfrom() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  6 ++
 net/compat.c   |  3 ++-
 net/socket.c   | 21 +
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 9286a5a8c60c..40cc93b91628 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -353,4 +353,10 @@ extern int __sys_recvmmsg(int fd, struct mmsghdr __user 
*mmsg, unsigned int vlen
  unsigned int flags, struct timespec *timeout);
 extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
  unsigned int vlen, unsigned int flags);
+
+/* helpers which do the actual work for syscalls */
+extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
+ unsigned int flags, struct sockaddr __user *addr,
+ int __user *addr_len);
+
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 22381719718c..2d8186c277b2 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -760,7 +760,8 @@ COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, 
buf, compat_size_t, len
   unsigned int, flags, struct sockaddr __user *, addr,
   int __user *, addrlen)
 {
-   return sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr, 
addrlen);
+   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr,
+ addrlen);
 }
 
 COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
diff --git a/net/socket.c b/net/socket.c
index a93c99b518ca..712d99d8680f 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1767,10 +1767,8 @@ SYSCALL_DEFINE4(send, int, fd, void __user *, buff, 
size_t, len,
  * sender. We verify the buffers are writable and if needed move the
  * sender address from kernel to user space.
  */
-
-SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
-   unsigned int, flags, struct sockaddr __user *, addr,
-   int __user *, addr_len)
+int __sys_recvfrom(int fd, void __user *ubuf, size_t size, unsigned int flags,
+  struct sockaddr __user *addr, int __user *addr_len)
 {
struct socket *sock;
struct iovec iov;
@@ -1810,6 +1808,13 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, 
size_t, size,
return err;
 }
 
+SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
+   unsigned int, flags, struct sockaddr __user *, addr,
+   int __user *, addr_len)
+{
+   return __sys_recvfrom(fd, ubuf, size, flags, addr, addr_len);
+}
+
 /*
  * Receive a datagram from a socket.
  */
@@ -1817,7 +1822,7 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, 
size_t, size,
 SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, size_t, size,
unsigned int, flags)
 {
-   return sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
+   return __sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
 }
 
 /*
@@ -2486,9 +2491,9 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
break;
case SYS_RECVFROM:
-   err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
-  (struct sockaddr __user *)a[4],
-  (int __user *)a[5]);
+   err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
+(struct sockaddr __user *)a[4],
+(int __user *)a[5]);
break;
case SYS_SHUTDOWN:
err = sys_shutdown(a0, a1);
-- 
2.16.2



[PATCH -next 18/22] net: socket: add __compat_sys_recvfrom() helper; remove in-kernel call to compat syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __compat_sys_recvfrom() allows us to avoid
the internal calls to the compat_sys_recvfrom() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 23 ---
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 9e0d030063ad..513adc8d0e0f 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -753,18 +753,25 @@ COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct 
compat_msghdr __user *, msg, uns
 flags | MSG_CMSG_COMPAT, false);
 }
 
+static inline long __compat_sys_recvfrom(int fd, void __user *buf,
+compat_size_t len, unsigned int flags,
+struct sockaddr __user *addr,
+int __user *addrlen)
+{
+   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr,
+ addrlen);
+}
+
 COMPAT_SYSCALL_DEFINE4(recv, int, fd, void __user *, buf, compat_size_t, len, 
unsigned int, flags)
 {
-   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, NULL,
- NULL);
+   return __compat_sys_recvfrom(fd, buf, len, flags, NULL, NULL);
 }
 
 COMPAT_SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, buf, compat_size_t, 
len,
   unsigned int, flags, struct sockaddr __user *, addr,
   int __user *, addrlen)
 {
-   return __sys_recvfrom(fd, buf, len, flags | MSG_CMSG_COMPAT, addr,
- addrlen);
+   return __compat_sys_recvfrom(fd, buf, len, flags, addr, addrlen);
 }
 
 COMPAT_SYSCALL_DEFINE5(recvmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
@@ -845,11 +852,13 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user 
*, args)
   compat_ptr(a[4]), a[5]);
break;
case SYS_RECV:
-   ret = compat_sys_recv(a0, compat_ptr(a1), a[2], a[3]);
+   ret = __compat_sys_recvfrom(a0, compat_ptr(a1), a[2], a[3],
+   NULL, NULL);
break;
case SYS_RECVFROM:
-   ret = compat_sys_recvfrom(a0, compat_ptr(a1), a[2], a[3],
- compat_ptr(a[4]), compat_ptr(a[5]));
+   ret = __compat_sys_recvfrom(a0, compat_ptr(a1), a[2], a[3],
+   compat_ptr(a[4]),
+   compat_ptr(a[5]));
break;
case SYS_SHUTDOWN:
ret = __sys_shutdown(a0, a1);
-- 
2.16.2



[PATCH -next 14/22] net: socket: add do_sys_recvmmsg() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper do_sys_recvmmsg() allows us to avoid the
internal calls to the sys_getsockopt() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/socket.c | 17 -
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index a05289b1f863..72cdaaeccb85 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2445,9 +2445,9 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, 
unsigned int vlen,
return datagrams;
 }
 
-SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
-   unsigned int, vlen, unsigned int, flags,
-   struct timespec __user *, timeout)
+static long do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
+   unsigned int vlen, unsigned int flags,
+   struct timespec __user *timeout)
 {
int datagrams;
struct timespec timeout_sys;
@@ -2470,6 +2470,13 @@ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user 
*, mmsg,
return datagrams;
 }
 
+SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
+   unsigned int, vlen, unsigned int, flags,
+   struct timespec __user *, timeout)
+{
+   return do_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
+}
+
 #ifdef __ARCH_WANT_SYS_SOCKETCALL
 /* Argument list sizes for sys_socketcall */
 #define AL(x) ((x) * sizeof(unsigned long))
@@ -2582,8 +2589,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = sys_recvmsg(a0, (struct user_msghdr __user *)a1, a[2]);
break;
case SYS_RECVMMSG:
-   err = sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3],
-  (struct timespec __user *)a[4]);
+   err = do_sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2],
+ a[3], (struct timespec __user *)a[4]);
break;
case SYS_ACCEPT4:
err = __sys_accept4(a0, (struct sockaddr __user *)a1,
-- 
2.16.2



[PATCH -next 05/22] net: socket: add __sys_bind() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_bind() allows us to avoid the
internal calls to the sys_bind() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 1 +
 net/compat.c   | 2 +-
 net/socket.c   | 9 +++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index f8d040434a13..e9cee272da13 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -364,5 +364,6 @@ extern int __sys_sendto(int fd, void __user *buff, size_t 
len,
 extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
 int __user *upeer_addrlen, int flags);
 extern int __sys_socket(int family, int type, int protocol);
+extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 5b3b74c5812e..bba555b1d863 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -814,7 +814,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_socket(a0, a1, a[2]);
break;
case SYS_BIND:
-   ret = sys_bind(a0, compat_ptr(a1), a[2]);
+   ret = __sys_bind(a0, compat_ptr(a1), a[2]);
break;
case SYS_CONNECT:
ret = sys_connect(a0, compat_ptr(a1), a[2]);
diff --git a/net/socket.c b/net/socket.c
index 07f379e50def..291cdae97341 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1462,7 +1462,7 @@ SYSCALL_DEFINE4(socketpair, int, family, int, type, int, 
protocol,
  * the protocol layer (having also checked the address is ok).
  */
 
-SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
+int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1485,6 +1485,11 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, 
umyaddr, int, addrlen)
return err;
 }
 
+SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
+{
+   return __sys_bind(fd, umyaddr, addrlen);
+}
+
 /*
  * Perform a listen. Basically, we allow the protocol to do anything
  * necessary for a listen, and if that works, we mark the socket as
@@ -2471,7 +2476,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_socket(a0, a1, a[2]);
break;
case SYS_BIND:
-   err = sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
+   err = __sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_CONNECT:
err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
-- 
2.16.2



[PATCH -next 12/22] net: socket: add __sys_setsockopt() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_setsockopt() allows us to avoid the
internal calls to the sys_setsockopt() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  1 +
 net/socket.c   | 13 ++---
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index b205138b69f1..cad120e4ed4b 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -376,4 +376,5 @@ extern int __sys_socketpair(int family, int type, int 
protocol,
int __user *usockvec);
 extern int __sys_shutdown(int fd, int how);
 
+
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/socket.c b/net/socket.c
index ad5dfd6a1d59..5dd2e39a6cd4 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1878,8 +1878,8 @@ SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, 
size_t, size,
  * to pass the user mode parameter for the protocols to sort out.
  */
 
-SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
-   char __user *, optval, int, optlen)
+static int __sys_setsockopt(int fd, int level, int optname,
+   char __user *optval, int optlen)
 {
int err, fput_needed;
struct socket *sock;
@@ -1907,6 +1907,12 @@ SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, 
optname,
return err;
 }
 
+SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
+   char __user *, optval, int, optlen)
+{
+   return __sys_setsockopt(fd, level, optname, optval, optlen);
+}
+
 /*
  * Get a socket option. Because we don't know the option lengths we have
  * to pass a user mode parameter for the protocols to sort out.
@@ -2552,7 +2558,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_shutdown(a0, a1);
break;
case SYS_SETSOCKOPT:
-   err = sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]);
+   err = __sys_setsockopt(a0, a1, a[2], (char __user *)a[3],
+  a[4]);
break;
case SYS_GETSOCKOPT:
err =
-- 
2.16.2



[PATCH -next 04/22] net: socket: add __sys_socket() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_socket() allows us to avoid the
internal calls to the sys_socket() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 1 +
 net/compat.c   | 2 +-
 net/socket.c   | 9 +++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 6a9840271676..f8d040434a13 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -363,5 +363,6 @@ extern int __sys_sendto(int fd, void __user *buff, size_t 
len,
int addr_len);
 extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
 int __user *upeer_addrlen, int flags);
+extern int __sys_socket(int family, int type, int protocol);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 0ff9f7451b6f..5b3b74c5812e 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -811,7 +811,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
 
switch (call) {
case SYS_SOCKET:
-   ret = sys_socket(a0, a1, a[2]);
+   ret = __sys_socket(a0, a1, a[2]);
break;
case SYS_BIND:
ret = sys_bind(a0, compat_ptr(a1), a[2]);
diff --git a/net/socket.c b/net/socket.c
index 45f6ea0d57a5..07f379e50def 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1332,7 +1332,7 @@ int sock_create_kern(struct net *net, int family, int 
type, int protocol, struct
 }
 EXPORT_SYMBOL(sock_create_kern);
 
-SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
+int __sys_socket(int family, int type, int protocol)
 {
int retval;
struct socket *sock;
@@ -1359,6 +1359,11 @@ SYSCALL_DEFINE3(socket, int, family, int, type, int, 
protocol)
return sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
 }
 
+SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
+{
+   return __sys_socket(family, type, protocol);
+}
+
 /*
  * Create a pair of connected sockets.
  */
@@ -2463,7 +2468,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
 
switch (call) {
case SYS_SOCKET:
-   err = sys_socket(a0, a1, a[2]);
+   err = __sys_socket(a0, a1, a[2]);
break;
case SYS_BIND:
err = sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
-- 
2.16.2



[PATCH -next 07/22] net: socket: add __sys_listen() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_listen() allows us to avoid the
internal calls to the sys_listen() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 1 +
 net/compat.c   | 2 +-
 net/socket.c   | 9 +++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index 7daa344d7320..7e37af25509d 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -367,5 +367,6 @@ extern int __sys_socket(int family, int type, int protocol);
 extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
 extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
 int addrlen);
+extern int __sys_listen(int fd, int backlog);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 7ab6352268f3..c80cb973f383 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -820,7 +820,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_connect(a0, compat_ptr(a1), a[2]);
break;
case SYS_LISTEN:
-   ret = sys_listen(a0, a1);
+   ret = __sys_listen(a0, a1);
break;
case SYS_ACCEPT:
ret = __sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), 0);
diff --git a/net/socket.c b/net/socket.c
index 64bdfdf6c6e7..67d9d70a4734 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1496,7 +1496,7 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, 
umyaddr, int, addrlen)
  * ready for listening.
  */
 
-SYSCALL_DEFINE2(listen, int, fd, int, backlog)
+int __sys_listen(int fd, int backlog)
 {
struct socket *sock;
int err, fput_needed;
@@ -1517,6 +1517,11 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog)
return err;
 }
 
+SYSCALL_DEFINE2(listen, int, fd, int, backlog)
+{
+   return __sys_listen(fd, backlog);
+}
+
 /*
  * For accept, we attempt to create a new socket, set up the link
  * with the client, wake up the client, then return the new
@@ -2487,7 +2492,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_LISTEN:
-   err = sys_listen(a0, a1);
+   err = __sys_listen(a0, a1);
break;
case SYS_ACCEPT:
err = __sys_accept4(a0, (struct sockaddr __user *)a1,
-- 
2.16.2



[PATCH -next 06/22] net: socket: add __sys_connect() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_connect() allows us to avoid the
internal calls to the sys_connect() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  2 +-
 net/socket.c   | 11 ---
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index e9cee272da13..7daa344d7320 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -365,5 +365,7 @@ extern int __sys_accept4(int fd, struct sockaddr __user 
*upeer_sockaddr,
 int __user *upeer_addrlen, int flags);
 extern int __sys_socket(int family, int type, int protocol);
 extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
+extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
+int addrlen);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index bba555b1d863..7ab6352268f3 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -817,7 +817,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_bind(a0, compat_ptr(a1), a[2]);
break;
case SYS_CONNECT:
-   ret = sys_connect(a0, compat_ptr(a1), a[2]);
+   ret = __sys_connect(a0, compat_ptr(a1), a[2]);
break;
case SYS_LISTEN:
ret = sys_listen(a0, a1);
diff --git a/net/socket.c b/net/socket.c
index 291cdae97341..64bdfdf6c6e7 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1633,8 +1633,7 @@ SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user 
*, upeer_sockaddr,
  * include the -EINPROGRESS status for such sockets.
  */
 
-SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
-   int, addrlen)
+int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1660,6 +1659,12 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user 
*, uservaddr,
return err;
 }
 
+SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
+   int, addrlen)
+{
+   return __sys_connect(fd, uservaddr, addrlen);
+}
+
 /*
  * Get the local address ('name') of a socket object. Move the obtained
  * name to user space.
@@ -2479,7 +2484,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_CONNECT:
-   err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
+   err = __sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
break;
case SYS_LISTEN:
err = sys_listen(a0, a1);
-- 
2.16.2



[PATCH -next 11/22] net: socket: add __sys_shutdown() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_shutdown() allows us to avoid the
internal calls to the sys_shutdown() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h | 1 +
 net/compat.c   | 2 +-
 net/socket.c   | 9 +++--
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index dbdddf0d079e..b205138b69f1 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -374,5 +374,6 @@ extern int __sys_getpeername(int fd, struct sockaddr __user 
*usockaddr,
 int __user *usockaddr_len);
 extern int __sys_socketpair(int family, int type, int protocol,
int __user *usockvec);
+extern int __sys_shutdown(int fd, int how);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index 04db26316438..f1ec23e9dfce 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -849,7 +849,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
  compat_ptr(a[4]), compat_ptr(a[5]));
break;
case SYS_SHUTDOWN:
-   ret = sys_shutdown(a0, a1);
+   ret = __sys_shutdown(a0, a1);
break;
case SYS_SETSOCKOPT:
ret = compat_sys_setsockopt(a0, a1, a[2],
diff --git a/net/socket.c b/net/socket.c
index 5861821f46f5..ad5dfd6a1d59 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1942,7 +1942,7 @@ SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, 
optname,
  * Shutdown a socket.
  */
 
-SYSCALL_DEFINE2(shutdown, int, fd, int, how)
+int __sys_shutdown(int fd, int how)
 {
int err, fput_needed;
struct socket *sock;
@@ -1957,6 +1957,11 @@ SYSCALL_DEFINE2(shutdown, int, fd, int, how)
return err;
 }
 
+SYSCALL_DEFINE2(shutdown, int, fd, int, how)
+{
+   return __sys_shutdown(fd, how);
+}
+
 /* A couple of helpful macros for getting the address of the 32/64 bit
  * fields which are the same type (int / unsigned) on our platforms.
  */
@@ -2544,7 +2549,7 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
 (int __user *)a[5]);
break;
case SYS_SHUTDOWN:
-   err = sys_shutdown(a0, a1);
+   err = __sys_shutdown(a0, a1);
break;
case SYS_SETSOCKOPT:
err = sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]);
-- 
2.16.2



[PATCH -next 16/22] net: socket: replace calls to sys_send() with __sys_sendto()

2018-03-16 Thread Dominik Brodowski
sys_send() merely expands the parameters to __sys_sendto() by NULL and 0.
Open-code this in the two places which used sys_send() as a wrapper to
__sys_sendto().

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 2 +-
 net/socket.c | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 5caa48987bb2..d55982ff5c59 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -837,7 +837,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_socketpair(a0, a1, a[2], compat_ptr(a[3]));
break;
case SYS_SEND:
-   ret = sys_send(a0, compat_ptr(a1), a[2], a[3]);
+   ret = __sys_sendto(a0, compat_ptr(a1), a[2], a[3], NULL, 0);
break;
case SYS_SENDTO:
ret = __sys_sendto(a0, compat_ptr(a1), a[2], a[3],
diff --git a/net/socket.c b/net/socket.c
index 3dcace0ca3d9..c4fb60be194b 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2558,7 +2558,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
err = __sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
break;
case SYS_SEND:
-   err = sys_send(a0, (void __user *)a1, a[2], a[3]);
+   err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
+  NULL, 0);
break;
case SYS_SENDTO:
err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
-- 
2.16.2



[PATCH -next 22/22] net: socket: add __compat_sys_...msg() helpers; remove in-kernel calls to compat syscalls

2018-03-16 Thread Dominik Brodowski
Using the net-internal helpers __compat_sys_...msg() allows us to avoid
the internal calls to the compat_sys_...msg() syscalls.
compat_sys_recvmmsg() is handled in a different patch.

Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 37 ++---
 1 file changed, 30 insertions(+), 7 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 7b2ae42a1598..5ae7437d3853 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -747,25 +747,48 @@ static unsigned char nas[21] = {
 };
 #undef AL
 
-COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, 
unsigned int, flags)
+static inline long __compat_sys_sendmsg(int fd,
+   struct compat_msghdr __user *msg,
+   unsigned int flags)
 {
return __sys_sendmsg(fd, (struct user_msghdr __user *)msg,
 flags | MSG_CMSG_COMPAT, false);
 }
 
-COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
-  unsigned int, vlen, unsigned int, flags)
+COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg,
+  unsigned int, flags)
+{
+   return __compat_sys_sendmsg(fd, msg, flags);
+}
+
+static inline long __compat_sys_sendmmsg(int fd,
+struct compat_mmsghdr __user *mmsg,
+unsigned int vlen, unsigned int flags)
 {
return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
  flags | MSG_CMSG_COMPAT, false);
 }
 
-COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg, 
unsigned int, flags)
+COMPAT_SYSCALL_DEFINE4(sendmmsg, int, fd, struct compat_mmsghdr __user *, mmsg,
+  unsigned int, vlen, unsigned int, flags)
+{
+   return __compat_sys_sendmmsg(fd, mmsg, vlen, flags);
+}
+
+static inline long __compat_sys_recvmsg(int fd,
+   struct compat_msghdr __user *msg,
+   unsigned int flags)
 {
return __sys_recvmsg(fd, (struct user_msghdr __user *)msg,
 flags | MSG_CMSG_COMPAT, false);
 }
 
+COMPAT_SYSCALL_DEFINE3(recvmsg, int, fd, struct compat_msghdr __user *, msg,
+  unsigned int, flags)
+{
+   return __compat_sys_recvmsg(fd, msg, flags);
+}
+
 static inline long __compat_sys_recvfrom(int fd, void __user *buf,
 compat_size_t len, unsigned int flags,
 struct sockaddr __user *addr,
@@ -893,13 +916,13 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user 
*, args)
  compat_ptr(a[4]));
break;
case SYS_SENDMSG:
-   ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
+   ret = __compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
break;
case SYS_SENDMMSG:
-   ret = compat_sys_sendmmsg(a0, compat_ptr(a1), a[2], a[3]);
+   ret = __compat_sys_sendmmsg(a0, compat_ptr(a1), a[2], a[3]);
break;
case SYS_RECVMSG:
-   ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
+   ret = __compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
break;
case SYS_RECVMMSG:
ret = __compat_sys_recvmmsg(a0, compat_ptr(a1), a[2], a[3],
-- 
2.16.2



[PATCH -next 19/22] net: socket: add __compat_sys_setsockopt() helper; remove in-kernel call to compat syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __compat_sys_setsockopt() allows us to avoid
the internal calls to the compat_sys_setsockopt() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 14 ++
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 513adc8d0e0f..75bfcbbb2e3e 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -383,8 +383,8 @@ static int compat_sock_setsockopt(struct socket *sock, int 
level, int optname,
return sock_setsockopt(sock, level, optname, optval, optlen);
 }
 
-COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
-  char __user *, optval, unsigned int, optlen)
+static int __compat_sys_setsockopt(int fd, int level, int optname,
+  char __user *optval, unsigned int optlen)
 {
int err;
struct socket *sock = sockfd_lookup(fd, );
@@ -410,6 +410,12 @@ COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, 
int, optname,
return err;
 }
 
+COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
+  char __user *, optval, unsigned int, optlen)
+{
+   return __compat_sys_setsockopt(fd, level, optname, optval, optlen);
+}
+
 static int do_get_sock_timeout(struct socket *sock, int level, int optname,
char __user *optval, int __user *optlen)
 {
@@ -864,8 +870,8 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_shutdown(a0, a1);
break;
case SYS_SETSOCKOPT:
-   ret = compat_sys_setsockopt(a0, a1, a[2],
-   compat_ptr(a[3]), a[4]);
+   ret = __compat_sys_setsockopt(a0, a1, a[2],
+ compat_ptr(a[3]), a[4]);
break;
case SYS_GETSOCKOPT:
ret = compat_sys_getsockopt(a0, a1, a[2],
-- 
2.16.2



[PATCH -next 00/22] remove in-kernel syscall invocations (part 2 == netdev)

2018-03-16 Thread Dominik Brodowski
Here is another series of patches which reduce the number of syscall
invocations from within the kernel. This series is focused solely on
the net/ part of the kernel and get rids of syscall and compat_syscall
invocations from within the kernel completely. It is also available at

https://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux.git 
syscalls-net-next

The rationale of this change is described in patch 1 of part 1[*] as follows:

The syscall entry points to the kernel defined by SYSCALL_DEFINEx()
and COMPAT_SYSCALL_DEFINEx() should only be called from userspace
through kernel entry points, but not from the kernel itself. This
will allow cleanups and optimizations to the entry paths *and* to
the parts of the kernel code which currently need to pretend to be
userspace in order to make use of syscalls.

At present, these patches are based on v4.16-rc5; there is one trivial
conflict against net-next. Dave, I presume that you prefer to take them
through net-next? If you want to, I can re-base them against net-next.
If you prefer otherwise, though, I can route them as part of my whole
syscall series.

Thanks,
Dominik

[*] The cover letter for v2 is available at
http://lkml.kernel.org/r/20180315190529.20943-1-li...@dominikbrodowski.net ;
the whole patchset -- in its current, slightly modified form -- is 
available at
at https://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux.git 
syscalls-next

Dominik Brodowski (22):
  net: socket: add __sys_recvfrom() helper; remove in-kernel call to
syscall
  net: socket: add __sys_sendto() helper; remove in-kernel call to
syscall
  net: socket: add __sys_accept4() helper; remove in-kernel call to
syscall
  net: socket: add __sys_socket() helper; remove in-kernel call to
syscall
  net: socket: add __sys_bind() helper; remove in-kernel call to syscall
  net: socket: add __sys_connect() helper; remove in-kernel call to
syscall
  net: socket: add __sys_listen() helper; remove in-kernel call to
syscall
  net: socket: add __sys_getsockname() helper; remove in-kernel call to
syscall
  net: socket: add __sys_getpeername() helper; remove in-kernel call to
syscall
  net: socket: add __sys_socketpair() helper; remove in-kernel call to
syscall
  net: socket: add __sys_shutdown() helper; remove in-kernel call to
syscall
  net: socket: add __sys_setsockopt() helper; remove in-kernel call to
syscall
  net: socket: add __sys_getsockopt() helper; remove in-kernel call to
syscall
  net: socket: add do_sys_recvmmsg() helper; remove in-kernel call to
syscall
  net: socket: move check for forbid_cmsg_compat to __sys_...msg()
  net: socket: replace calls to sys_send() with __sys_sendto()
  net: socket: replace call to sys_recv() with __sys_recvfrom()
  net: socket: add __compat_sys_recvfrom() helper; remove in-kernel call
to compat syscall
  net: socket: add __compat_sys_setsockopt() helper; remove in-kernel
call to compat syscall
  net: socket: add __compat_sys_getsockopt() helper; remove in-kernel
call to compat syscall
  net: socket: add __compat_sys_recvmmsg() helper; remove in-kernel call
to compat syscall
  net: socket: add __compat_sys_...msg() helpers; remove in-kernel calls
to compat syscalls

 include/linux/socket.h |  37 +++-
 net/compat.c   | 136 +++-
 net/socket.c   | 234 ++---
 3 files changed, 291 insertions(+), 116 deletions(-)

-- 
2.16.2



[PATCH -next 09/22] net: socket: add __sys_getpeername() helper; remove in-kernel call to syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __sys_getpeername() allows us to avoid the
internal calls to the sys_getpeername() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 include/linux/socket.h |  2 ++
 net/compat.c   |  2 +-
 net/socket.c   | 14 ++
 3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index ef0226a61b03..9ba003e92fea 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -370,5 +370,7 @@ extern int __sys_connect(int fd, struct sockaddr __user 
*uservaddr,
 extern int __sys_listen(int fd, int backlog);
 extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
 int __user *usockaddr_len);
+extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
+int __user *usockaddr_len);
 
 #endif /* _LINUX_SOCKET_H */
diff --git a/net/compat.c b/net/compat.c
index efd28d02608c..74017f618eb1 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -829,7 +829,7 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
ret = __sys_getsockname(a0, compat_ptr(a1), compat_ptr(a[2]));
break;
case SYS_GETPEERNAME:
-   ret = sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2]));
+   ret = __sys_getpeername(a0, compat_ptr(a1), compat_ptr(a[2]));
break;
case SYS_SOCKETPAIR:
ret = sys_socketpair(a0, a1, a[2], compat_ptr(a[3]));
diff --git a/net/socket.c b/net/socket.c
index b61e0d20f37b..007fb9483279 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1712,8 +1712,8 @@ SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr 
__user *, usockaddr,
  * name to user space.
  */
 
-SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
-   int __user *, usockaddr_len)
+int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
+ int __user *usockaddr_len)
 {
struct socket *sock;
struct sockaddr_storage address;
@@ -1738,6 +1738,12 @@ SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr 
__user *, usockaddr,
return err;
 }
 
+SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
+   int __user *, usockaddr_len)
+{
+   return __sys_getpeername(fd, usockaddr, usockaddr_len);
+}
+
 /*
  * Send a datagram to a given address. We move the address into kernel
  * space and check the user space data area is readable before invoking
@@ -2511,8 +2517,8 @@ SYSCALL_DEFINE2(socketcall, int, call, unsigned long 
__user *, args)
break;
case SYS_GETPEERNAME:
err =
-   sys_getpeername(a0, (struct sockaddr __user *)a1,
-   (int __user *)a[2]);
+   __sys_getpeername(a0, (struct sockaddr __user *)a1,
+ (int __user *)a[2]);
break;
case SYS_SOCKETPAIR:
err = sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
-- 
2.16.2



[PATCH -next 20/22] net: socket: add __compat_sys_getsockopt() helper; remove in-kernel call to compat syscall

2018-03-16 Thread Dominik Brodowski
Using the net-internal helper __compat_sys_getsockopt() allows us to avoid
the internal calls to the compat_sys_getsockopt() syscall.

Cc: David S. Miller <da...@davemloft.net>
Cc: netdev@vger.kernel.org
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---
 net/compat.c | 16 
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/net/compat.c b/net/compat.c
index 75bfcbbb2e3e..cdf5b0c1b962 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -509,8 +509,9 @@ int compat_sock_get_timestampns(struct sock *sk, struct 
timespec __user *usersta
 }
 EXPORT_SYMBOL(compat_sock_get_timestampns);
 
-COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
-  char __user *, optval, int __user *, optlen)
+static int __compat_sys_getsockopt(int fd, int level, int optname,
+  char __user *optval,
+  int __user *optlen)
 {
int err;
struct socket *sock = sockfd_lookup(fd, );
@@ -536,6 +537,12 @@ COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, 
int, optname,
return err;
 }
 
+COMPAT_SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
+  char __user *, optval, int __user *, optlen)
+{
+   return __compat_sys_getsockopt(fd, level, optname, optval, optlen);
+}
+
 struct compat_group_req {
__u32gr_interface;
struct __kernel_sockaddr_storage gr_group
@@ -874,8 +881,9 @@ COMPAT_SYSCALL_DEFINE2(socketcall, int, call, u32 __user *, 
args)
  compat_ptr(a[3]), a[4]);
break;
case SYS_GETSOCKOPT:
-   ret = compat_sys_getsockopt(a0, a1, a[2],
-   compat_ptr(a[3]), compat_ptr(a[4]));
+   ret = __compat_sys_getsockopt(a0, a1, a[2],
+ compat_ptr(a[3]),
+ compat_ptr(a[4]));
break;
case SYS_SENDMSG:
ret = compat_sys_sendmsg(a0, compat_ptr(a1), a[2]);
-- 
2.16.2



[PATCH v3] nl80211: take RCU read lock when calling ieee80211_bss_get_ie()

2018-01-14 Thread Dominik Brodowski
As ieee80211_bss_get_ie() derefences an RCU to return ssid_ie, both
the call to this function and any operation on this variable need
protection by the RCU read lock.

Fixes: 44905265bc15 ("nl80211: don't expose wdev->ssid for most interfaces")
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---

> but after, perhaps it's easier to just do
> 
>   if (ssid_ie &&
>   nla_put(...)
>   goto nla_put_failure_rcu_locked;
> 
> and avoid the extra label (but yeah, it's getting late)

OK, done that (and updated the commit message), and testet it.

Thanks,
Dominik

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 2b3dbcd40e46..ed87a97fcb0b 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -2618,12 +2618,13 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 
portid, u32 seq, int flag
const u8 *ssid_ie;
if (!wdev->current_bss)
break;
+   rcu_read_lock();
ssid_ie = ieee80211_bss_get_ie(>current_bss->pub,
   WLAN_EID_SSID);
-   if (!ssid_ie)
-   break;
-   if (nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2))
-   goto nla_put_failure_locked;
+   if (ssid_ie &&
+   nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2))
+   goto nla_put_failure_rcu_locked;
+   rcu_read_unlock();
break;
}
default:
@@ -2635,6 +2636,8 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 
portid, u32 seq, int flag
genlmsg_end(msg, hdr);
return 0;
 
+ nla_put_failure_rcu_locked:
+   rcu_read_unlock();
  nla_put_failure_locked:
wdev_unlock(wdev);
  nla_put_failure:


[PATCH v2] nl80211: take RCU read lock when calling ieee80211_bss_get_ie()

2018-01-14 Thread Dominik Brodowski
As ieee80211_bss_get_ie() derefences an RCU, it needs to be called with
rcu_read_lock held.

Fixes: 44905265bc15 ("nl80211: don't expose wdev->ssid for most interfaces")
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---

> This uses the ssid_ie, so that doesn't really seem right? The
> protection should extend beyond the usage.

Indeed -- I had misread the code and hadn't thought of ssid_ie also needing
the protection during its lifetime. So here's a new version 2 -- which I
will only be able to test tomorrow, though...

Thanks,
Dominik

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 2b3dbcd40e46..b53bd8db7974 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -2618,12 +2618,15 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 
portid, u32 seq, int flag
const u8 *ssid_ie;
if (!wdev->current_bss)
break;
+   rcu_read_lock();
ssid_ie = ieee80211_bss_get_ie(>current_bss->pub,
   WLAN_EID_SSID);
if (!ssid_ie)
-   break;
+   goto nla_rcu_unlock;
if (nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2))
-   goto nla_put_failure_locked;
+   goto nla_put_failure_rcu_locked;
+ nla_rcu_unlock:
+   rcu_read_unlock();
break;
}
default:
@@ -2635,6 +2638,8 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 
portid, u32 seq, int flag
genlmsg_end(msg, hdr);
return 0;
 
+ nla_put_failure_rcu_locked:
+   rcu_read_unlock();
  nla_put_failure_locked:
wdev_unlock(wdev);
  nla_put_failure:


[PATCH] nl80211: take RCU read lock when calling ieee80211_bss_get_ie()

2018-01-14 Thread Dominik Brodowski
As ieee80211_bss_get_ie() derefences an RCU, it needs to be called with
rcu_read_lock held.

Fixes: 44905265bc15 ("nl80211: don't expose wdev->ssid for most interfaces")
Signed-off-by: Dominik Brodowski <li...@dominikbrodowski.net>
---

This patch fixes the regression I reported in the last couple of weeks for
various v4.15-rcX revisions to netdev, where a "suspicious RCU usage"
showed up in net/wireless/util.c:778.

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 2b3dbcd40e46..1eecc249fb5e 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -2618,8 +2618,10 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 
portid, u32 seq, int flag
const u8 *ssid_ie;
if (!wdev->current_bss)
break;
+   rcu_read_lock();
ssid_ie = ieee80211_bss_get_ie(>current_bss->pub,
   WLAN_EID_SSID);
+   rcu_read_unlock();
if (!ssid_ie)
break;
if (nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2))


v4.15-rc7 regression/warning: suspicious RCU usage in net/wireless/util.c:778

2018-01-08 Thread Dominik Brodowski
On Sat, Dec 30, 2017 at 02:11:33PM +0100, Dominik Brodowski wrote:
> On Fri, Dec 22, 2017 at 08:20:12AM +0100, Dominik Brodowski wrote:
> > Dear all,
> > 
> > once the (wifi) link becomes ready, the following warning is emitted on
> > mainline (v4.15-rc4-202-gead68f216110) on my notebook:
> 
> ... and it is still present as of v4.15-rc5-149-g5aa90a845892

... and still present in v4.15-rc7:

[0.00] Linux version 4.15.0-rc7+ (brodo@light) (gcc version 7.2.1 
20171224 (GCC)) #2 SMP PREEMPT Mon Jan 8 08:58:57 CET 2018
...
[   19.182497] wlan0: associated
[   19.323473] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready

[   19.324512] =
[   19.324525] WARNING: suspicious RCU usage
[   19.324531] 4.15.0-rc7+ #2 Not tainted
[   19.324535] -
[   19.324541] /home/brodo/local/kernel/git/linux/net/wireless/util.c:778 
suspicious rcu_dereference_check() usage!
[   19.324545] 
   other info that might help us debug this:

[   19.324551] 
   rcu_scheduler_active = 2, debug_locks = 1
[   19.324556] 4 locks held by wpa_supplicant/777:
[   19.324561]  #0:  (cb_lock){}, at: [<a93b95ca>] 
genl_rcv+0x15/0x40
[   19.324590]  #1:  (genl_mutex){+.+.}, at: [<88de9868>] 
genl_rcv_msg+0x7a/0x90
[   19.324614]  #2:  (rtnl_mutex){+.+.}, at: [<d05b811d>] 
nl80211_pre_doit+0xe9/0x190
[   19.324639]  #3:  (>mtx){+.+.}, at: [<15e6766b>] 
nl80211_send_iface+0x319/0x8d0
[   19.324663] 
   stack backtrace:
[   19.324670] CPU: 3 PID: 777 Comm: wpa_supplicant Not tainted 4.15.0-rc7+ #2
[   19.324674] Hardware name: Dell Inc. XPS 13 9343/0TM99H, BIOS A11 12/08/2016
[   19.324679] Call Trace:
[   19.324690]  dump_stack+0x67/0x95
[   19.324698]  ieee80211_bss_get_ie+0x66/0x70
[   19.324707]  nl80211_send_iface+0x346/0x8d0
[   19.324726]  nl80211_get_interface+0x4b/0xa0
[   19.324738]  genl_family_rcv_msg+0x32e/0x3f0
[   19.324747]  ? preempt_count_sub+0x92/0xd0
[   19.324780]  genl_rcv_msg+0x47/0x90
[   19.324787]  ? genl_family_rcv_msg+0x3f0/0x3f0
[   19.324796]  netlink_rcv_skb+0x8a/0x120
[   19.324811]  genl_rcv+0x24/0x40
[   19.324818]  netlink_unicast+0x174/0x1f0
[   19.324831]  netlink_sendmsg+0x383/0x3d0
[   19.324851]  sock_sendmsg+0x2d/0x40
[   19.324859]  ___sys_sendmsg+0x2a8/0x300
[   19.324877]  ? netlink_sendmsg+0x13a/0x3d0
[   19.324919]  ? __sys_sendmsg+0x67/0xb0
[   19.324925]  __sys_sendmsg+0x67/0xb0
[   19.324949]  entry_SYSCALL_64_fastpath+0x18/0x85
[   19.324955] RIP: 0033:0x779ea30ac037
[   19.324960] RSP: 002b:7ffd9ea8aa28 EFLAGS: 0246

Anyone?

Thanks,
Dominik


v4.15-rc5 warning: suspicious RCU usage in net/wireless/util.c:778

2017-12-30 Thread Dominik Brodowski
On Fri, Dec 22, 2017 at 08:20:12AM +0100, Dominik Brodowski wrote:
> Dear all,
> 
> once the (wifi) link becomes ready, the following warning is emitted on
> mainline (v4.15-rc4-202-gead68f216110) on my notebook:

... and it is still present as of v4.15-rc5-149-g5aa90a845892

> [   22.770422] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
> 
> [   22.772364] =
> [   22.772369] WARNING: suspicious RCU usage
> [   22.772375] 4.15.0-rc4+ #5 Not tainted
> [   22.772380] -
> [   22.772386] /home/brodo/local/kernel/git/linux/net/wireless/util.c:778 
> suspicious rcu_dereference_check() usage!
> [   22.772391] 
> [   22.772397] 
> [   22.772402] 4 locks held by wpa_supplicant/774:
> [   22.772407]  #0:  (cb_lock){}, at: [<276dc3a0>] 
> genl_rcv+0x15/0x40
> [   22.772437]  #1:  (genl_mutex){+.+.}, at: [<24d83eb3>] 
> genl_rcv_msg+0x7a/0x90
> [   22.772463]  #2:  (rtnl_mutex){+.+.}, at: [<9de25a59>] 
> nl80211_pre_doit+0xe9/0x190
> [   22.772489]  #3:  (>mtx){+.+.}, at: [<89bf2cfd>] 
> nl80211_send_iface+0x317/0x8d0
> [   22.772516] 
> [   22.772522] CPU: 3 PID: 774 Comm: wpa_supplicant Not tainted 4.15.0-rc4+ #5
> [   22.772528] Hardware name: Dell Inc. XPS 13 9343/0TM99H, BIOS A11 
> 12/08/2016
> [   22.772532] Call Trace:
> [   22.772544]  dump_stack+0x67/0x95
> [   22.772553]  ieee80211_bss_get_ie+0x66/0x70
> [   22.772562]  nl80211_send_iface+0x344/0x8d0
> [   22.772585]  nl80211_get_interface+0x4b/0xa0
> [   22.772598]  genl_family_rcv_msg+0x32e/0x3f0
> [   22.772607]  ? preempt_count_sub+0x92/0xd0
> [   22.772645]  genl_rcv_msg+0x47/0x90
> [   22.772652]  ? genl_family_rcv_msg+0x3f0/0x3f0
> [   22.772661]  netlink_rcv_skb+0x8a/0x120
> [   22.772677]  genl_rcv+0x24/0x40
> [   22.772684]  netlink_unicast+0x174/0x1f0
> [   22.772698]  netlink_sendmsg+0x386/0x3d0
> [   22.772719]  sock_sendmsg+0x2d/0x40
> [   22.772728]  ___sys_sendmsg+0x2a7/0x300
> [   22.772748]  ? netlink_sendmsg+0x13d/0x3d0
> [   22.772791]  ? __sys_sendmsg+0x67/0xb0
> [   22.772797]  __sys_sendmsg+0x67/0xb0
> [   22.772822]  entry_SYSCALL_64_fastpath+0x18/0x85
> 
> This warning wasn't present in 4.15. Despite of it, networking seems to
> work fine. Nonetheless, the code seems to need a bugfix.

Thanks,
Dominik


suspicious RCU usage in net/wireless/util.c:778

2017-12-21 Thread Dominik Brodowski
Dear all,

once the (wifi) link becomes ready, the following warning is emitted on
mainline (v4.15-rc4-202-gead68f216110) on my notebook:

[   22.770422] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready

[   22.772364] =
[   22.772369] WARNING: suspicious RCU usage
[   22.772375] 4.15.0-rc4+ #5 Not tainted
[   22.772380] -
[   22.772386] /home/brodo/local/kernel/git/linux/net/wireless/util.c:778 
suspicious rcu_dereference_check() usage!
[   22.772391] 
[   22.772397] 
[   22.772402] 4 locks held by wpa_supplicant/774:
[   22.772407]  #0:  (cb_lock){}, at: [<276dc3a0>] 
genl_rcv+0x15/0x40
[   22.772437]  #1:  (genl_mutex){+.+.}, at: [<24d83eb3>] 
genl_rcv_msg+0x7a/0x90
[   22.772463]  #2:  (rtnl_mutex){+.+.}, at: [<9de25a59>] 
nl80211_pre_doit+0xe9/0x190
[   22.772489]  #3:  (>mtx){+.+.}, at: [<89bf2cfd>] 
nl80211_send_iface+0x317/0x8d0
[   22.772516] 
[   22.772522] CPU: 3 PID: 774 Comm: wpa_supplicant Not tainted 4.15.0-rc4+ #5
[   22.772528] Hardware name: Dell Inc. XPS 13 9343/0TM99H, BIOS A11 12/08/2016
[   22.772532] Call Trace:
[   22.772544]  dump_stack+0x67/0x95
[   22.772553]  ieee80211_bss_get_ie+0x66/0x70
[   22.772562]  nl80211_send_iface+0x344/0x8d0
[   22.772585]  nl80211_get_interface+0x4b/0xa0
[   22.772598]  genl_family_rcv_msg+0x32e/0x3f0
[   22.772607]  ? preempt_count_sub+0x92/0xd0
[   22.772645]  genl_rcv_msg+0x47/0x90
[   22.772652]  ? genl_family_rcv_msg+0x3f0/0x3f0
[   22.772661]  netlink_rcv_skb+0x8a/0x120
[   22.772677]  genl_rcv+0x24/0x40
[   22.772684]  netlink_unicast+0x174/0x1f0
[   22.772698]  netlink_sendmsg+0x386/0x3d0
[   22.772719]  sock_sendmsg+0x2d/0x40
[   22.772728]  ___sys_sendmsg+0x2a7/0x300
[   22.772748]  ? netlink_sendmsg+0x13d/0x3d0
[   22.772791]  ? __sys_sendmsg+0x67/0xb0
[   22.772797]  __sys_sendmsg+0x67/0xb0
[   22.772822]  entry_SYSCALL_64_fastpath+0x18/0x85

This warning wasn't present in 4.15. Despite of it, networking seems to
work fine. Nonetheless, the code seems to need a bugfix.

Thanks,
Dominik


signature.asc
Description: PGP signature


[PATCH 4/9] pcmcia: remove prod_id indirection

2006-12-05 Thread Dominik Brodowski
From: Dominik Brodowski [EMAIL PROTECTED]
Date: Sun, 4 Jun 2006 18:06:13 +0200
Subject: [PATCH] pcmcia: remove prod_id indirection

As we read out the product information strings (VERS_1) from the PCMCIA device
in the PCMCIA core, and device drivers can access those reliably in struct
pcmcia_device's fields prod_id[], remove additional product information string
detection logic from PCMCIA device drivers.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]
---
 drivers/isdn/hardware/avm/avm_cs.c |   14 +++---
 drivers/isdn/hisax/avma1_cs.c  |   14 +++---
 drivers/net/pcmcia/3c574_cs.c  |9 +++--
 drivers/net/pcmcia/smc91c92_cs.c   |   27 ---
 drivers/net/pcmcia/xirc2ps_cs.c|   19 ---
 drivers/net/wireless/ray_cs.c  |   15 +--
 drivers/telephony/ixj_pcmcia.c |   30 ++
 7 files changed, 40 insertions(+), 88 deletions(-)

diff --git a/drivers/isdn/hardware/avm/avm_cs.c 
b/drivers/isdn/hardware/avm/avm_cs.c
index 7bbfd85..db3755b 100644
--- a/drivers/isdn/hardware/avm/avm_cs.c
+++ b/drivers/isdn/hardware/avm/avm_cs.c
@@ -217,18 +217,10 @@ static int avmcs_config(struct pcmcia_de
 }
 
 do {
-
-   tuple.Attributes = 0;
-   tuple.TupleData = buf;
-   tuple.TupleDataMax = 254;
-   tuple.TupleOffset = 0;
-   tuple.DesiredTuple = CISTPL_VERS_1;
-
devname[0] = 0;
-   if( !first_tuple(link, tuple, parse)  parse.version_1.ns  1 ) {
-   strlcpy(devname,parse.version_1.str + parse.version_1.ofs[1], 
-   sizeof(devname));
-   }
+   if (link-prod_id[1])
+   strlcpy(devname, link-prod_id[1], sizeof(devname));
+
/*
  * find IO port
  */
diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c
index ac28e32..40c9b02 100644
--- a/drivers/isdn/hisax/avma1_cs.c
+++ b/drivers/isdn/hisax/avma1_cs.c
@@ -239,18 +239,10 @@ static int avma1cs_config(struct pcmcia_
 }
 
 do {
-
-   tuple.Attributes = 0;
-   tuple.TupleData = buf;
-   tuple.TupleDataMax = 254;
-   tuple.TupleOffset = 0;
-   tuple.DesiredTuple = CISTPL_VERS_1;
-
devname[0] = 0;
-   if( !first_tuple(link, tuple, parse)  parse.version_1.ns  1 ) {
-   strlcpy(devname,parse.version_1.str + parse.version_1.ofs[1], 
-   sizeof(devname));
-   }
+   if (link-prod_id[1])
+   strlcpy(devname, link-prod_id[1], sizeof(devname));
+
/*
  * find IO port
  */
diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c
index 0460099..420f70b 100644
--- a/drivers/net/pcmcia/3c574_cs.c
+++ b/drivers/net/pcmcia/3c574_cs.c
@@ -397,12 +397,9 @@ static int tc574_config(struct pcmcia_de
goto failed;
}
}
-   tuple.DesiredTuple = CISTPL_VERS_1;
-   if (pcmcia_get_first_tuple(link, tuple) == CS_SUCCESS 
-   pcmcia_get_tuple_data(link, tuple) == CS_SUCCESS 
-   pcmcia_parse_tuple(link, tuple, parse) == CS_SUCCESS) {
-   cardname = parse.version_1.str + parse.version_1.ofs[1];
-   } else
+   if (link-prod_id[1])
+   cardname = link-prod_id[1];
+   else
cardname = 3Com 3c574;
 
{
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c
index ae024bf..bf40848 100644
--- a/drivers/net/pcmcia/smc91c92_cs.c
+++ b/drivers/net/pcmcia/smc91c92_cs.c
@@ -560,16 +560,8 @@ static int mhz_setup(struct pcmcia_devic
 
 /* Read the station address from the CIS.  It is stored as the last
(fourth) string in the Version 1 Version/ID tuple. */
-tuple-DesiredTuple = CISTPL_VERS_1;
-if (first_tuple(link, tuple, parse) != CS_SUCCESS) {
-   rc = -1;
-   goto free_cfg_mem;
-}
-/* Ugh -- the EM1144 card has two VERS_1 tuples!?! */
-if (next_tuple(link, tuple, parse) != CS_SUCCESS)
-   first_tuple(link, tuple, parse);
-if (parse-version_1.ns  3) {
-   station_addr = parse-version_1.str + parse-version_1.ofs[3];
+if (link-prod_id[3]) {
+   station_addr = link-prod_id[3];
if (cvt_ascii_address(dev, station_addr) == 0) {
rc = 0;
goto free_cfg_mem;
@@ -744,15 +736,12 @@ static int smc_setup(struct pcmcia_devic
}
 }
 /* Try the third string in the Version 1 Version/ID tuple. */
-tuple-DesiredTuple = CISTPL_VERS_1;
-if (first_tuple(link, tuple, parse) != CS_SUCCESS) {
-   rc = -1;
-   goto free_cfg_mem;
-}
-station_addr = parse-version_1.str + parse-version_1.ofs[2];
-if (cvt_ascii_address(dev, station_addr) == 0) {
-   rc = 0;
-   goto free_cfg_mem;
+if (link-prod_id[2]) {
+   station_addr = link-prod_id[2];
+   if (cvt_ascii_address(dev, station_addr) == 0) {
+   rc = 0;
+   goto free_cfg_mem

[PATCH 3/9] pcmcia: remove manf_id and card_id indirection

2006-12-05 Thread Dominik Brodowski
From: Dominik Brodowski [EMAIL PROTECTED]
Date: Wed, 25 Oct 2006 21:28:53 -0400
Subject: [PATCH] pcmcia: remove manf_id and card_id indirection

As we read out the manufactor and card_id from the PCMCIA device in the
PCMCIA core, and device drivers can access those reliably in struct
pcmcia_device's fields manf_id and card_id, remove additional (and partly
broken) manf_id and card_id detection logic from PCMCIA device drivers.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]
---
 drivers/ata/pata_pcmcia.c   |6 +++---
 drivers/ide/legacy/ide-cs.c |   10 +++---
 drivers/net/pcmcia/3c589_cs.c   |   12 
 drivers/net/pcmcia/fmvj18x_cs.c |   26 --
 drivers/net/pcmcia/pcnet_cs.c   |   22 +++---
 drivers/net/pcmcia/smc91c92_cs.c|8 ++--
 drivers/net/wireless/hostap/hostap_cs.c |7 ++-
 drivers/scsi/pcmcia/qlogic_stub.c   |4 +---
 drivers/scsi/pcmcia/sym53c500_cs.c  |5 +
 drivers/serial/serial_cs.c  |   30 ++
 10 files changed, 45 insertions(+), 85 deletions(-)

diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c
index 3ce33bf..da7c218 100644
--- a/drivers/ata/pata_pcmcia.c
+++ b/drivers/ata/pata_pcmcia.c
@@ -164,9 +164,9 @@ static int pcmcia_init_one(struct pcmcia
 
/* See if we have a manufacturer identifier. Use it to set is_kme for
   vendor quirks */
-   tuple.DesiredTuple = CISTPL_MANFID;
-   if (!pcmcia_get_first_tuple(pdev, tuple)  
!pcmcia_get_tuple_data(pdev, tuple)  !pcmcia_parse_tuple(pdev, tuple, 
stk-parse))
-   is_kme = ((stk-parse.manfid.manf == MANFID_KME)  
((stk-parse.manfid.card == PRODID_KME_KXLC005_A) || (stk-parse.manfid.card == 
PRODID_KME_KXLC005_B)));
+   is_kme = ((pdev-manf_id == MANFID_KME) 
+ ((pdev-card_id == PRODID_KME_KXLC005_A) ||
+  (pdev-card_id == PRODID_KME_KXLC005_B)));
 
/* Not sure if this is right... look up the current Vcc */
CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(pdev, 
stk-conf));
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c
index 7e8d778..1b996e6 100644
--- a/drivers/ide/legacy/ide-cs.c
+++ b/drivers/ide/legacy/ide-cs.c
@@ -199,13 +199,9 @@ static int ide_config(struct pcmcia_devi
 link-conf.ConfigBase = stk-parse.config.base;
 link-conf.Present = stk-parse.config.rmask[0];
 
-tuple.DesiredTuple = CISTPL_MANFID;
-if (!pcmcia_get_first_tuple(link, tuple) 
-   !pcmcia_get_tuple_data(link, tuple) 
-   !pcmcia_parse_tuple(link, tuple, stk-parse))
-   is_kme = ((stk-parse.manfid.manf == MANFID_KME) 
- ((stk-parse.manfid.card == PRODID_KME_KXLC005_A) ||
-  (stk-parse.manfid.card == PRODID_KME_KXLC005_B)));
+is_kme = ((link-manf_id == MANFID_KME) 
+ ((link-card_id == PRODID_KME_KXLC005_A) ||
+  (link-card_id == PRODID_KME_KXLC005_B)));
 
 /* Not sure if this is right... look up the current Vcc */
 CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, 
stk-conf));
diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c
index 231fa2c..eb57832 100644
--- a/drivers/net/pcmcia/3c589_cs.c
+++ b/drivers/net/pcmcia/3c589_cs.c
@@ -272,17 +272,13 @@ static int tc589_config(struct pcmcia_de
 CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, tuple, parse));
 link-conf.ConfigBase = parse.config.base;
 link-conf.Present = parse.config.rmask[0];
-
-/* Is this a 3c562? */
-tuple.DesiredTuple = CISTPL_MANFID;
 tuple.Attributes = TUPLE_RETURN_COMMON;
-if ((pcmcia_get_first_tuple(link, tuple) == CS_SUCCESS) 
-   (pcmcia_get_tuple_data(link, tuple) == CS_SUCCESS)) {
-   if (le16_to_cpu(buf[0]) != MANFID_3COM)
+
+/* Is this a 3c562? */
+if (link-manf_id != MANFID_3COM)
printk(KERN_INFO 3c589_cs: hmmm, is this really a 
   3Com card??\n);
-   multi = (le16_to_cpu(buf[1]) == PRODID_3COM_3C562);
-}
+multi = (link-card_id == PRODID_3COM_3C562);
 
 /* For the 3c562, the base address must be xx00-xx7f */
 link-io.IOAddrLines = 16;
diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c
index 65f6fdf..e3731fd 100644
--- a/drivers/net/pcmcia/fmvj18x_cs.c
+++ b/drivers/net/pcmcia/fmvj18x_cs.c
@@ -374,17 +374,12 @@ static int fmvj18x_config(struct pcmcia_
CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, tuple));
CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, tuple, parse));
link-conf.ConfigIndex = parse.cftable_entry.index;
-   tuple.DesiredTuple = CISTPL_MANFID;
-   if (pcmcia_get_first_tuple(link, tuple) == CS_SUCCESS)
-   CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, tuple));
-   else
-   buf[0] = 0x;
-   switch (le16_to_cpu(buf[0])) {
+   switch

[PATCH 5/9] pcmcia: conf.ConfigBase and conf.Present consolidation

2006-12-05 Thread Dominik Brodowski
From: Dominik Brodowski [EMAIL PROTECTED]
Date: Wed, 25 Oct 2006 21:49:27 -0400
Subject: [PATCH] pcmcia: conf.ConfigBase and conf.Present consolidation

struct pcmcia_device *p_dev-conf.ConfigBase and .Present are set in almost
all PCMICA driver right at the beginning, using the same calls but slightly
different implementations. Unfiy this in the PCMCIA core.

Includes a small bugfix (drivers/net/pcmcia/xirc2ps_cs.c: remove unused
label) from and Signed-off-by Adrian Bunk [EMAIL PROTECTED]

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]
---
 drivers/ata/pata_pcmcia.c   |7 -
 drivers/bluetooth/bluecard_cs.c |   38 +--
 drivers/bluetooth/bt3c_cs.c |   20 +---
 drivers/bluetooth/btuart_cs.c   |   20 +---
 drivers/bluetooth/dtl1_cs.c |   20 +---
 drivers/char/pcmcia/cm4000_cs.c |   20 
 drivers/char/pcmcia/cm4040_cs.c |   20 
 drivers/char/pcmcia/synclink_cs.c   |7 -
 drivers/ide/legacy/ide-cs.c |6 -
 drivers/isdn/hardware/avm/avm_cs.c  |   22 --
 drivers/isdn/hisax/avma1_cs.c   |   22 --
 drivers/isdn/hisax/elsa_cs.c|   17 -
 drivers/isdn/hisax/sedlbauer_cs.c   |   10 
 drivers/isdn/hisax/teles_cs.c   |   17 -
 drivers/net/pcmcia/3c574_cs.c   |   16 +++-
 drivers/net/pcmcia/3c589_cs.c   |7 -
 drivers/net/pcmcia/axnet_cs.c   |6 +
 drivers/net/pcmcia/com20020_cs.c|   13 --
 drivers/net/pcmcia/fmvj18x_cs.c |   14 +--
 drivers/net/pcmcia/ibmtr_cs.c   |   12 -
 drivers/net/pcmcia/nmclan_cs.c  |   12 +-
 drivers/net/pcmcia/pcnet_cs.c   |8 --
 drivers/net/pcmcia/smc91c92_cs.c|   24 ---
 drivers/net/pcmcia/xirc2ps_cs.c |9 ---
 drivers/net/wireless/airo_cs.c  |   19 +++
 drivers/net/wireless/atmel_cs.c |   11 -
 drivers/net/wireless/hostap/hostap_cs.c |6 -
 drivers/net/wireless/netwave_cs.c   |   18 --
 drivers/net/wireless/orinoco_cs.c   |   19 +++
 drivers/net/wireless/ray_cs.c   |   15 
 drivers/net/wireless/spectrum_cs.c  |   19 +++
 drivers/net/wireless/wavelan_cs.c   |   33 --
 drivers/net/wireless/wl3501_cs.c|   15 
 drivers/parport/parport_cs.c|8 --
 drivers/pcmcia/ds.c |   13 ++
 drivers/scsi/pcmcia/aha152x_stub.c  |7 +-
 drivers/scsi/pcmcia/fdomain_stub.c  |5 
 drivers/scsi/pcmcia/nsp_cs.c|6 -
 drivers/scsi/pcmcia/qlogic_stub.c   |9 +-
 drivers/scsi/pcmcia/sym53c500_cs.c  |9 +-
 drivers/serial/serial_cs.c  |   13 +-
 drivers/telephony/ixj_pcmcia.c  |7 -
 drivers/usb/host/sl811_cs.c |   15 +++-
 sound/pcmcia/pdaudiocf/pdaudiocf.c  |   21 -
 sound/pcmcia/vx/vxpocket.c  |   26 +
 45 files changed, 47 insertions(+), 614 deletions(-)

diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c
index da7c218..9ed7f58 100644
--- a/drivers/ata/pata_pcmcia.c
+++ b/drivers/ata/pata_pcmcia.c
@@ -154,13 +154,6 @@ static int pcmcia_init_one(struct pcmcia
tuple.TupleOffset = 0;
tuple.TupleDataMax = 255;
tuple.Attributes = 0;
-   tuple.DesiredTuple = CISTPL_CONFIG;
-
-   CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(pdev, tuple));
-   CS_CHECK(GetTupleData, pcmcia_get_tuple_data(pdev, tuple));
-   CS_CHECK(ParseTuple, pcmcia_parse_tuple(pdev, tuple, stk-parse));
-   pdev-conf.ConfigBase = stk-parse.config.base;
-   pdev-conf.Present = stk-parse.config.rmask[0];
 
/* See if we have a manufacturer identifier. Use it to set is_kme for
   vendor quirks */
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c
index cbc0725..acfb6a4 100644
--- a/drivers/bluetooth/bluecard_cs.c
+++ b/drivers/bluetooth/bluecard_cs.c
@@ -892,43 +892,10 @@ static void bluecard_detach(struct pcmci
 }
 
 
-static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple, 
cisparse_t *parse)
-{
-   int i;
-
-   i = pcmcia_get_first_tuple(handle, tuple);
-   if (i != CS_SUCCESS)
-   return CS_NO_MORE_ITEMS;
-
-   i = pcmcia_get_tuple_data(handle, tuple);
-   if (i != CS_SUCCESS)
-   return i;
-
-   return pcmcia_parse_tuple(handle, tuple, parse);
-}
-
 static int bluecard_config(struct pcmcia_device *link)
 {
bluecard_info_t *info = link-priv;
-   tuple_t tuple;
-   u_short buf[256];
-   cisparse_t parse;
-   int i, n, last_ret, last_fn

[RFC PATCH 2/11] pcmcia: add more IDs to hostap_cs.c

2006-10-25 Thread Dominik Brodowski
From: Dominik Brodowski [EMAIL PROTECTED]
Date: Sun, 2 Jul 2006 21:21:51 +0200
Subject: [PATCH] pcmcia: add more IDs to hostap_cs.c

As a replacement for the broad manufactor/card ID match we commented out
because of conflicts with pcnet_cs, add two product ID matches.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]
---
 drivers/net/wireless/hostap/hostap_cs.c |7 +++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/hostap/hostap_cs.c 
b/drivers/net/wireless/hostap/hostap_cs.c
index 686d895..f63909e 100644
--- a/drivers/net/wireless/hostap/hostap_cs.c
+++ b/drivers/net/wireless/hostap/hostap_cs.c
@@ -887,6 +887,13 @@ static struct pcmcia_device_id hostap_cs
PCMCIA_DEVICE_PROD_ID123(
U.S. Robotics, IEEE 802.11b PC-CARD, Version 01.02,
0xc7b8df9d, 0x1700d087, 0x4b74baa0),
+   PCMCIA_DEVICE_PROD_ID123(
+   Allied Telesyn, AT-WCL452 Wireless PCMCIA Radio,
+   Ver. 1.00,
+   0x5cd01705, 0x4271660f, 0x9d08ee12),
+   PCMCIA_DEVICE_PROD_ID123(
+   corega, WL PCCL-11, ISL37300P,
+   0xa21501a, 0x59868926, 0xc9049a39),
PCMCIA_DEVICE_NULL
 };
 MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids);
-- 
1.4.3

-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC PATCH 0/11] pcmcia: bugfixes for 2.6.19-rc3

2006-10-25 Thread Dominik Brodowski
Hi,

The following eleven patches have all been queued in -mm for quite some
time; the only change is that one suggestion by Pavel Roskin (to remove the
RevA part of the new ID for hostap_cs.c) is implemented. Please let me
know if there are any objections to any of these patches; if not, I'll
submit them to Linus really soon now.

Thanks,
Dominik


 drivers/net/wireless/hostap/hostap_cs.c |7 +++
 drivers/pcmcia/at91_cf.c|   28 +---
 drivers/pcmcia/au1000_generic.c |   25 +++--
 drivers/pcmcia/ds.c |   29 -
 drivers/pcmcia/i82092.c |9 +
 drivers/pcmcia/m8xx_pcmcia.c|   12 
 drivers/pcmcia/omap_cf.c|3 ++-
 drivers/pcmcia/pcmcia_ioctl.c   |   11 ---
 drivers/pcmcia/pcmcia_resource.c|2 +-
 drivers/pcmcia/pd6729.c |4 
 drivers/pcmcia/soc_common.c |1 +
 drivers/pcmcia/yenta_socket.c   |   22 +-
 12 files changed, 105 insertions(+), 48 deletions(-)

Alexey Dobriyan (2):
  CONFIG_PM=n slim: drivers/pcmcia/*
  i82092: wire up errors from pci_register_driver()

Amol Lad (1):
  ioremap balanced with iounmap for drivers/pcmcia

David Brownell (1):
  pcmcia: at91_cf update

Dominik Brodowski (2):
  pcmcia: add more IDs to hostap_cs.c
  PCMCIA: fix __must_check warnings

Jeff Garzik (1):
  PCMCIA: handle sysfs, PCI errors

Jonathan McDowell (1):
  Export soc_common_drv_pcmcia_remove to allow modular PCMCIA.

Kaustav Majumdar (1):
  pcmcia: update alloc_io_space for conflict checking for multifunction PC 
card

Om Narasimhan (1):
  pcmcia: au1000_generic fix

Randy Dunlap (1):
  pcmcia/ds: driver layer error checking


pgp2xOJsdycbk.pgp
Description: PGP signature


Re: [PATCH 9/15] pcmcia: hostap_cs.c - 0xc00f, 0x0000 conflicts with pcnet_cs

2006-07-03 Thread Dominik Brodowski
Hi Pavel,

On Fri, Jun 30, 2006 at 05:18:43PM -0400, Pavel Roskin wrote:
 On Fri, 2006-06-30 at 21:59 +0200, Dominik Brodowski wrote:
  -   PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x),
  +/* PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x),conflict with pcnet_cs */
 
 That's fine if we also add symbolic names.  I could identify two
 hostap_cs compatible cards using this ID :
 
 card Allied Telesyn AT-WCL452
  version Allied Telesyn, AT-WCL452 Wireless PCMCIA Radio, Ver.
 1.00
  manfid 0xc00f, 0x
  bind hostap_cs
 
 card corega WL PCCL-11
  version corega, WL PCCL-11, ISL37300P, RevA
  manfid 0xc00f, 0x
  bind hostap_cs

Like this?

From: Dominik Brodowski [EMAIL PROTECTED]
Date: Sun, 2 Jul 2006 21:21:51 +0200
Subject: [PATCH] pcmcia: add more IDs to hostap_cs.c

As a replacement for the broad manufactor/card ID match we commented out
because of conflicts with pcnet_cs, add two product ID matches.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]
---
 drivers/net/wireless/hostap/hostap_cs.c |7 +++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/hostap/hostap_cs.c 
b/drivers/net/wireless/hostap/hostap_cs.c
index 52e6df5..f39d735 100644
--- a/drivers/net/wireless/hostap/hostap_cs.c
+++ b/drivers/net/wireless/hostap/hostap_cs.c
@@ -886,6 +886,13 @@ static struct pcmcia_device_id hostap_cs
PCMCIA_DEVICE_PROD_ID123(
U.S. Robotics, IEEE 802.11b PC-CARD, Version 01.02,
0xc7b8df9d, 0x1700d087, 0x4b74baa0),
+   PCMCIA_DEVICE_PROD_ID123(
+   Allied Telesyn, AT-WCL452 Wireless PCMCIA Radio,
+   Ver. 1.00,
+   0x5cd01705, 0x4271660f, 0x9d08ee12),
+   PCMCIA_DEVICE_PROD_ID1234(
+   corega, WL PCCL-11, ISL37300P, RevA,
+   0xa21501a, 0x59868926, 0xc9049a39, 0x57a66194),
PCMCIA_DEVICE_NULL
 };
 MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids);
-- 
1.4.0

-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 14/15] com20020_cs: more device support

2006-06-30 Thread Dominik Brodowski

From: Marc Sowen [EMAIL PROTECTED]
Date: Sun, 25 Jun 2006 01:56:24 -0700
Subject: [PATCH] com20020_cs: more device support

Enable the com20020_cs arcnet driver to see the SoHard (now Mercury
Computer Systems Inc.) SH ARC-PCMCIA card.

Signed-off-by: Andrew Morton [EMAIL PROTECTED]
Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]
---
 drivers/net/pcmcia/com20020_cs.c |5 -
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/drivers/net/pcmcia/com20020_cs.c b/drivers/net/pcmcia/com20020_cs.c
index 441de82..48434d7 100644
--- a/drivers/net/pcmcia/com20020_cs.c
+++ b/drivers/net/pcmcia/com20020_cs.c
@@ -387,7 +387,10 @@ static int com20020_resume(struct pcmcia
 }
 
 static struct pcmcia_device_id com20020_ids[] = {
-   PCMCIA_DEVICE_PROD_ID12(Contemporary Control Systems, Inc., PCM20 
Arcnet Adapter, 0x59991666, 0x95dfffaf),
+   PCMCIA_DEVICE_PROD_ID12(Contemporary Control Systems, Inc.,
+   PCM20 Arcnet Adapter, 0x59991666, 0x95dfffaf),
+   PCMCIA_DEVICE_PROD_ID12(SoHard AG,
+   SH ARC PCMCIA, 0xf8991729, 0x69dff0c7),
PCMCIA_DEVICE_NULL
 };
 MODULE_DEVICE_TABLE(pcmcia, com20020_ids);
-- 
1.4.0

-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 9/15] pcmcia: hostap_cs.c - 0xc00f,0x0000 conflicts with pcnet_cs

2006-06-30 Thread Dominik Brodowski

From: Komuro [EMAIL PROTECTED]
Date: Mon, 17 Apr 2006 21:41:21 +0900
Subject: [PATCH] pcmcia: hostap_cs.c - 0xc00f,0x conflicts with pcnet_cs

Comment out the ID 0xc00f,0x in hostap_cs.c, as it conflicts with the
pcnet_cs driver.

Signed-off-by: [EMAIL PROTECTED]
Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]
---
 drivers/net/wireless/hostap/hostap_cs.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/net/wireless/hostap/hostap_cs.c 
b/drivers/net/wireless/hostap/hostap_cs.c
index db03dc2..fbb4189 100644
--- a/drivers/net/wireless/hostap/hostap_cs.c
+++ b/drivers/net/wireless/hostap/hostap_cs.c
@@ -844,7 +844,7 @@ static struct pcmcia_device_id hostap_cs
PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001),
PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001),
PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300),
-   PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x),
+/* PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x),conflict with pcnet_cs */
PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002),
PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005),
PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010),
-- 
1.4.0

-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC PATCH 1/8] pcmcia: add new ID to pcnet_cs

2006-04-18 Thread Dominik Brodowski
Please review these patches which I inted to push upstream for 2.6.17 soon.
Thanks,
Dominik

Subject: [PATCH] pcmcia: add new ID to pcnet_cs

This adds a new ID to pcnet_cs, as noted by Kuro Moji.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]

---

 drivers/net/pcmcia/pcnet_cs.c |1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

af6f85925c2984c3596ba480c19573e55724bbdf
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c
index 506e777..d090df4 100644
--- a/drivers/net/pcmcia/pcnet_cs.c
+++ b/drivers/net/pcmcia/pcnet_cs.c
@@ -1639,6 +1639,7 @@ static struct pcmcia_device_id pcnet_ids
PCMCIA_DEVICE_PROD_ID12(CONTEC, C-NET(PC)C-10L, 0x21cab552, 
0xf6f90722),
PCMCIA_DEVICE_PROD_ID12(corega, FEther PCC-TXF, 0x0a21501a, 
0xa51564a2),
PCMCIA_DEVICE_PROD_ID12(corega K.K., corega EtherII PCC-T, 
0x5261440f, 0xfa9d85bd),
+   PCMCIA_DEVICE_PROD_ID12(corega K.K., corega EtherII PCC-TD, 
0x5261440f, 0xc49bd73d),
PCMCIA_DEVICE_PROD_ID12(Corega K.K., corega EtherII PCC-TD, 
0xd4fdcbd8, 0xc49bd73d),
PCMCIA_DEVICE_PROD_ID12(corega K.K., corega Ether PCC-T, 
0x5261440f, 0x6705fcaa),
PCMCIA_DEVICE_PROD_ID12(corega K.K., corega FastEther PCC-TX, 
0x5261440f, 0x485e85d9),
-- 
1.2.6

-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 19/33] pcmcia: default suspend and resume handling

2006-03-31 Thread Dominik Brodowski
In all but one case, the suspend and resume functions of PCMCIA drivers
contain mostly of calls to pcmcia_release_configuration() and
pcmcia_request_configuration(). Therefore, move this code out of the
drivers and into the core.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]

---

 drivers/bluetooth/bluecard_cs.c |   24 
 drivers/bluetooth/bt3c_cs.c |   24 
 drivers/bluetooth/btuart_cs.c   |   25 
 drivers/bluetooth/dtl1_cs.c |   24 
 drivers/char/pcmcia/cm4000_cs.c |9 ---
 drivers/char/pcmcia/cm4040_cs.c |   24 
 drivers/char/pcmcia/synclink_cs.c   |6 -
 drivers/ide/legacy/ide-cs.c |   23 ---
 drivers/isdn/hardware/avm/avm_cs.c  |   38 ---
 drivers/isdn/hisax/avma1_cs.c   |   26 +
 drivers/isdn/hisax/elsa_cs.c|6 -
 drivers/isdn/hisax/sedlbauer_cs.c   |6 -
 drivers/isdn/hisax/teles_cs.c   |6 -
 drivers/net/pcmcia/3c574_cs.c   |   18 ---
 drivers/net/pcmcia/3c589_cs.c   |   18 ---
 drivers/net/pcmcia/axnet_cs.c   |   18 ---
 drivers/net/pcmcia/com20020_cs.c|   23 ++-
 drivers/net/pcmcia/fmvj18x_cs.c |   19 
 drivers/net/pcmcia/ibmtr_cs.c   |   20 +---
 drivers/net/pcmcia/nmclan_cs.c  |   19 
 drivers/net/pcmcia/pcnet_cs.c   |   20 +---
 drivers/net/pcmcia/smc91c92_cs.c|2 --
 drivers/net/pcmcia/xirc2ps_cs.c |   16 +++--
 drivers/net/wireless/airo_cs.c  |9 ++-
 drivers/net/wireless/atmel_cs.c |7 +-
 drivers/net/wireless/hostap/hostap_cs.c |6 -
 drivers/net/wireless/netwave_cs.c   |   18 ---
 drivers/net/wireless/orinoco_cs.c   |8 ---
 drivers/net/wireless/ray_cs.c   |   22 +-
 drivers/net/wireless/spectrum_cs.c  |7 --
 drivers/net/wireless/wavelan_cs.c   |   24 +---
 drivers/net/wireless/wl3501_cs.c|   18 ---
 drivers/parport/parport_cs.c|   23 ---
 drivers/pcmcia/ds.c |   30 +---
 drivers/scsi/pcmcia/aha152x_stub.c  |   18 +--
 drivers/scsi/pcmcia/fdomain_stub.c  |   17 +-
 drivers/scsi/pcmcia/nsp_cs.c|   10 
 drivers/scsi/pcmcia/qlogic_stub.c   |   13 ---
 drivers/scsi/pcmcia/sym53c500_cs.c  |   15 
 drivers/serial/serial_cs.c  |9 ++-
 drivers/telephony/ixj_pcmcia.c  |   24 
 drivers/usb/host/sl811_cs.c |   24 
 include/pcmcia/ds.h |3 +-
 sound/pcmcia/pdaudiocf/pdaudiocf.c  |   10 
 sound/pcmcia/vx/vxpocket.c  |9 ---
 45 files changed, 105 insertions(+), 633 deletions(-)

8661bb5b4af1849c1f5a4e80c4e275fd13c155d6
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c
index 128e416..bb833b2 100644
--- a/drivers/bluetooth/bluecard_cs.c
+++ b/drivers/bluetooth/bluecard_cs.c
@@ -1005,28 +1005,6 @@ static void bluecard_release(dev_link_t 
pcmcia_disable_device(link-handle);
 }
 
-static int bluecard_suspend(struct pcmcia_device *dev)
-{
-   dev_link_t *link = dev_to_instance(dev);
-
-   link-state |= DEV_SUSPEND;
-   if (link-state  DEV_CONFIG)
-   pcmcia_release_configuration(link-handle);
-
-   return 0;
-}
-
-static int bluecard_resume(struct pcmcia_device *dev)
-{
-   dev_link_t *link = dev_to_instance(dev);
-
-   link-state = ~DEV_SUSPEND;
-   if (DEV_OK(link))
-   pcmcia_request_configuration(link-handle, link-conf);
-
-   return 0;
-}
-
 static struct pcmcia_device_id bluecard_ids[] = {
PCMCIA_DEVICE_PROD_ID12(BlueCard, LSE041, 0xbaf16fbf, 0x657cc15e),
PCMCIA_DEVICE_PROD_ID12(BTCFCARD, LSE139, 0xe3987764, 0x2524b59c),
@@ -1043,8 +1021,6 @@ static struct pcmcia_driver bluecard_dri
.probe  = bluecard_attach,
.remove = bluecard_detach,
.id_table   = bluecard_ids,
-   .suspend= bluecard_suspend,
-   .resume = bluecard_resume,
 };
 
 static int __init init_bluecard_cs(void)
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c
index ac1410c..7b0f4f0 100644
--- a/drivers/bluetooth/bt3c_cs.c
+++ b/drivers/bluetooth/bt3c_cs.c
@@ -842,28 +842,6 @@ static void bt3c_release(dev_link_t *lin
pcmcia_disable_device(link-handle);
 }
 
-static int bt3c_suspend(struct pcmcia_device *dev)
-{
-   dev_link_t *link = dev_to_instance(dev);
-
-   link-state |= DEV_SUSPEND;
-   if (link-state

[PATCH 17/33] pcmcia: add pcmcia_disable_device

2006-03-31 Thread Dominik Brodowski
pcmcia_disable_device(struct pcmcia_device *p_dev) performs the necessary
cleanups upon device or driver removal: it calls the appropriate
pcmcia_release_* functions, and can replace (most) of the current drivers'
_release() functions.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]

---

 Documentation/pcmcia/driver-changes.txt |6 +++
 drivers/bluetooth/bluecard_cs.c |8 ---
 drivers/bluetooth/bt3c_cs.c |8 ---
 drivers/bluetooth/btuart_cs.c   |8 ---
 drivers/bluetooth/dtl1_cs.c |8 ---
 drivers/char/pcmcia/cm4000_cs.c |3 -
 drivers/char/pcmcia/cm4040_cs.c |3 -
 drivers/char/pcmcia/synclink_cs.c   |   10 
 drivers/ide/legacy/ide-cs.c |8 ---
 drivers/isdn/hardware/avm/avm_cs.c  |   12 +
 drivers/isdn/hisax/avma1_cs.c   |   17 ++-
 drivers/isdn/hisax/elsa_cs.c|   10 
 drivers/isdn/hisax/sedlbauer_cs.c   |   17 ---
 drivers/isdn/hisax/teles_cs.c   |   10 
 drivers/net/pcmcia/3c574_cs.c   |8 ---
 drivers/net/pcmcia/3c589_cs.c   |8 ---
 drivers/net/pcmcia/axnet_cs.c   |8 ---
 drivers/net/pcmcia/com20020_cs.c|   12 +
 drivers/net/pcmcia/fmvj18x_cs.c |   12 +
 drivers/net/pcmcia/ibmtr_cs.c   |   23 --
 drivers/net/pcmcia/nmclan_cs.c  |   10 +---
 drivers/net/pcmcia/pcnet_cs.c   |   15 ++-
 drivers/net/pcmcia/smc91c92_cs.c|   21 +++--
 drivers/net/pcmcia/xirc2ps_cs.c |   22 +++---
 drivers/net/wireless/airo_cs.c  |   19 
 drivers/net/wireless/atmel_cs.c |   21 +++--
 drivers/net/wireless/hostap/hostap_cs.c |   11 -
 drivers/net/wireless/netwave_cs.c   |   19 +++-
 drivers/net/wireless/orinoco_cs.c   |8 ---
 drivers/net/wireless/spectrum_cs.c  |8 ---
 drivers/net/wireless/wavelan_cs.c   |   18 +++-
 drivers/net/wireless/wl3501_cs.c|   10 +---
 drivers/parport/parport_cs.c|   26 ---
 drivers/pcmcia/pcmcia_resource.c|   71 ++-
 drivers/scsi/pcmcia/aha152x_stub.c  |8 ---
 drivers/scsi/pcmcia/fdomain_stub.c  |   17 ++-
 drivers/scsi/pcmcia/nsp_cs.c|   11 +
 drivers/scsi/pcmcia/qlogic_stub.c   |9 +---
 drivers/scsi/pcmcia/sym53c500_cs.c  |8 ---
 drivers/serial/serial_cs.c  |7 +--
 include/pcmcia/cs.h |2 +
 sound/pcmcia/pdaudiocf/pdaudiocf.c  |8 ---
 sound/pcmcia/vx/vxpocket.c  |8 ---
 43 files changed, 154 insertions(+), 402 deletions(-)

5f2a71fcb7995633b335a1e380ac63a968e61320
diff --git a/Documentation/pcmcia/driver-changes.txt 
b/Documentation/pcmcia/driver-changes.txt
index 97420f0..c89a5e2 100644
--- a/Documentation/pcmcia/driver-changes.txt
+++ b/Documentation/pcmcia/driver-changes.txt
@@ -1,5 +1,11 @@
 This file details changes in 2.6 which affect PCMCIA card driver authors:
 
+* New release helper (as of 2.6.17)
+   Instead of calling pcmcia_release_{configuration,io,irq,win}, all that's
+   necessary now is calling pcmcia_disable_device. As there is no valid
+   reason left to call pcmcia_release_io and pcmcia_release_irq, they will
+   be removed soon.
+
 * Unify detach and REMOVAL event code, as well as attach and INSERTION
   code (as of 2.6.16)
void (*remove)  (struct pcmcia_device *dev);
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c
index 9888bc1..128e416 100644
--- a/drivers/bluetooth/bluecard_cs.c
+++ b/drivers/bluetooth/bluecard_cs.c
@@ -1002,13 +1002,7 @@ static void bluecard_release(dev_link_t 
 
del_timer((info-timer));
 
-   link-dev = NULL;
-
-   pcmcia_release_configuration(link-handle);
-   pcmcia_release_io(link-handle, link-io);
-   pcmcia_release_irq(link-handle, link-irq);
-
-   link-state = ~DEV_CONFIG;
+   pcmcia_disable_device(link-handle);
 }
 
 static int bluecard_suspend(struct pcmcia_device *dev)
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c
index 7e21b1f..ac1410c 100644
--- a/drivers/bluetooth/bt3c_cs.c
+++ b/drivers/bluetooth/bt3c_cs.c
@@ -839,13 +839,7 @@ static void bt3c_release(dev_link_t *lin
if (link-state  DEV_PRESENT)
bt3c_close(info);
 
-   link-dev = NULL;
-
-   pcmcia_release_configuration(link-handle);
-   pcmcia_release_io(link-handle, link-io);
-   pcmcia_release_irq(link-handle, link-irq);
-
-   link-state = ~DEV_CONFIG;
+   pcmcia_disable_device(link-handle);
 }
 
 static int bt3c_suspend(struct pcmcia_device *dev)
diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c
index 7b4bff4..8cd54bb 100644
--- a/drivers/bluetooth/btuart_cs.c
+++ b/drivers/bluetooth/btuart_cs.c
@@ -768,13 +768,7 @@ static void btuart_release(dev_link_t *l
if (link-state  DEV_PRESENT

[PATCH 20/33] pcmcia: remove export of pcmcia_release_configuration

2006-03-31 Thread Dominik Brodowski
Handle the _modifying_ operation sm91c92_cs requires in
pcmcia_modify_configuration, so that the only remaining users
of pcmcia_release_configuration() are within the pcmcia core
module.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]

---

 drivers/mtd/maps/pcmciamtd.c |3 +--
 drivers/net/pcmcia/smc91c92_cs.c |   29 +++--
 drivers/pcmcia/ds_internal.h |2 ++
 drivers/pcmcia/pcmcia_resource.c |   23 ++-
 include/pcmcia/cs.h  |   10 +-
 5 files changed, 41 insertions(+), 26 deletions(-)

4bbed5231468014b500b048d7370a1c6c349231a
diff --git a/drivers/mtd/maps/pcmciamtd.c b/drivers/mtd/maps/pcmciamtd.c
index f988c81..f45ff25 100644
--- a/drivers/mtd/maps/pcmciamtd.c
+++ b/drivers/mtd/maps/pcmciamtd.c
@@ -353,8 +353,7 @@ static void pcmciamtd_release(dev_link_t
}
pcmcia_release_window(link-win);
}
-   pcmcia_release_configuration(link-handle);
-   link-state = ~DEV_CONFIG;
+   pcmcia_disable_device(link-handle);
 }
 
 
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c
index 84e18bb..86942c0 100644
--- a/drivers/net/pcmcia/smc91c92_cs.c
+++ b/drivers/net/pcmcia/smc91c92_cs.c
@@ -874,11 +874,8 @@ static int smc91c92_suspend(struct pcmci
dev_link_t *link = dev_to_instance(p_dev);
struct net_device *dev = link-priv;
 
-   if (link-state  DEV_CONFIG) {
-   if (link-open)
-   netif_device_detach(dev);
-   pcmcia_release_configuration(link-handle);
-   }
+   if ((link-state  DEV_CONFIG)  (link-open))
+   netif_device_detach(dev);
 
return 0;
 }
@@ -894,7 +891,6 @@ static int smc91c92_resume(struct pcmcia
if ((smc-manfid == MANFID_MEGAHERTZ) 
(smc-cardid == PRODID_MEGAHERTZ_EM3288))
mhz_3288_power(link);
-   pcmcia_request_configuration(link-handle, link-conf);
if (smc-manfid == MANFID_MOTOROLA)
mot_config(link);
if ((smc-manfid == MANFID_OSITECH) 
@@ -963,18 +959,15 @@ static int check_sig(dev_link_t *link)
 }
 
 if (width) {
-   printk(KERN_INFO smc91c92_cs: using 8-bit IO window.\n);
-   /* call pcmcia_release_configuration() in _suspend */
-   smc91c92_suspend(link-handle);
-
-   link-io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-   link-handle-socket-io[0].res-flags = ~IO_DATA_PATH_WIDTH;
-   link-handle-socket-io[0].res-flags |= IO_DATA_PATH_WIDTH_8;
-
-   /* call pcmcia_request_configuration() in _resume, it handles the
-* flag update */
-   smc91c92_resume(link-handle);
-   return check_sig(link);
+   modconf_t mod = {
+   .Attributes = CONF_IO_CHANGE_WIDTH,
+   };
+   printk(KERN_INFO smc91c92_cs: using 8-bit IO window.\n);
+
+   smc91c92_suspend(link-handle);
+   pcmcia_modify_configuration(link-handle, mod);
+   smc91c92_resume(link-handle);
+   return check_sig(link);
 }
 return -ENODEV;
 }
diff --git a/drivers/pcmcia/ds_internal.h b/drivers/pcmcia/ds_internal.h
index 783d861..3a2b25e 100644
--- a/drivers/pcmcia/ds_internal.h
+++ b/drivers/pcmcia/ds_internal.h
@@ -8,6 +8,8 @@ extern void pcmcia_put_dev(struct pcmcia
 
 struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int 
function);
 
+extern int pcmcia_release_configuration(struct pcmcia_device *p_dev);
+
 #ifdef CONFIG_PCMCIA_IOCTL
 extern void __init pcmcia_setup_ioctl(void);
 extern void __exit pcmcia_cleanup_ioctl(void);
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c
index f4dcea6..16504f8 100644
--- a/drivers/pcmcia/pcmcia_resource.c
+++ b/drivers/pcmcia/pcmcia_resource.c
@@ -442,6 +442,28 @@ int pcmcia_modify_configuration(struct p
   (mod-Attributes  CONF_VPP2_CHANGE_VALID))
return CS_BAD_VPP;
 
+   if (mod-Attributes  CONF_IO_CHANGE_WIDTH) {
+   pccard_io_map io_off = { 0, 0, 0, 0, 1 };
+   pccard_io_map io_on;
+   int i;
+
+   io_on.speed = io_speed;
+   for (i = 0; i  MAX_IO_WIN; i++) {
+   if (!s-io[i].res)
+   continue;
+   io_off.map = i;
+   io_on.map = i;
+
+   io_on.flags = MAP_ACTIVE | IO_DATA_PATH_WIDTH_8;
+   io_on.start = s-io[i].res-start;
+   io_on.stop = s-io[i].res-end;
+
+   s-ops-set_io_map(s, io_off);
+   mdelay(40);
+   s-ops-set_io_map(s, io_on);
+   }
+   }
+
return CS_SUCCESS;
 } /* modify_configuration */
 EXPORT_SYMBOL(pcmcia_modify_configuration);
@@ -479,7 +501,6 @@ int pcmcia_release_configuration(struct 
 
return CS_SUCCESS

[PATCH 27/33] pcmcia: remove unused p_dev-state flags

2006-03-31 Thread Dominik Brodowski
Remove the unused DEV_RELEASE_PENDING flag, and move the DEV_SUSPEND flag
into the p_dev structure, and make use of it at the core level.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]

---

 drivers/net/wireless/atmel_cs.c   |2 +-
 drivers/net/wireless/ray_cs.c |2 +-
 drivers/net/wireless/wavelan_cs.c |1 -
 drivers/pcmcia/ds.c   |   48 +++--
 drivers/telephony/ixj_pcmcia.c|1 -
 include/pcmcia/ds.h   |6 ++---
 6 files changed, 30 insertions(+), 30 deletions(-)

f6fbe01ac976f3ec618cd5fb71ad9ce2cfa7ab2b
diff --git a/drivers/net/wireless/atmel_cs.c b/drivers/net/wireless/atmel_cs.c
index 962272c..d09b147 100644
--- a/drivers/net/wireless/atmel_cs.c
+++ b/drivers/net/wireless/atmel_cs.c
@@ -220,7 +220,7 @@ do { last_fn = (fn); if ((last_ret = (re
 static int card_present(void *arg)
 { 
struct pcmcia_device *link = (struct pcmcia_device *)arg;
-   if (link-state  DEV_SUSPEND)
+   if (link-suspended)
return 0;
else if (link-state  DEV_PRESENT)
return 1;
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c
index 8cfe933..e392433 100644
--- a/drivers/net/wireless/ray_cs.c
+++ b/drivers/net/wireless/ray_cs.c
@@ -1968,7 +1968,7 @@ static irqreturn_t ray_interrupt(int irq
 
 local = (ray_dev_t *)dev-priv;
 link = (struct pcmcia_device *)local-finder;
-if ( ! (link-state  DEV_PRESENT) || link-state  DEV_SUSPEND ) {
+if ( ! (link-state  DEV_PRESENT) || link-suspended ) {
 DEBUG(2,ray_cs interrupt from device not present or suspended.\n);
 return IRQ_NONE;
 }
diff --git a/drivers/net/wireless/wavelan_cs.c 
b/drivers/net/wireless/wavelan_cs.c
index 7373caf..6b67696 100644
--- a/drivers/net/wireless/wavelan_cs.c
+++ b/drivers/net/wireless/wavelan_cs.c
@@ -4744,7 +4744,6 @@ static int wavelan_resume(struct pcmcia_
 {
struct net_device * dev = (struct net_device *) link-priv;
 
-   link-state = ~DEV_SUSPEND;
if ((link-state  DEV_CONFIG)  (link-open)) {
wv_hw_reset(dev);
netif_device_attach(dev);
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
index e8fe544..34e634a 100644
--- a/drivers/pcmcia/ds.c
+++ b/drivers/pcmcia/ds.c
@@ -945,7 +945,7 @@ static ssize_t pcmcia_show_pm_state(stru
 {
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
 
-   if (p_dev-dev.power.power_state.event != PM_EVENT_ON)
+   if (p_dev-suspended)
return sprintf(buf, off\n);
else
return sprintf(buf, on\n);
@@ -960,11 +960,9 @@ static ssize_t pcmcia_store_pm_state(str
 if (!count)
 return -EINVAL;
 
-   if ((p_dev-dev.power.power_state.event == PM_EVENT_ON) 
-   (!strncmp(buf, off, 3)))
+   if ((!p_dev-suspended)  !strncmp(buf, off, 3))
ret = dpm_runtime_suspend(dev, PMSG_SUSPEND);
-   else if ((p_dev-dev.power.power_state.event != PM_EVENT_ON) 
-(!strncmp(buf, on, 2)))
+   else if (p_dev-suspended  !strncmp(buf, on, 2))
dpm_runtime_resume(dev);
 
return ret ? ret : count;
@@ -1030,7 +1028,7 @@ static int pcmcia_dev_suspend(struct dev
 {
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
struct pcmcia_driver *p_drv = NULL;
-   int ret;
+   int ret = 0;
 
if (dev-driver)
p_drv = to_pcmcia_drv(dev-driver);
@@ -1038,14 +1036,16 @@ static int pcmcia_dev_suspend(struct dev
if (p_drv  p_drv-suspend) {
ret = p_drv-suspend(p_dev);
if (ret)
-   return ret;
-   p_dev-state |= DEV_SUSPEND;
-   if ((p_dev-state  DEV_CONFIG) 
-   !(p_dev-state  DEV_SUSPEND_NORELEASE))
-   pcmcia_release_configuration(p_dev);
+   goto out;
+   if ((p_dev-state  DEV_CONFIG) 
+   !(p_dev-state  DEV_SUSPEND_NORELEASE))
+   pcmcia_release_configuration(p_dev);
}
 
-   return 0;
+ out:
+   if (!ret)
+   p_dev-suspended = 1;
+   return ret;
 }
 
 
@@ -1053,24 +1053,26 @@ static int pcmcia_dev_resume(struct devi
 {
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
 struct pcmcia_driver *p_drv = NULL;
-   int ret;
+   int ret = 0;
 
if (dev-driver)
p_drv = to_pcmcia_drv(dev-driver);
 
if (p_drv  p_drv-resume) {
-   p_dev-state = ~DEV_SUSPEND;
-   if ((p_dev-state  DEV_CONFIG) 
-   !(p_dev-state  DEV_SUSPEND_NORELEASE)){
-   ret = pcmcia_request_configuration(p_dev,
-p_dev-conf);
-   if (ret)
-   return ret

[PATCH 18/33] pcmcia: convert remaining users of pcmcia_release_io and _irq

2006-03-31 Thread Dominik Brodowski
Convert the remaining drivers which use pcmcia_release_io or
pcmcia_release_irq, and remove the EXPORT of these symbols.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]

---

 Documentation/pcmcia/driver-changes.txt |4 ++--
 drivers/isdn/hardware/avm/avm_cs.c  |   10 +-
 drivers/isdn/hisax/avma1_cs.c   |8 
 drivers/isdn/hisax/sedlbauer_cs.c   |8 ++--
 drivers/net/pcmcia/smc91c92_cs.c|   10 --
 drivers/net/wireless/orinoco_cs.c   |3 +--
 drivers/net/wireless/ray_cs.c   |8 +---
 drivers/net/wireless/spectrum_cs.c  |3 +--
 drivers/pcmcia/pcmcia_resource.c|3 ---
 drivers/scsi/pcmcia/nsp_cs.c|5 +
 drivers/scsi/pcmcia/qlogic_stub.c   |7 +--
 drivers/telephony/ixj_pcmcia.c  |5 +
 drivers/usb/host/sl811_cs.c |   14 ++
 include/pcmcia/cs.h |2 --
 sound/pcmcia/pdaudiocf/pdaudiocf.c  |4 +---
 sound/pcmcia/vx/vxpocket.c  |5 +
 16 files changed, 31 insertions(+), 68 deletions(-)

50db3fdbbc98260fb538c1cc3f8cc597ba7bffe7
diff --git a/Documentation/pcmcia/driver-changes.txt 
b/Documentation/pcmcia/driver-changes.txt
index c89a5e2..4739c5c 100644
--- a/Documentation/pcmcia/driver-changes.txt
+++ b/Documentation/pcmcia/driver-changes.txt
@@ -3,8 +3,8 @@ This file details changes in 2.6 which a
 * New release helper (as of 2.6.17)
Instead of calling pcmcia_release_{configuration,io,irq,win}, all that's
necessary now is calling pcmcia_disable_device. As there is no valid
-   reason left to call pcmcia_release_io and pcmcia_release_irq, they will
-   be removed soon.
+   reason left to call pcmcia_release_io and pcmcia_release_irq, the
+   exports for them were removed.
 
 * Unify detach and REMOVAL event code, as well as attach and INSERTION
   code (as of 2.6.16)
diff --git a/drivers/isdn/hardware/avm/avm_cs.c 
b/drivers/isdn/hardware/avm/avm_cs.c
index f3889bd..5f70661 100644
--- a/drivers/isdn/hardware/avm/avm_cs.c
+++ b/drivers/isdn/hardware/avm/avm_cs.c
@@ -284,25 +284,25 @@ found_port:
cs_error(link-handle, RequestIO, i);
break;
}
-   
+
/*
 * allocate an interrupt line
 */
i = pcmcia_request_irq(link-handle, link-irq);
if (i != CS_SUCCESS) {
cs_error(link-handle, RequestIRQ, i);
-   pcmcia_release_io(link-handle, link-io);
+   /* undo */
+   pcmcia_disable_device(link-handle);
break;
}
-   
+
/*
  * configure the PCMCIA socket
  */
i = pcmcia_request_configuration(link-handle, link-conf);
if (i != CS_SUCCESS) {
cs_error(link-handle, RequestConfiguration, i);
-   pcmcia_release_io(link-handle, link-io);
-   pcmcia_release_irq(link-handle, link-irq);
+   pcmcia_disable_device(link-handle);
break;
}
 
diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c
index 729c2de..845fa14 100644
--- a/drivers/isdn/hisax/avma1_cs.c
+++ b/drivers/isdn/hisax/avma1_cs.c
@@ -313,18 +313,18 @@ found_port:
i = pcmcia_request_irq(link-handle, link-irq);
if (i != CS_SUCCESS) {
cs_error(link-handle, RequestIRQ, i);
-   pcmcia_release_io(link-handle, link-io);
+   /* undo */
+   pcmcia_disable_device(link-handle);
break;
}
-   
+
/*
 * configure the PCMCIA socket
 */
i = pcmcia_request_configuration(link-handle, link-conf);
if (i != CS_SUCCESS) {
cs_error(link-handle, RequestConfiguration, i);
-   pcmcia_release_io(link-handle, link-io);
-   pcmcia_release_irq(link-handle, link-irq);
+   pcmcia_disable_device(link-handle);
break;
}
 
diff --git a/drivers/isdn/hisax/sedlbauer_cs.c 
b/drivers/isdn/hisax/sedlbauer_cs.c
index e595391..fd0f127 100644
--- a/drivers/isdn/hisax/sedlbauer_cs.c
+++ b/drivers/isdn/hisax/sedlbauer_cs.c
@@ -374,15 +374,11 @@ static void sedlbauer_config(dev_link_t 
}
/* If we got this far, we're cool! */
break;
-   
+
 next_entry:
-/* new in dummy.cs 2001/01/28 MN 
-if (link-io.NumPorts1)
-   pcmcia_release_io(link-handle, link-io);
-*/
CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, tuple));
 }
-
+
 /*
Allocate an interrupt line.  Note that this does not assign a
handler to the interrupt, unless the 'Handler' member of the
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c
index 56700b1..03b1d8f 100644
--- a/drivers/net/pcmcia/smc91c92_cs.c
+++ b/drivers/net/pcmcia/smc91c92_cs.c
@@ -49,6 +49,7 @@
 #include pcmcia/cisreg.h
 #include pcmcia/ciscode.h
 #include pcmcia/ds.h
+#include pcmcia/ss.h
 
 #include asm/io.h
 #include asm/system.h
@@ -965,10

[PATCH 29/33] pcmcia: convert DEV_OK to pcmcia_dev_present

2006-03-31 Thread Dominik Brodowski
Instead of the DEV_OK macro, drivers should use pcmcia_dev_present().

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]

---

 drivers/char/pcmcia/cm4000_cs.c |4 ++--
 drivers/char/pcmcia/cm4040_cs.c |2 +-
 drivers/net/pcmcia/3c574_cs.c   |4 ++--
 drivers/net/pcmcia/3c589_cs.c   |8 
 drivers/net/pcmcia/axnet_cs.c   |2 +-
 drivers/net/pcmcia/fmvj18x_cs.c |2 +-
 drivers/net/pcmcia/nmclan_cs.c  |2 +-
 drivers/net/pcmcia/pcnet_cs.c   |2 +-
 drivers/net/pcmcia/smc91c92_cs.c|2 +-
 drivers/net/pcmcia/xirc2ps_cs.c |2 +-
 drivers/net/wireless/atmel_cs.c |9 -
 drivers/net/wireless/hostap/hostap_cs.c |2 +-
 drivers/net/wireless/netwave_cs.c   |4 ++--
 drivers/net/wireless/ray_cs.c   |2 +-
 drivers/net/wireless/wl3501_cs.c|2 +-
 drivers/pcmcia/ds.c |   27 +++
 drivers/serial/serial_cs.c  |2 +-
 include/pcmcia/cs.h |1 +
 include/pcmcia/ds.h |   12 
 sound/pcmcia/pdaudiocf/pdaudiocf.c  |2 +-
 sound/pcmcia/vx/vxpocket.c  |2 +-
 21 files changed, 59 insertions(+), 36 deletions(-)

9940ec3617fec1db13e589bbc3f37e37878c7683
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
index 16e105d..02114a0 100644
--- a/drivers/char/pcmcia/cm4000_cs.c
+++ b/drivers/char/pcmcia/cm4000_cs.c
@@ -1458,7 +1458,7 @@ static int cmm_ioctl(struct inode *inode
   iminor(inode), ioctl_names[_IOC_NR(cmd)]);
 
link = dev_table[iminor(inode)];
-   if (!(DEV_OK(link))) {
+   if (!pcmcia_dev_present(link)) {
DEBUGP(4, dev, DEV_OK false\n);
return -ENODEV;
}
@@ -1667,7 +1667,7 @@ static int cmm_open(struct inode *inode,
return -ENODEV;
 
link = dev_table[minor];
-   if (link == NULL || !(DEV_OK(link)))
+   if (link == NULL || !pcmcia_dev_present(link))
return -ENODEV;
 
if (link-open)
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c
index 74609c3..29efa64 100644
--- a/drivers/char/pcmcia/cm4040_cs.c
+++ b/drivers/char/pcmcia/cm4040_cs.c
@@ -452,7 +452,7 @@ static int cm4040_open(struct inode *ino
return -ENODEV;
 
link = dev_table[minor];
-   if (link == NULL || !(DEV_OK(link)))
+   if (link == NULL || !pcmcia_dev_present(link))
return -ENODEV;
 
if (link-open)
diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c
index 70e3cca..fab9336 100644
--- a/drivers/net/pcmcia/3c574_cs.c
+++ b/drivers/net/pcmcia/3c574_cs.c
@@ -728,7 +728,7 @@ static int el3_open(struct net_device *d
struct el3_private *lp = netdev_priv(dev);
struct pcmcia_device *link = lp-p_dev;
 
-   if (!DEV_OK(link))
+   if (!pcmcia_dev_present(link))
return -ENODEV;

link-open++;
@@ -1176,7 +1176,7 @@ static int el3_close(struct net_device *
 
DEBUG(2, %s: shutting down ethercard.\n, dev-name);

-   if (DEV_OK(link)) {
+   if (pcmcia_dev_present(link)) {
unsigned long flags;
 
/* Turn off statistics ASAP.  We update lp-stats below. */
diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c
index 3d05f66..875a0fe 100644
--- a/drivers/net/pcmcia/3c589_cs.c
+++ b/drivers/net/pcmcia/3c589_cs.c
@@ -557,7 +557,7 @@ static int el3_open(struct net_device *d
 struct el3_private *lp = netdev_priv(dev);
 struct pcmcia_device *link = lp-p_dev;
 
-if (!DEV_OK(link))
+if (!pcmcia_dev_present(link))
return -ENODEV;
 
 link-open++;
@@ -818,7 +818,7 @@ static struct net_device_stats *el3_get_
 unsigned long flags;
 struct pcmcia_device *link = lp-p_dev;
 
-if (DEV_OK(link)) {
+if (pcmcia_dev_present(link)) {
spin_lock_irqsave(lp-lock, flags);
update_stats(dev);
spin_unlock_irqrestore(lp-lock, flags);
@@ -922,7 +922,7 @@ static void set_multicast_list(struct ne
 kio_addr_t ioaddr = dev-base_addr;
 u16 opts = SetRxFilter | RxStation | RxBroadcast;
 
-if (!(DEV_OK(link))) return;
+if (!pcmcia_dev_present(link)) return;
 if (dev-flags  IFF_PROMISC)
opts |= RxMulticast | RxProm;
 else if (dev-mc_count || (dev-flags  IFF_ALLMULTI))
@@ -938,7 +938,7 @@ static int el3_close(struct net_device *
 
 DEBUG(1, %s: shutting down ethercard.\n, dev-name);
 
-if (DEV_OK(link)) {
+if (pcmcia_dev_present(link)) {
/* Turn off statistics ASAP.  We update lp-stats below. */
outw(StatsDisable, ioaddr + EL3_CMD);

diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c
index 0f1219c..56233af 100644
--- a/drivers/net/pcmcia/axnet_cs.c
+++ b/drivers/net/pcmcia

[PATCH 21/33] pcmcia: remove unneeded Vcc pseudo setting

2006-03-31 Thread Dominik Brodowski
As we do not allow setting Vcc in the pcmcia core, and Vpp1 and
Vpp2 can only be set to the same value, a lot of code can be
streamlined.

Signed-off-by: Dominik Brodowski [EMAIL PROTECTED]

---

 drivers/bluetooth/bluecard_cs.c |4 
 drivers/bluetooth/bt3c_cs.c |6 +-
 drivers/bluetooth/btuart_cs.c   |6 +-
 drivers/bluetooth/dtl1_cs.c |4 
 drivers/char/pcmcia/cm4000_cs.c |7 ---
 drivers/char/pcmcia/cm4040_cs.c |7 ---
 drivers/char/pcmcia/synclink_cs.c   |7 ---
 drivers/ide/legacy/ide-cs.c |   11 ---
 drivers/isdn/hardware/avm/avm_cs.c  |1 -
 drivers/isdn/hisax/avma1_cs.c   |1 -
 drivers/isdn/hisax/elsa_cs.c|8 ++--
 drivers/isdn/hisax/sedlbauer_cs.c   |   16 ++--
 drivers/isdn/hisax/teles_cs.c   |8 ++--
 drivers/mtd/maps/pcmciamtd.c|7 ++-
 drivers/net/pcmcia/3c574_cs.c   |1 -
 drivers/net/pcmcia/3c589_cs.c   |1 -
 drivers/net/pcmcia/axnet_cs.c   |5 -
 drivers/net/pcmcia/com20020_cs.c|1 -
 drivers/net/pcmcia/fmvj18x_cs.c |8 +---
 drivers/net/pcmcia/ibmtr_cs.c   |1 -
 drivers/net/pcmcia/nmclan_cs.c  |1 -
 drivers/net/pcmcia/pcnet_cs.c   |5 -
 drivers/net/pcmcia/smc91c92_cs.c|1 -
 drivers/net/pcmcia/xirc2ps_cs.c |1 -
 drivers/net/wireless/airo_cs.c  |   19 ++-
 drivers/net/wireless/atmel_cs.c |   10 ++
 drivers/net/wireless/hostap/hostap_cs.c |   19 +++
 drivers/net/wireless/netwave_cs.c   |1 -
 drivers/net/wireless/orinoco_cs.c   |   18 --
 drivers/net/wireless/ray_cs.c   |1 -
 drivers/net/wireless/spectrum_cs.c  |   16 +++-
 drivers/net/wireless/wavelan_cs.c   |1 -
 drivers/net/wireless/wl3501_cs.c|1 -
 drivers/parport/parport_cs.c|5 -
 drivers/pcmcia/pcmcia_resource.c|6 +-
 drivers/scsi/pcmcia/aha152x_stub.c  |1 -
 drivers/scsi/pcmcia/fdomain_stub.c  |1 -
 drivers/scsi/pcmcia/nsp_cs.c|   15 ++-
 drivers/scsi/pcmcia/qlogic_stub.c   |1 -
 drivers/scsi/pcmcia/sym53c500_cs.c  |1 -
 drivers/serial/serial_cs.c  |   12 +---
 drivers/telephony/ixj_pcmcia.c  |3 ---
 drivers/usb/host/sl811_cs.c |   15 ++-
 include/pcmcia/cs.h |2 +-
 sound/pcmcia/pdaudiocf/pdaudiocf.c  |4 
 sound/pcmcia/vx/vxpocket.c  |1 -
 46 files changed, 64 insertions(+), 207 deletions(-)

70294b468302fd7a0a99dad935c7ba5322989345
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c
index bb833b2..8e23f9a 100644
--- a/drivers/bluetooth/bluecard_cs.c
+++ b/drivers/bluetooth/bluecard_cs.c
@@ -878,7 +878,6 @@ static int bluecard_attach(struct pcmcia
link-irq.Instance = info;
 
link-conf.Attributes = CONF_ENABLE_IRQ;
-   link-conf.Vcc = 50;
link-conf.IntType = INT_MEMORY_AND_IO;
 
link-handle = p_dev;
@@ -925,7 +924,6 @@ static void bluecard_config(dev_link_t *
tuple_t tuple;
u_short buf[256];
cisparse_t parse;
-   config_info_t config;
int i, n, last_ret, last_fn;
 
tuple.TupleData = (cisdata_t *)buf;
@@ -945,8 +943,6 @@ static void bluecard_config(dev_link_t *
 
/* Configure card */
link-state |= DEV_CONFIG;
-   i = pcmcia_get_configuration_info(handle, config);
-   link-conf.Vcc = config.Vcc;
 
link-conf.ConfigIndex = 0x20;
link-io.NumPorts1 = 64;
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c
index 7b0f4f0..0b84805 100644
--- a/drivers/bluetooth/bt3c_cs.c
+++ b/drivers/bluetooth/bt3c_cs.c
@@ -670,7 +670,6 @@ static int bt3c_attach(struct pcmcia_dev
link-irq.Instance = info;
 
link-conf.Attributes = CONF_ENABLE_IRQ;
-   link-conf.Vcc = 50;
link-conf.IntType = INT_MEMORY_AND_IO;
 
link-handle = p_dev;
@@ -728,7 +727,6 @@ static void bt3c_config(dev_link_t *link
u_short buf[256];
cisparse_t parse;
cistpl_cftable_entry_t *cf = parse.cftable_entry;
-   config_info_t config;
int i, j, try, last_ret, last_fn;
 
tuple.TupleData = (cisdata_t *)buf;
@@ -748,8 +746,6 @@ static void bt3c_config(dev_link_t *link
 
/* Configure card */
link-state |= DEV_CONFIG;
-   i = pcmcia_get_configuration_info(handle, config);
-   link-conf.Vcc = config.Vcc;
 
/* First pass: look for a config entry that looks normal. */
tuple.TupleData = (cisdata_t *)buf;
@@ -764,7 +760,7 @@ static void bt3c_config(dev_link_t *link
if (i != CS_SUCCESS)
goto next_entry

Re: State of the Union: Wireless

2006-01-06 Thread Dominik Brodowski
On Fri, Jan 06, 2006 at 12:31:24PM +0100, Johannes Berg wrote:
 On Fri, 2006-01-06 at 12:00 +0100, Michael Buesch wrote:
 
  * master interface as real device node
  * Virtual interfaces (net_devices)
 
 I didn't want to spam the netdev wiki with this (yet) so I collected
 some more structured things outside. Anyone feel free to edit:
 http://softmac.sipsolutions.net/802.11

From someone who has no idea at all (yet) about 802.11: why character
device, and not sysfs or configfs files? Like

TASK: get list of MAC addresses available to hardware device (usually only one 
for current hw)

cat /sys/devices/path/to/device/wireless/address

TASK: get list of virtual devices including (some of) their properties

ls -l /sys/devices/path/to/device/wireless/
...
wlan0 - /sys/class/net/wlan0
wlan1 - /sys/class/net/wlan1

TASK: create virtual device (with arbitrary type, netdev name and mac address)
  ^^
   isn't nameif / udev for that?

echo $type  /sys/devices/path/to/device/wireless/new_if
... we get uevents for this new interface; in this we can set the
mac adress doing:
echo $mac  /sys/class/net/wlan0/wireless/address

TASK: configure virtual device (key is the device name since that needs to be 
unique anyway) 

echo $some_config_option_for_virtual_device  
/sys/class/net/wlan0/wireless/some_option
echo $some_config_option_for_physical_device 
/sys/devices/path/to/dev/wireless/some_other_option


Of course the configuration userspace tool would use libsysfs for that, not
echo scripts... but they'd work too.

Dominik
-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html