mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
net: remove sock_iocb
The sock_iocb structure is allocate on stack for each read/write-like operation on sockets, and contains various fields of which only the embedded msghdr and sometimes a pointer to the scm_cookie is ever used. Get rid of the sock_iocb and put a msghdr directly on the stack and pass the scm_cookie explicitly to netlink_mmap_sendmsg. Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
a154e6f6ef
commit
7cc0566268
4 changed files with 43 additions and 126 deletions
45
net/socket.c
45
net/socket.c
|
|
@ -613,13 +613,6 @@ EXPORT_SYMBOL(__sock_tx_timestamp);
|
|||
static inline int __sock_sendmsg_nosec(struct kiocb *iocb, struct socket *sock,
|
||||
struct msghdr *msg, size_t size)
|
||||
{
|
||||
struct sock_iocb *si = kiocb_to_siocb(iocb);
|
||||
|
||||
si->sock = sock;
|
||||
si->scm = NULL;
|
||||
si->msg = msg;
|
||||
si->size = size;
|
||||
|
||||
return sock->ops->sendmsg(iocb, sock, msg, size);
|
||||
}
|
||||
|
||||
|
|
@ -635,11 +628,9 @@ static int do_sock_sendmsg(struct socket *sock, struct msghdr *msg,
|
|||
size_t size, bool nosec)
|
||||
{
|
||||
struct kiocb iocb;
|
||||
struct sock_iocb siocb;
|
||||
int ret;
|
||||
|
||||
init_sync_kiocb(&iocb, NULL);
|
||||
iocb.private = &siocb;
|
||||
ret = nosec ? __sock_sendmsg_nosec(&iocb, sock, msg, size) :
|
||||
__sock_sendmsg(&iocb, sock, msg, size);
|
||||
if (-EIOCBQUEUED == ret)
|
||||
|
|
@ -756,14 +747,6 @@ EXPORT_SYMBOL_GPL(__sock_recv_ts_and_drops);
|
|||
static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock,
|
||||
struct msghdr *msg, size_t size, int flags)
|
||||
{
|
||||
struct sock_iocb *si = kiocb_to_siocb(iocb);
|
||||
|
||||
si->sock = sock;
|
||||
si->scm = NULL;
|
||||
si->msg = msg;
|
||||
si->size = size;
|
||||
si->flags = flags;
|
||||
|
||||
return sock->ops->recvmsg(iocb, sock, msg, size, flags);
|
||||
}
|
||||
|
||||
|
|
@ -779,11 +762,9 @@ int sock_recvmsg(struct socket *sock, struct msghdr *msg,
|
|||
size_t size, int flags)
|
||||
{
|
||||
struct kiocb iocb;
|
||||
struct sock_iocb siocb;
|
||||
int ret;
|
||||
|
||||
init_sync_kiocb(&iocb, NULL);
|
||||
iocb.private = &siocb;
|
||||
ret = __sock_recvmsg(&iocb, sock, msg, size, flags);
|
||||
if (-EIOCBQUEUED == ret)
|
||||
ret = wait_on_sync_kiocb(&iocb);
|
||||
|
|
@ -795,11 +776,9 @@ static int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
|
|||
size_t size, int flags)
|
||||
{
|
||||
struct kiocb iocb;
|
||||
struct sock_iocb siocb;
|
||||
int ret;
|
||||
|
||||
init_sync_kiocb(&iocb, NULL);
|
||||
iocb.private = &siocb;
|
||||
ret = __sock_recvmsg_nosec(&iocb, sock, msg, size, flags);
|
||||
if (-EIOCBQUEUED == ret)
|
||||
ret = wait_on_sync_kiocb(&iocb);
|
||||
|
|
@ -866,14 +845,6 @@ static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
|
|||
return sock->ops->splice_read(sock, ppos, pipe, len, flags);
|
||||
}
|
||||
|
||||
static struct sock_iocb *alloc_sock_iocb(struct kiocb *iocb,
|
||||
struct sock_iocb *siocb)
|
||||
{
|
||||
siocb->kiocb = iocb;
|
||||
iocb->private = siocb;
|
||||
return siocb;
|
||||
}
|
||||
|
||||
static ssize_t do_sock_read(struct msghdr *msg, struct kiocb *iocb,
|
||||
struct file *file, const struct iovec *iov,
|
||||
unsigned long nr_segs)
|
||||
|
|
@ -893,7 +864,7 @@ static ssize_t do_sock_read(struct msghdr *msg, struct kiocb *iocb,
|
|||
static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos)
|
||||
{
|
||||
struct sock_iocb siocb, *x;
|
||||
struct msghdr msg;
|
||||
|
||||
if (pos != 0)
|
||||
return -ESPIPE;
|
||||
|
|
@ -901,11 +872,7 @@ static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
|
|||
if (iocb->ki_nbytes == 0) /* Match SYS5 behaviour */
|
||||
return 0;
|
||||
|
||||
|
||||
x = alloc_sock_iocb(iocb, &siocb);
|
||||
if (!x)
|
||||
return -ENOMEM;
|
||||
return do_sock_read(&x->async_msg, iocb, iocb->ki_filp, iov, nr_segs);
|
||||
return do_sock_read(&msg, iocb, iocb->ki_filp, iov, nr_segs);
|
||||
}
|
||||
|
||||
static ssize_t do_sock_write(struct msghdr *msg, struct kiocb *iocb,
|
||||
|
|
@ -929,16 +896,12 @@ static ssize_t do_sock_write(struct msghdr *msg, struct kiocb *iocb,
|
|||
static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
unsigned long nr_segs, loff_t pos)
|
||||
{
|
||||
struct sock_iocb siocb, *x;
|
||||
struct msghdr msg;
|
||||
|
||||
if (pos != 0)
|
||||
return -ESPIPE;
|
||||
|
||||
x = alloc_sock_iocb(iocb, &siocb);
|
||||
if (!x)
|
||||
return -ENOMEM;
|
||||
|
||||
return do_sock_write(&x->async_msg, iocb, iocb->ki_filp, iov, nr_segs);
|
||||
return do_sock_write(&msg, iocb, iocb->ki_filp, iov, nr_segs);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue