Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vsock: add API call for data ready

This adds 'vsock_data_ready()' which must be called by transport to kick
sleeping data readers. It checks for SO_RCVLOWAT value before waking
user, thus preventing spurious wake ups. Based on 'tcp_data_ready()' logic.

Signed-off-by: Arseniy Krasnov <AVKrasnov@sberdevices.ru>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Arseniy Krasnov and committed by
Paolo Abeni
f2fdcf67 ee0b3843

+11
+1
include/net/af_vsock.h
··· 78 78 s64 vsock_stream_has_data(struct vsock_sock *vsk); 79 79 s64 vsock_stream_has_space(struct vsock_sock *vsk); 80 80 struct sock *vsock_create_connected(struct sock *parent); 81 + void vsock_data_ready(struct sock *sk); 81 82 82 83 /**** TRANSPORT ****/ 83 84
+10
net/vmw_vsock/af_vsock.c
··· 882 882 } 883 883 EXPORT_SYMBOL_GPL(vsock_stream_has_space); 884 884 885 + void vsock_data_ready(struct sock *sk) 886 + { 887 + struct vsock_sock *vsk = vsock_sk(sk); 888 + 889 + if (vsock_stream_has_data(vsk) >= sk->sk_rcvlowat || 890 + sock_flag(sk, SOCK_DONE)) 891 + sk->sk_data_ready(sk); 892 + } 893 + EXPORT_SYMBOL_GPL(vsock_data_ready); 894 + 885 895 static int vsock_release(struct socket *sock) 886 896 { 887 897 __vsock_release(sock->sk, 0);