forked from Minki/linux
net: remove noblock parameter from recvmsg() entities
The internal recvmsg() functions have two parameters 'flags' and 'noblock'
that were merged inside skb_recv_datagram(). As a follow up patch to commit
f4b41f062c
("net: remove noblock parameter from skb_recv_datagram()")
this patch removes the separate 'noblock' parameter for recvmsg().
Analogue to the referenced patch for skb_recv_datagram() the 'flags' and
'noblock' parameters are unnecessarily split up with e.g.
err = sk->sk_prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
flags & ~MSG_DONTWAIT, &addr_len);
or in
err = INDIRECT_CALL_2(sk->sk_prot->recvmsg, tcp_recvmsg, udp_recvmsg,
sk, msg, size, flags & MSG_DONTWAIT,
flags & ~MSG_DONTWAIT, &addr_len);
instead of simply using only flags all the time and check for MSG_DONTWAIT
where needed (to preserve for the formerly separated no(n)block condition).
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://lore.kernel.org/r/20220411124955.154876-1-socketcan@hartkopp.net
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
f015980900
commit
ec095263a9
@ -567,7 +567,7 @@ void chtls_shutdown(struct sock *sk, int how);
|
|||||||
void chtls_destroy_sock(struct sock *sk);
|
void chtls_destroy_sock(struct sock *sk);
|
||||||
int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
|
int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
|
||||||
int chtls_recvmsg(struct sock *sk, struct msghdr *msg,
|
int chtls_recvmsg(struct sock *sk, struct msghdr *msg,
|
||||||
size_t len, int nonblock, int flags, int *addr_len);
|
size_t len, int flags, int *addr_len);
|
||||||
int chtls_sendpage(struct sock *sk, struct page *page,
|
int chtls_sendpage(struct sock *sk, struct page *page,
|
||||||
int offset, size_t size, int flags);
|
int offset, size_t size, int flags);
|
||||||
int send_tx_flowc_wr(struct sock *sk, int compl,
|
int send_tx_flowc_wr(struct sock *sk, int compl,
|
||||||
|
@ -1426,7 +1426,7 @@ static void chtls_cleanup_rbuf(struct sock *sk, int copied)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int nonblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
|
struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
|
||||||
struct chtls_hws *hws = &csk->tlshws;
|
struct chtls_hws *hws = &csk->tlshws;
|
||||||
@ -1441,7 +1441,7 @@ static int chtls_pt_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
|
|
||||||
buffers_freed = 0;
|
buffers_freed = 0;
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
|
target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
|
||||||
|
|
||||||
if (unlikely(csk_flag(sk, CSK_UPDATE_RCV_WND)))
|
if (unlikely(csk_flag(sk, CSK_UPDATE_RCV_WND)))
|
||||||
@ -1616,7 +1616,7 @@ skip_copy:
|
|||||||
* Peek at data in a socket's receive buffer.
|
* Peek at data in a socket's receive buffer.
|
||||||
*/
|
*/
|
||||||
static int peekmsg(struct sock *sk, struct msghdr *msg,
|
static int peekmsg(struct sock *sk, struct msghdr *msg,
|
||||||
size_t len, int nonblock, int flags)
|
size_t len, int flags)
|
||||||
{
|
{
|
||||||
struct tcp_sock *tp = tcp_sk(sk);
|
struct tcp_sock *tp = tcp_sk(sk);
|
||||||
u32 peek_seq, offset;
|
u32 peek_seq, offset;
|
||||||
@ -1626,7 +1626,7 @@ static int peekmsg(struct sock *sk, struct msghdr *msg,
|
|||||||
long timeo;
|
long timeo;
|
||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
peek_seq = tp->copied_seq;
|
peek_seq = tp->copied_seq;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@ -1737,7 +1737,7 @@ found_ok_skb:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int nonblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct tcp_sock *tp = tcp_sk(sk);
|
struct tcp_sock *tp = tcp_sk(sk);
|
||||||
struct chtls_sock *csk;
|
struct chtls_sock *csk;
|
||||||
@ -1750,25 +1750,23 @@ int chtls_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
buffers_freed = 0;
|
buffers_freed = 0;
|
||||||
|
|
||||||
if (unlikely(flags & MSG_OOB))
|
if (unlikely(flags & MSG_OOB))
|
||||||
return tcp_prot.recvmsg(sk, msg, len, nonblock, flags,
|
return tcp_prot.recvmsg(sk, msg, len, flags, addr_len);
|
||||||
addr_len);
|
|
||||||
|
|
||||||
if (unlikely(flags & MSG_PEEK))
|
if (unlikely(flags & MSG_PEEK))
|
||||||
return peekmsg(sk, msg, len, nonblock, flags);
|
return peekmsg(sk, msg, len, flags);
|
||||||
|
|
||||||
if (sk_can_busy_loop(sk) &&
|
if (sk_can_busy_loop(sk) &&
|
||||||
skb_queue_empty_lockless(&sk->sk_receive_queue) &&
|
skb_queue_empty_lockless(&sk->sk_receive_queue) &&
|
||||||
sk->sk_state == TCP_ESTABLISHED)
|
sk->sk_state == TCP_ESTABLISHED)
|
||||||
sk_busy_loop(sk, nonblock);
|
sk_busy_loop(sk, flags & MSG_DONTWAIT);
|
||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
csk = rcu_dereference_sk_user_data(sk);
|
csk = rcu_dereference_sk_user_data(sk);
|
||||||
|
|
||||||
if (is_tls_rx(csk))
|
if (is_tls_rx(csk))
|
||||||
return chtls_pt_recvmsg(sk, msg, len, nonblock,
|
return chtls_pt_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
flags, addr_len);
|
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
|
target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
|
||||||
|
|
||||||
if (unlikely(csk_flag(sk, CSK_UPDATE_RCV_WND)))
|
if (unlikely(csk_flag(sk, CSK_UPDATE_RCV_WND)))
|
||||||
|
@ -71,7 +71,7 @@ void ping_err(struct sk_buff *skb, int offset, u32 info);
|
|||||||
int ping_getfrag(void *from, char *to, int offset, int fraglen, int odd,
|
int ping_getfrag(void *from, char *to, int offset, int fraglen, int odd,
|
||||||
struct sk_buff *);
|
struct sk_buff *);
|
||||||
|
|
||||||
int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
|
int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int flags, int *addr_len);
|
int flags, int *addr_len);
|
||||||
int ping_common_sendmsg(int family, struct msghdr *msg, size_t len,
|
int ping_common_sendmsg(int family, struct msghdr *msg, size_t len,
|
||||||
void *user_icmph, size_t icmph_len);
|
void *user_icmph, size_t icmph_len);
|
||||||
|
@ -103,7 +103,7 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
|
|||||||
struct sctp_association *asoc);
|
struct sctp_association *asoc);
|
||||||
extern struct percpu_counter sctp_sockets_allocated;
|
extern struct percpu_counter sctp_sockets_allocated;
|
||||||
int sctp_asconf_mgmt(struct sctp_sock *, struct sctp_sockaddr_entry *);
|
int sctp_asconf_mgmt(struct sctp_sock *, struct sctp_sockaddr_entry *);
|
||||||
struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *);
|
struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int *);
|
||||||
|
|
||||||
typedef int (*sctp_callback_t)(struct sctp_endpoint *, struct sctp_transport *, void *);
|
typedef int (*sctp_callback_t)(struct sctp_endpoint *, struct sctp_transport *, void *);
|
||||||
void sctp_transport_walk_start(struct rhashtable_iter *iter);
|
void sctp_transport_walk_start(struct rhashtable_iter *iter);
|
||||||
|
@ -1202,8 +1202,7 @@ struct proto {
|
|||||||
int (*sendmsg)(struct sock *sk, struct msghdr *msg,
|
int (*sendmsg)(struct sock *sk, struct msghdr *msg,
|
||||||
size_t len);
|
size_t len);
|
||||||
int (*recvmsg)(struct sock *sk, struct msghdr *msg,
|
int (*recvmsg)(struct sock *sk, struct msghdr *msg,
|
||||||
size_t len, int noblock, int flags,
|
size_t len, int flags, int *addr_len);
|
||||||
int *addr_len);
|
|
||||||
int (*sendpage)(struct sock *sk, struct page *page,
|
int (*sendpage)(struct sock *sk, struct page *page,
|
||||||
int offset, size_t size, int flags);
|
int offset, size_t size, int flags);
|
||||||
int (*bind)(struct sock *sk,
|
int (*bind)(struct sock *sk,
|
||||||
|
@ -407,7 +407,7 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
|
|||||||
unsigned int optlen);
|
unsigned int optlen);
|
||||||
void tcp_set_keepalive(struct sock *sk, int val);
|
void tcp_set_keepalive(struct sock *sk, int val);
|
||||||
void tcp_syn_ack_timeout(const struct request_sock *req);
|
void tcp_syn_ack_timeout(const struct request_sock *req);
|
||||||
int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
|
int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int flags, int *addr_len);
|
int flags, int *addr_len);
|
||||||
int tcp_set_rcvlowat(struct sock *sk, int val);
|
int tcp_set_rcvlowat(struct sock *sk, int val);
|
||||||
int tcp_set_window_clamp(struct sock *sk, int val);
|
int tcp_set_window_clamp(struct sock *sk, int val);
|
||||||
|
@ -371,7 +371,7 @@ void tls_sw_free_resources_rx(struct sock *sk);
|
|||||||
void tls_sw_release_resources_rx(struct sock *sk);
|
void tls_sw_release_resources_rx(struct sock *sk);
|
||||||
void tls_sw_free_ctx_rx(struct tls_context *tls_ctx);
|
void tls_sw_free_ctx_rx(struct tls_context *tls_ctx);
|
||||||
int tls_sw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
int tls_sw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int nonblock, int flags, int *addr_len);
|
int flags, int *addr_len);
|
||||||
bool tls_sw_sock_is_readable(struct sock *sk);
|
bool tls_sw_sock_is_readable(struct sock *sk);
|
||||||
ssize_t tls_sw_splice_read(struct socket *sock, loff_t *ppos,
|
ssize_t tls_sw_splice_read(struct socket *sock, loff_t *ppos,
|
||||||
struct pipe_inode_info *pipe,
|
struct pipe_inode_info *pipe,
|
||||||
|
@ -250,14 +250,14 @@ void udp_destruct_sock(struct sock *sk);
|
|||||||
void skb_consume_udp(struct sock *sk, struct sk_buff *skb, int len);
|
void skb_consume_udp(struct sock *sk, struct sk_buff *skb, int len);
|
||||||
int __udp_enqueue_schedule_skb(struct sock *sk, struct sk_buff *skb);
|
int __udp_enqueue_schedule_skb(struct sock *sk, struct sk_buff *skb);
|
||||||
void udp_skb_destructor(struct sock *sk, struct sk_buff *skb);
|
void udp_skb_destructor(struct sock *sk, struct sk_buff *skb);
|
||||||
struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags,
|
struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags, int *off,
|
||||||
int noblock, int *off, int *err);
|
int *err);
|
||||||
static inline struct sk_buff *skb_recv_udp(struct sock *sk, unsigned int flags,
|
static inline struct sk_buff *skb_recv_udp(struct sock *sk, unsigned int flags,
|
||||||
int noblock, int *err)
|
int *err)
|
||||||
{
|
{
|
||||||
int off = 0;
|
int off = 0;
|
||||||
|
|
||||||
return __skb_recv_udp(sk, flags, noblock, &off, err);
|
return __skb_recv_udp(sk, flags, &off, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int udp_v4_early_demux(struct sk_buff *skb);
|
int udp_v4_early_demux(struct sk_buff *skb);
|
||||||
|
@ -3506,8 +3506,7 @@ int sock_common_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
|||||||
int addr_len = 0;
|
int addr_len = 0;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = sk->sk_prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
|
err = sk->sk_prot->recvmsg(sk, msg, size, flags, &addr_len);
|
||||||
flags & ~MSG_DONTWAIT, &addr_len);
|
|
||||||
if (err >= 0)
|
if (err >= 0)
|
||||||
msg->msg_namelen = addr_len;
|
msg->msg_namelen = addr_len;
|
||||||
return err;
|
return err;
|
||||||
|
@ -293,8 +293,8 @@ int dccp_setsockopt(struct sock *sk, int level, int optname,
|
|||||||
sockptr_t optval, unsigned int optlen);
|
sockptr_t optval, unsigned int optlen);
|
||||||
int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg);
|
int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg);
|
||||||
int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
|
int dccp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size);
|
||||||
int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
|
int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
|
||||||
int flags, int *addr_len);
|
int *addr_len);
|
||||||
void dccp_shutdown(struct sock *sk, int how);
|
void dccp_shutdown(struct sock *sk, int how);
|
||||||
int inet_dccp_listen(struct socket *sock, int backlog);
|
int inet_dccp_listen(struct socket *sock, int backlog);
|
||||||
__poll_t dccp_poll(struct file *file, struct socket *sock,
|
__poll_t dccp_poll(struct file *file, struct socket *sock,
|
||||||
|
@ -791,8 +791,8 @@ out_discard:
|
|||||||
|
|
||||||
EXPORT_SYMBOL_GPL(dccp_sendmsg);
|
EXPORT_SYMBOL_GPL(dccp_sendmsg);
|
||||||
|
|
||||||
int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
|
int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
|
||||||
int flags, int *addr_len)
|
int *addr_len)
|
||||||
{
|
{
|
||||||
const struct dccp_hdr *dh;
|
const struct dccp_hdr *dh;
|
||||||
long timeo;
|
long timeo;
|
||||||
@ -804,7 +804,7 @@ int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);
|
struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);
|
||||||
|
@ -308,13 +308,12 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
size_t copied = 0;
|
size_t copied = 0;
|
||||||
int err = -EOPNOTSUPP;
|
int err = -EOPNOTSUPP;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
flags |= (noblock ? MSG_DONTWAIT : 0);
|
|
||||||
skb = skb_recv_datagram(sk, flags, &err);
|
skb = skb_recv_datagram(sk, flags, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
@ -696,7 +695,7 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
size_t copied = 0;
|
size_t copied = 0;
|
||||||
int err = -EOPNOTSUPP;
|
int err = -EOPNOTSUPP;
|
||||||
@ -704,7 +703,6 @@ static int dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
struct dgram_sock *ro = dgram_sk(sk);
|
struct dgram_sock *ro = dgram_sk(sk);
|
||||||
DECLARE_SOCKADDR(struct sockaddr_ieee802154 *, saddr, msg->msg_name);
|
DECLARE_SOCKADDR(struct sockaddr_ieee802154 *, saddr, msg->msg_name);
|
||||||
|
|
||||||
flags |= (noblock ? MSG_DONTWAIT : 0);
|
|
||||||
skb = skb_recv_datagram(sk, flags, &err);
|
skb = skb_recv_datagram(sk, flags, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -836,7 +836,7 @@ ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset,
|
|||||||
EXPORT_SYMBOL(inet_sendpage);
|
EXPORT_SYMBOL(inet_sendpage);
|
||||||
|
|
||||||
INDIRECT_CALLABLE_DECLARE(int udp_recvmsg(struct sock *, struct msghdr *,
|
INDIRECT_CALLABLE_DECLARE(int udp_recvmsg(struct sock *, struct msghdr *,
|
||||||
size_t, int, int, int *));
|
size_t, int, int *));
|
||||||
int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
@ -848,8 +848,7 @@ int inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
|||||||
sock_rps_record_flow(sk);
|
sock_rps_record_flow(sk);
|
||||||
|
|
||||||
err = INDIRECT_CALL_2(sk->sk_prot->recvmsg, tcp_recvmsg, udp_recvmsg,
|
err = INDIRECT_CALL_2(sk->sk_prot->recvmsg, tcp_recvmsg, udp_recvmsg,
|
||||||
sk, msg, size, flags & MSG_DONTWAIT,
|
sk, msg, size, flags, &addr_len);
|
||||||
flags & ~MSG_DONTWAIT, &addr_len);
|
|
||||||
if (err >= 0)
|
if (err >= 0)
|
||||||
msg->msg_namelen = addr_len;
|
msg->msg_namelen = addr_len;
|
||||||
return err;
|
return err;
|
||||||
|
@ -844,8 +844,8 @@ do_confirm:
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
|
int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
|
||||||
int flags, int *addr_len)
|
int *addr_len)
|
||||||
{
|
{
|
||||||
struct inet_sock *isk = inet_sk(sk);
|
struct inet_sock *isk = inet_sk(sk);
|
||||||
int family = sk->sk_family;
|
int family = sk->sk_family;
|
||||||
@ -861,7 +861,6 @@ int ping_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
|
|||||||
if (flags & MSG_ERRQUEUE)
|
if (flags & MSG_ERRQUEUE)
|
||||||
return inet_recv_error(sk, msg, len, addr_len);
|
return inet_recv_error(sk, msg, len, addr_len);
|
||||||
|
|
||||||
flags |= (noblock ? MSG_DONTWAIT : 0);
|
|
||||||
skb = skb_recv_datagram(sk, flags, &err);
|
skb = skb_recv_datagram(sk, flags, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -753,7 +753,7 @@ out:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
size_t copied = 0;
|
size_t copied = 0;
|
||||||
@ -769,7 +769,6 @@ static int raw_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
flags |= (noblock ? MSG_DONTWAIT : 0);
|
|
||||||
skb = skb_recv_datagram(sk, flags, &err);
|
skb = skb_recv_datagram(sk, flags, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1877,8 +1877,7 @@ static void tcp_zerocopy_set_hint_for_skb(struct sock *sk,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
|
static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int nonblock, int flags,
|
int flags, struct scm_timestamping_internal *tss,
|
||||||
struct scm_timestamping_internal *tss,
|
|
||||||
int *cmsg_flags);
|
int *cmsg_flags);
|
||||||
static int receive_fallback_to_copy(struct sock *sk,
|
static int receive_fallback_to_copy(struct sock *sk,
|
||||||
struct tcp_zerocopy_receive *zc, int inq,
|
struct tcp_zerocopy_receive *zc, int inq,
|
||||||
@ -1900,7 +1899,7 @@ static int receive_fallback_to_copy(struct sock *sk,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = tcp_recvmsg_locked(sk, &msg, inq, /*nonblock=*/1, /*flags=*/0,
|
err = tcp_recvmsg_locked(sk, &msg, inq, MSG_DONTWAIT,
|
||||||
tss, &zc->msg_flags);
|
tss, &zc->msg_flags);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
@ -2316,8 +2315,7 @@ static int tcp_inq_hint(struct sock *sk)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
|
static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int nonblock, int flags,
|
int flags, struct scm_timestamping_internal *tss,
|
||||||
struct scm_timestamping_internal *tss,
|
|
||||||
int *cmsg_flags)
|
int *cmsg_flags)
|
||||||
{
|
{
|
||||||
struct tcp_sock *tp = tcp_sk(sk);
|
struct tcp_sock *tp = tcp_sk(sk);
|
||||||
@ -2337,7 +2335,7 @@ static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
|
|
||||||
if (tp->recvmsg_inq)
|
if (tp->recvmsg_inq)
|
||||||
*cmsg_flags = TCP_CMSG_INQ;
|
*cmsg_flags = TCP_CMSG_INQ;
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
|
|
||||||
/* Urgent data needs to be handled specially. */
|
/* Urgent data needs to be handled specially. */
|
||||||
if (flags & MSG_OOB)
|
if (flags & MSG_OOB)
|
||||||
@ -2556,8 +2554,8 @@ recv_sndq:
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
|
int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
|
||||||
int flags, int *addr_len)
|
int *addr_len)
|
||||||
{
|
{
|
||||||
int cmsg_flags = 0, ret, inq;
|
int cmsg_flags = 0, ret, inq;
|
||||||
struct scm_timestamping_internal tss;
|
struct scm_timestamping_internal tss;
|
||||||
@ -2568,11 +2566,10 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
|
|||||||
if (sk_can_busy_loop(sk) &&
|
if (sk_can_busy_loop(sk) &&
|
||||||
skb_queue_empty_lockless(&sk->sk_receive_queue) &&
|
skb_queue_empty_lockless(&sk->sk_receive_queue) &&
|
||||||
sk->sk_state == TCP_ESTABLISHED)
|
sk->sk_state == TCP_ESTABLISHED)
|
||||||
sk_busy_loop(sk, nonblock);
|
sk_busy_loop(sk, flags & MSG_DONTWAIT);
|
||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
ret = tcp_recvmsg_locked(sk, msg, len, nonblock, flags, &tss,
|
ret = tcp_recvmsg_locked(sk, msg, len, flags, &tss, &cmsg_flags);
|
||||||
&cmsg_flags);
|
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
sk_defer_free_flush(sk);
|
sk_defer_free_flush(sk);
|
||||||
|
|
||||||
|
@ -174,7 +174,6 @@ static int tcp_msg_wait_data(struct sock *sk, struct sk_psock *psock,
|
|||||||
static int tcp_bpf_recvmsg_parser(struct sock *sk,
|
static int tcp_bpf_recvmsg_parser(struct sock *sk,
|
||||||
struct msghdr *msg,
|
struct msghdr *msg,
|
||||||
size_t len,
|
size_t len,
|
||||||
int nonblock,
|
|
||||||
int flags,
|
int flags,
|
||||||
int *addr_len)
|
int *addr_len)
|
||||||
{
|
{
|
||||||
@ -186,7 +185,7 @@ static int tcp_bpf_recvmsg_parser(struct sock *sk,
|
|||||||
|
|
||||||
psock = sk_psock_get(sk);
|
psock = sk_psock_get(sk);
|
||||||
if (unlikely(!psock))
|
if (unlikely(!psock))
|
||||||
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
return tcp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
msg_bytes_ready:
|
msg_bytes_ready:
|
||||||
@ -211,7 +210,7 @@ msg_bytes_ready:
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
if (!timeo) {
|
if (!timeo) {
|
||||||
copied = -EAGAIN;
|
copied = -EAGAIN;
|
||||||
goto out;
|
goto out;
|
||||||
@ -234,7 +233,7 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int nonblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct sk_psock *psock;
|
struct sk_psock *psock;
|
||||||
int copied, ret;
|
int copied, ret;
|
||||||
@ -244,11 +243,11 @@ static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
|
|
||||||
psock = sk_psock_get(sk);
|
psock = sk_psock_get(sk);
|
||||||
if (unlikely(!psock))
|
if (unlikely(!psock))
|
||||||
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
return tcp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
if (!skb_queue_empty(&sk->sk_receive_queue) &&
|
if (!skb_queue_empty(&sk->sk_receive_queue) &&
|
||||||
sk_psock_queue_empty(psock)) {
|
sk_psock_queue_empty(psock)) {
|
||||||
sk_psock_put(sk, psock);
|
sk_psock_put(sk, psock);
|
||||||
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
return tcp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
}
|
}
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
msg_bytes_ready:
|
msg_bytes_ready:
|
||||||
@ -257,14 +256,14 @@ msg_bytes_ready:
|
|||||||
long timeo;
|
long timeo;
|
||||||
int data;
|
int data;
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
data = tcp_msg_wait_data(sk, psock, timeo);
|
data = tcp_msg_wait_data(sk, psock, timeo);
|
||||||
if (data) {
|
if (data) {
|
||||||
if (!sk_psock_queue_empty(psock))
|
if (!sk_psock_queue_empty(psock))
|
||||||
goto msg_bytes_ready;
|
goto msg_bytes_ready;
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
sk_psock_put(sk, psock);
|
sk_psock_put(sk, psock);
|
||||||
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
return tcp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
}
|
}
|
||||||
copied = -EAGAIN;
|
copied = -EAGAIN;
|
||||||
}
|
}
|
||||||
|
@ -1726,7 +1726,7 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
|
|||||||
EXPORT_SYMBOL(udp_ioctl);
|
EXPORT_SYMBOL(udp_ioctl);
|
||||||
|
|
||||||
struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags,
|
struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags,
|
||||||
int noblock, int *off, int *err)
|
int *off, int *err)
|
||||||
{
|
{
|
||||||
struct sk_buff_head *sk_queue = &sk->sk_receive_queue;
|
struct sk_buff_head *sk_queue = &sk->sk_receive_queue;
|
||||||
struct sk_buff_head *queue;
|
struct sk_buff_head *queue;
|
||||||
@ -1735,7 +1735,6 @@ struct sk_buff *__skb_recv_udp(struct sock *sk, unsigned int flags,
|
|||||||
int error;
|
int error;
|
||||||
|
|
||||||
queue = &udp_sk(sk)->reader_queue;
|
queue = &udp_sk(sk)->reader_queue;
|
||||||
flags |= noblock ? MSG_DONTWAIT : 0;
|
|
||||||
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
do {
|
do {
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
@ -1805,7 +1804,7 @@ int udp_read_sock(struct sock *sk, read_descriptor_t *desc,
|
|||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
int err, used;
|
int err, used;
|
||||||
|
|
||||||
skb = skb_recv_udp(sk, 0, 1, &err);
|
skb = skb_recv_udp(sk, MSG_DONTWAIT, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
@ -1843,8 +1842,8 @@ EXPORT_SYMBOL(udp_read_sock);
|
|||||||
* return it, otherwise we block.
|
* return it, otherwise we block.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
|
int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
|
||||||
int flags, int *addr_len)
|
int *addr_len)
|
||||||
{
|
{
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);
|
DECLARE_SOCKADDR(struct sockaddr_in *, sin, msg->msg_name);
|
||||||
@ -1859,7 +1858,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
|
|||||||
|
|
||||||
try_again:
|
try_again:
|
||||||
off = sk_peek_offset(sk, flags);
|
off = sk_peek_offset(sk, flags);
|
||||||
skb = __skb_recv_udp(sk, flags, noblock, &off, &err);
|
skb = __skb_recv_udp(sk, flags, &off, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -11,14 +11,13 @@
|
|||||||
static struct proto *udpv6_prot_saved __read_mostly;
|
static struct proto *udpv6_prot_saved __read_mostly;
|
||||||
|
|
||||||
static int sk_udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int sk_udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
if (sk->sk_family == AF_INET6)
|
if (sk->sk_family == AF_INET6)
|
||||||
return udpv6_prot_saved->recvmsg(sk, msg, len, noblock, flags,
|
return udpv6_prot_saved->recvmsg(sk, msg, len, flags, addr_len);
|
||||||
addr_len);
|
|
||||||
#endif
|
#endif
|
||||||
return udp_prot.recvmsg(sk, msg, len, noblock, flags, addr_len);
|
return udp_prot.recvmsg(sk, msg, len, flags, addr_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool udp_sk_has_data(struct sock *sk)
|
static bool udp_sk_has_data(struct sock *sk)
|
||||||
@ -61,7 +60,7 @@ static int udp_msg_wait_data(struct sock *sk, struct sk_psock *psock,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int udp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int udp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int nonblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct sk_psock *psock;
|
struct sk_psock *psock;
|
||||||
int copied, ret;
|
int copied, ret;
|
||||||
@ -71,10 +70,10 @@ static int udp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
|
|
||||||
psock = sk_psock_get(sk);
|
psock = sk_psock_get(sk);
|
||||||
if (unlikely(!psock))
|
if (unlikely(!psock))
|
||||||
return sk_udp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
return sk_udp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
|
|
||||||
if (!psock_has_data(psock)) {
|
if (!psock_has_data(psock)) {
|
||||||
ret = sk_udp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
ret = sk_udp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,12 +83,12 @@ msg_bytes_ready:
|
|||||||
long timeo;
|
long timeo;
|
||||||
int data;
|
int data;
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
data = udp_msg_wait_data(sk, psock, timeo);
|
data = udp_msg_wait_data(sk, psock, timeo);
|
||||||
if (data) {
|
if (data) {
|
||||||
if (psock_has_data(psock))
|
if (psock_has_data(psock))
|
||||||
goto msg_bytes_ready;
|
goto msg_bytes_ready;
|
||||||
ret = sk_udp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
ret = sk_udp_recvmsg(sk, msg, len, flags, addr_len);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
copied = -EAGAIN;
|
copied = -EAGAIN;
|
||||||
|
@ -17,8 +17,8 @@ int udp_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
|
|||||||
int udp_getsockopt(struct sock *sk, int level, int optname,
|
int udp_getsockopt(struct sock *sk, int level, int optname,
|
||||||
char __user *optval, int __user *optlen);
|
char __user *optval, int __user *optlen);
|
||||||
|
|
||||||
int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
|
int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
|
||||||
int flags, int *addr_len);
|
int *addr_len);
|
||||||
int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
|
int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
|
||||||
int flags);
|
int flags);
|
||||||
void udp_destroy_sock(struct sock *sk);
|
void udp_destroy_sock(struct sock *sk);
|
||||||
|
@ -654,7 +654,7 @@ int inet6_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
INDIRECT_CALLABLE_DECLARE(int udpv6_recvmsg(struct sock *, struct msghdr *,
|
INDIRECT_CALLABLE_DECLARE(int udpv6_recvmsg(struct sock *, struct msghdr *,
|
||||||
size_t, int, int, int *));
|
size_t, int, int *));
|
||||||
int inet6_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
int inet6_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
@ -669,8 +669,7 @@ int inet6_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
|||||||
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
/* IPV6_ADDRFORM can change sk->sk_prot under us. */
|
||||||
prot = READ_ONCE(sk->sk_prot);
|
prot = READ_ONCE(sk->sk_prot);
|
||||||
err = INDIRECT_CALL_2(prot->recvmsg, tcp_recvmsg, udpv6_recvmsg,
|
err = INDIRECT_CALL_2(prot->recvmsg, tcp_recvmsg, udpv6_recvmsg,
|
||||||
sk, msg, size, flags & MSG_DONTWAIT,
|
sk, msg, size, flags, &addr_len);
|
||||||
flags & ~MSG_DONTWAIT, &addr_len);
|
|
||||||
if (err >= 0)
|
if (err >= 0)
|
||||||
msg->msg_namelen = addr_len;
|
msg->msg_namelen = addr_len;
|
||||||
return err;
|
return err;
|
||||||
|
@ -460,7 +460,7 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||||
DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
|
DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
|
||||||
@ -477,7 +477,6 @@ static int rawv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
if (np->rxpmtu && np->rxopt.bits.rxpmtu)
|
if (np->rxpmtu && np->rxopt.bits.rxpmtu)
|
||||||
return ipv6_recv_rxpmtu(sk, msg, len, addr_len);
|
return ipv6_recv_rxpmtu(sk, msg, len, addr_len);
|
||||||
|
|
||||||
flags |= (noblock ? MSG_DONTWAIT : 0);
|
|
||||||
skb = skb_recv_datagram(sk, flags, &err);
|
skb = skb_recv_datagram(sk, flags, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -322,7 +322,7 @@ static int udp6_skb_len(struct sk_buff *skb)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
@ -342,7 +342,7 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
|
|
||||||
try_again:
|
try_again:
|
||||||
off = sk_peek_offset(sk, flags);
|
off = sk_peek_offset(sk, flags);
|
||||||
skb = __skb_recv_udp(sk, flags, noblock, &off, &err);
|
skb = __skb_recv_udp(sk, flags, &off, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -20,8 +20,8 @@ int udpv6_getsockopt(struct sock *sk, int level, int optname,
|
|||||||
int udpv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
|
int udpv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
|
||||||
unsigned int optlen);
|
unsigned int optlen);
|
||||||
int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
|
int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
|
||||||
int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
|
int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags,
|
||||||
int flags, int *addr_len);
|
int *addr_len);
|
||||||
void udpv6_destroy_sock(struct sock *sk);
|
void udpv6_destroy_sock(struct sock *sk);
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
|
@ -515,7 +515,7 @@ no_route:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int l2tp_ip_recvmsg(struct sock *sk, struct msghdr *msg,
|
static int l2tp_ip_recvmsg(struct sock *sk, struct msghdr *msg,
|
||||||
size_t len, int noblock, int flags, int *addr_len)
|
size_t len, int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct inet_sock *inet = inet_sk(sk);
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
size_t copied = 0;
|
size_t copied = 0;
|
||||||
@ -526,7 +526,6 @@ static int l2tp_ip_recvmsg(struct sock *sk, struct msghdr *msg,
|
|||||||
if (flags & MSG_OOB)
|
if (flags & MSG_OOB)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
flags |= (noblock ? MSG_DONTWAIT : 0);
|
|
||||||
skb = skb_recv_datagram(sk, flags, &err);
|
skb = skb_recv_datagram(sk, flags, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -657,7 +657,7 @@ do_confirm:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int l2tp_ip6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int l2tp_ip6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||||
DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name);
|
DECLARE_SOCKADDR(struct sockaddr_l2tpip6 *, lsa, msg->msg_name);
|
||||||
@ -671,7 +671,6 @@ static int l2tp_ip6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
if (flags & MSG_ERRQUEUE)
|
if (flags & MSG_ERRQUEUE)
|
||||||
return ipv6_recv_error(sk, msg, len, addr_len);
|
return ipv6_recv_error(sk, msg, len, addr_len);
|
||||||
|
|
||||||
flags |= (noblock ? MSG_DONTWAIT : 0);
|
|
||||||
skb = skb_recv_datagram(sk, flags, &err);
|
skb = skb_recv_datagram(sk, flags, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -2012,7 +2012,7 @@ static unsigned int mptcp_inq_hint(const struct sock *sk)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int nonblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct mptcp_sock *msk = mptcp_sk(sk);
|
struct mptcp_sock *msk = mptcp_sk(sk);
|
||||||
struct scm_timestamping_internal tss;
|
struct scm_timestamping_internal tss;
|
||||||
@ -2030,7 +2030,7 @@ static int mptcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
|
|
||||||
len = min_t(size_t, len, INT_MAX);
|
len = min_t(size_t, len, INT_MAX);
|
||||||
target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
|
target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
|
||||||
|
@ -112,7 +112,7 @@ static int pn_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int pn_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int pn_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb = NULL;
|
struct sk_buff *skb = NULL;
|
||||||
struct sockaddr_pn sa;
|
struct sockaddr_pn sa;
|
||||||
@ -123,7 +123,6 @@ static int pn_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
MSG_CMSG_COMPAT))
|
MSG_CMSG_COMPAT))
|
||||||
goto out_nofree;
|
goto out_nofree;
|
||||||
|
|
||||||
flags |= (noblock ? MSG_DONTWAIT : 0);
|
|
||||||
skb = skb_recv_datagram(sk, flags, &rval);
|
skb = skb_recv_datagram(sk, flags, &rval);
|
||||||
if (skb == NULL)
|
if (skb == NULL)
|
||||||
goto out_nofree;
|
goto out_nofree;
|
||||||
|
@ -1239,7 +1239,7 @@ struct sk_buff *pep_read(struct sock *sk)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int pep_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int pep_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
int err;
|
int err;
|
||||||
@ -1268,7 +1268,6 @@ static int pep_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
flags |= (noblock ? MSG_DONTWAIT : 0);
|
|
||||||
skb = skb_recv_datagram(sk, flags, &err);
|
skb = skb_recv_datagram(sk, flags, &err);
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
if (skb == NULL) {
|
if (skb == NULL) {
|
||||||
|
@ -2084,7 +2084,7 @@ static int sctp_skb_pull(struct sk_buff *skb, int len)
|
|||||||
* 5 for complete description of the flags.
|
* 5 for complete description of the flags.
|
||||||
*/
|
*/
|
||||||
static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int noblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct sctp_ulpevent *event = NULL;
|
struct sctp_ulpevent *event = NULL;
|
||||||
struct sctp_sock *sp = sctp_sk(sk);
|
struct sctp_sock *sp = sctp_sk(sk);
|
||||||
@ -2093,9 +2093,8 @@ static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
int err = 0;
|
int err = 0;
|
||||||
int skb_len;
|
int skb_len;
|
||||||
|
|
||||||
pr_debug("%s: sk:%p, msghdr:%p, len:%zd, noblock:%d, flags:0x%x, "
|
pr_debug("%s: sk:%p, msghdr:%p, len:%zd, flags:0x%x, addr_len:%p)\n",
|
||||||
"addr_len:%p)\n", __func__, sk, msg, len, noblock, flags,
|
__func__, sk, msg, len, flags, addr_len);
|
||||||
addr_len);
|
|
||||||
|
|
||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
|
|
||||||
@ -2105,7 +2104,7 @@ static int sctp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
skb = sctp_skb_recv_datagram(sk, flags, noblock, &err);
|
skb = sctp_skb_recv_datagram(sk, flags, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -8978,14 +8977,13 @@ out:
|
|||||||
* Note: This is pretty much the same routine as in core/datagram.c
|
* Note: This is pretty much the same routine as in core/datagram.c
|
||||||
* with a few changes to make lksctp work.
|
* with a few changes to make lksctp work.
|
||||||
*/
|
*/
|
||||||
struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
|
struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, int *err)
|
||||||
int noblock, int *err)
|
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
long timeo;
|
long timeo;
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, noblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
|
|
||||||
pr_debug("%s: timeo:%ld, max:%ld\n", __func__, timeo,
|
pr_debug("%s: timeo:%ld, max:%ld\n", __func__, timeo,
|
||||||
MAX_SCHEDULE_TIMEOUT);
|
MAX_SCHEDULE_TIMEOUT);
|
||||||
@ -9018,7 +9016,7 @@ struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
if (sk_can_busy_loop(sk)) {
|
if (sk_can_busy_loop(sk)) {
|
||||||
sk_busy_loop(sk, noblock);
|
sk_busy_loop(sk, flags & MSG_DONTWAIT);
|
||||||
|
|
||||||
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
if (!skb_queue_empty_lockless(&sk->sk_receive_queue))
|
||||||
continue;
|
continue;
|
||||||
|
@ -1063,7 +1063,7 @@ void sctp_ulpevent_read_nxtinfo(const struct sctp_ulpevent *event,
|
|||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
skb = sctp_skb_recv_datagram(sk, MSG_PEEK, 1, &err);
|
skb = sctp_skb_recv_datagram(sk, MSG_PEEK | MSG_DONTWAIT, &err);
|
||||||
if (skb != NULL) {
|
if (skb != NULL) {
|
||||||
__sctp_ulpevent_read_nxtinfo(sctp_skb2event(skb),
|
__sctp_ulpevent_read_nxtinfo(sctp_skb2event(skb),
|
||||||
msghdr, skb);
|
msghdr, skb);
|
||||||
|
@ -464,7 +464,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
|
|||||||
0, 0, MSG_PEEK | MSG_DONTWAIT);
|
0, 0, MSG_PEEK | MSG_DONTWAIT);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out_recv_err;
|
goto out_recv_err;
|
||||||
skb = skb_recv_udp(svsk->sk_sk, 0, 1, &err);
|
skb = skb_recv_udp(svsk->sk_sk, MSG_DONTWAIT, &err);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto out_recv_err;
|
goto out_recv_err;
|
||||||
|
|
||||||
|
@ -1337,7 +1337,7 @@ static void xs_udp_data_receive(struct sock_xprt *transport)
|
|||||||
if (sk == NULL)
|
if (sk == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
skb = skb_recv_udp(sk, 0, 1, &err);
|
skb = skb_recv_udp(sk, MSG_DONTWAIT, &err);
|
||||||
if (skb == NULL)
|
if (skb == NULL)
|
||||||
break;
|
break;
|
||||||
xs_udp_data_read_skb(&transport->xprt, sk, skb);
|
xs_udp_data_read_skb(&transport->xprt, sk, skb);
|
||||||
|
@ -1722,7 +1722,6 @@ static int process_rx_list(struct tls_sw_context_rx *ctx,
|
|||||||
int tls_sw_recvmsg(struct sock *sk,
|
int tls_sw_recvmsg(struct sock *sk,
|
||||||
struct msghdr *msg,
|
struct msghdr *msg,
|
||||||
size_t len,
|
size_t len,
|
||||||
int nonblock,
|
|
||||||
int flags,
|
int flags,
|
||||||
int *addr_len)
|
int *addr_len)
|
||||||
{
|
{
|
||||||
@ -1744,8 +1743,6 @@ int tls_sw_recvmsg(struct sock *sk,
|
|||||||
bool bpf_strp_enabled;
|
bool bpf_strp_enabled;
|
||||||
bool zc_capable;
|
bool zc_capable;
|
||||||
|
|
||||||
flags |= nonblock;
|
|
||||||
|
|
||||||
if (unlikely(flags & MSG_ERRQUEUE))
|
if (unlikely(flags & MSG_ERRQUEUE))
|
||||||
return sock_recv_errqueue(sk, msg, len, SOL_IP, IP_RECVERR);
|
return sock_recv_errqueue(sk, msg, len, SOL_IP, IP_RECVERR);
|
||||||
|
|
||||||
|
@ -2484,8 +2484,7 @@ static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg, size_t si
|
|||||||
const struct proto *prot = READ_ONCE(sk->sk_prot);
|
const struct proto *prot = READ_ONCE(sk->sk_prot);
|
||||||
|
|
||||||
if (prot != &unix_dgram_proto)
|
if (prot != &unix_dgram_proto)
|
||||||
return prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
|
return prot->recvmsg(sk, msg, size, flags, NULL);
|
||||||
flags & ~MSG_DONTWAIT, NULL);
|
|
||||||
#endif
|
#endif
|
||||||
return __unix_dgram_recvmsg(sk, msg, size, flags);
|
return __unix_dgram_recvmsg(sk, msg, size, flags);
|
||||||
}
|
}
|
||||||
@ -2917,8 +2916,7 @@ static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg,
|
|||||||
const struct proto *prot = READ_ONCE(sk->sk_prot);
|
const struct proto *prot = READ_ONCE(sk->sk_prot);
|
||||||
|
|
||||||
if (prot != &unix_stream_proto)
|
if (prot != &unix_stream_proto)
|
||||||
return prot->recvmsg(sk, msg, size, flags & MSG_DONTWAIT,
|
return prot->recvmsg(sk, msg, size, flags, NULL);
|
||||||
flags & ~MSG_DONTWAIT, NULL);
|
|
||||||
#endif
|
#endif
|
||||||
return unix_stream_read_generic(&state, true);
|
return unix_stream_read_generic(&state, true);
|
||||||
}
|
}
|
||||||
|
@ -48,8 +48,7 @@ static int __unix_recvmsg(struct sock *sk, struct msghdr *msg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int unix_bpf_recvmsg(struct sock *sk, struct msghdr *msg,
|
static int unix_bpf_recvmsg(struct sock *sk, struct msghdr *msg,
|
||||||
size_t len, int nonblock, int flags,
|
size_t len, int flags, int *addr_len)
|
||||||
int *addr_len)
|
|
||||||
{
|
{
|
||||||
struct unix_sock *u = unix_sk(sk);
|
struct unix_sock *u = unix_sk(sk);
|
||||||
struct sk_psock *psock;
|
struct sk_psock *psock;
|
||||||
@ -73,7 +72,7 @@ msg_bytes_ready:
|
|||||||
long timeo;
|
long timeo;
|
||||||
int data;
|
int data;
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
|
||||||
data = unix_msg_wait_data(sk, psock, timeo);
|
data = unix_msg_wait_data(sk, psock, timeo);
|
||||||
if (data) {
|
if (data) {
|
||||||
if (!sk_psock_queue_empty(psock))
|
if (!sk_psock_queue_empty(psock))
|
||||||
|
@ -131,7 +131,7 @@ static int espintcp_parse(struct strparser *strp, struct sk_buff *skb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int espintcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
static int espintcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
int nonblock, int flags, int *addr_len)
|
int flags, int *addr_len)
|
||||||
{
|
{
|
||||||
struct espintcp_ctx *ctx = espintcp_getctx(sk);
|
struct espintcp_ctx *ctx = espintcp_getctx(sk);
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
@ -139,8 +139,6 @@ static int espintcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|||||||
int copied;
|
int copied;
|
||||||
int off = 0;
|
int off = 0;
|
||||||
|
|
||||||
flags |= nonblock ? MSG_DONTWAIT : 0;
|
|
||||||
|
|
||||||
skb = __skb_recv_datagram(sk, &ctx->ike_queue, flags, &off, &err);
|
skb = __skb_recv_datagram(sk, &ctx->ike_queue, flags, &off, &err);
|
||||||
if (!skb) {
|
if (!skb) {
|
||||||
if (err == -EAGAIN && sk->sk_shutdown & RCV_SHUTDOWN)
|
if (err == -EAGAIN && sk->sk_shutdown & RCV_SHUTDOWN)
|
||||||
|
Loading…
Reference in New Issue
Block a user