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 <hch@lst.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
a154e6f6ef
commit
7cc0566268
@@ -695,7 +695,7 @@ static void netlink_ring_setup_skb(struct sk_buff *skb, struct sock *sk,
|
||||
|
||||
static int netlink_mmap_sendmsg(struct sock *sk, struct msghdr *msg,
|
||||
u32 dst_portid, u32 dst_group,
|
||||
struct sock_iocb *siocb)
|
||||
struct scm_cookie *scm)
|
||||
{
|
||||
struct netlink_sock *nlk = nlk_sk(sk);
|
||||
struct netlink_ring *ring;
|
||||
@@ -741,7 +741,7 @@ static int netlink_mmap_sendmsg(struct sock *sk, struct msghdr *msg,
|
||||
|
||||
NETLINK_CB(skb).portid = nlk->portid;
|
||||
NETLINK_CB(skb).dst_group = dst_group;
|
||||
NETLINK_CB(skb).creds = siocb->scm->creds;
|
||||
NETLINK_CB(skb).creds = scm->creds;
|
||||
|
||||
err = security_netlink_send(sk, skb);
|
||||
if (err) {
|
||||
@@ -820,7 +820,7 @@ static void netlink_ring_set_copied(struct sock *sk, struct sk_buff *skb)
|
||||
#define netlink_tx_is_mmaped(sk) false
|
||||
#define netlink_mmap sock_no_mmap
|
||||
#define netlink_poll datagram_poll
|
||||
#define netlink_mmap_sendmsg(sk, msg, dst_portid, dst_group, siocb) 0
|
||||
#define netlink_mmap_sendmsg(sk, msg, dst_portid, dst_group, scm) 0
|
||||
#endif /* CONFIG_NETLINK_MMAP */
|
||||
|
||||
static void netlink_skb_destructor(struct sk_buff *skb)
|
||||
@@ -2259,7 +2259,6 @@ static void netlink_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb)
|
||||
static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
struct msghdr *msg, size_t len)
|
||||
{
|
||||
struct sock_iocb *siocb = kiocb_to_siocb(kiocb);
|
||||
struct sock *sk = sock->sk;
|
||||
struct netlink_sock *nlk = nlk_sk(sk);
|
||||
DECLARE_SOCKADDR(struct sockaddr_nl *, addr, msg->msg_name);
|
||||
@@ -2273,10 +2272,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
if (msg->msg_flags&MSG_OOB)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (NULL == siocb->scm)
|
||||
siocb->scm = &scm;
|
||||
|
||||
err = scm_send(sock, msg, siocb->scm, true);
|
||||
err = scm_send(sock, msg, &scm, true);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
@@ -2305,7 +2301,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
if (netlink_tx_is_mmaped(sk) &&
|
||||
msg->msg_iter.iov->iov_base == NULL) {
|
||||
err = netlink_mmap_sendmsg(sk, msg, dst_portid, dst_group,
|
||||
siocb);
|
||||
&scm);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -2319,7 +2315,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
|
||||
NETLINK_CB(skb).portid = nlk->portid;
|
||||
NETLINK_CB(skb).dst_group = dst_group;
|
||||
NETLINK_CB(skb).creds = siocb->scm->creds;
|
||||
NETLINK_CB(skb).creds = scm.creds;
|
||||
NETLINK_CB(skb).flags = netlink_skb_flags;
|
||||
|
||||
err = -EFAULT;
|
||||
@@ -2341,7 +2337,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
err = netlink_unicast(sk, skb, dst_portid, msg->msg_flags&MSG_DONTWAIT);
|
||||
|
||||
out:
|
||||
scm_destroy(siocb->scm);
|
||||
scm_destroy(&scm);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -2349,7 +2345,6 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
struct msghdr *msg, size_t len,
|
||||
int flags)
|
||||
{
|
||||
struct sock_iocb *siocb = kiocb_to_siocb(kiocb);
|
||||
struct scm_cookie scm;
|
||||
struct sock *sk = sock->sk;
|
||||
struct netlink_sock *nlk = nlk_sk(sk);
|
||||
@@ -2412,11 +2407,8 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
if (nlk->flags & NETLINK_RECV_PKTINFO)
|
||||
netlink_cmsg_recv_pktinfo(msg, skb);
|
||||
|
||||
if (NULL == siocb->scm) {
|
||||
memset(&scm, 0, sizeof(scm));
|
||||
siocb->scm = &scm;
|
||||
}
|
||||
siocb->scm->creds = *NETLINK_CREDS(skb);
|
||||
memset(&scm, 0, sizeof(scm));
|
||||
scm.creds = *NETLINK_CREDS(skb);
|
||||
if (flags & MSG_TRUNC)
|
||||
copied = data_skb->len;
|
||||
|
||||
@@ -2431,7 +2423,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
}
|
||||
}
|
||||
|
||||
scm_recv(sock, msg, siocb->scm, flags);
|
||||
scm_recv(sock, msg, &scm, flags);
|
||||
out:
|
||||
netlink_rcv_wake(sk);
|
||||
return err ? : copied;
|
||||
|
Reference in New Issue
Block a user