[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <53525ac0-1632-1a49-5c80-9ed2aa0012e0@kaspersky.com>
Date: Mon, 15 Feb 2021 12:11:53 +0300
From: Arseny Krasnov <arseny.krasnov@...persky.com>
To: Stefano Garzarella <sgarzare@...hat.com>
CC: Stefan Hajnoczi <stefanha@...hat.com>,
"Michael S. Tsirkin" <mst@...hat.com>,
Jason Wang <jasowang@...hat.com>,
"David S. Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Jorgen Hansen <jhansen@...are.com>,
Colin Ian King <colin.king@...onical.com>,
Andra Paraschiv <andraprs@...zon.com>,
Jeff Vander Stoep <jeffv@...gle.com>,
"kvm@...r.kernel.org" <kvm@...r.kernel.org>,
"virtualization@...ts.linux-foundation.org"
<virtualization@...ts.linux-foundation.org>,
"netdev@...r.kernel.org" <netdev@...r.kernel.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"stsp2@...dex.ru" <stsp2@...dex.ru>,
"oxffffaa@...il.com" <oxffffaa@...il.com>
Subject: Re: [RFC PATCH v4 07/17] af_vsock: rest of SEQPACKET support
On 11.02.2021 15:27, Stefano Garzarella wrote:
> On Sun, Feb 07, 2021 at 06:16:12PM +0300, Arseny Krasnov wrote:
>> This does rest of SOCK_SEQPACKET support:
>> 1) Adds socket ops for SEQPACKET type.
>> 2) Allows to create socket with SEQPACKET type.
>>
>> Signed-off-by: Arseny Krasnov <arseny.krasnov@...persky.com>
>> ---
>> net/vmw_vsock/af_vsock.c | 37 ++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 36 insertions(+), 1 deletion(-)
>>
>> diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
>> index a033d3340ac4..c77998a14018 100644
>> --- a/net/vmw_vsock/af_vsock.c
>> +++ b/net/vmw_vsock/af_vsock.c
>> @@ -452,6 +452,7 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
>> new_transport = transport_dgram;
>> break;
>> case SOCK_STREAM:
>> + case SOCK_SEQPACKET:
>> if (vsock_use_local_transport(remote_cid))
>> new_transport = transport_local;
>> else if (remote_cid <= VMADDR_CID_HOST || !transport_h2g ||
>> @@ -459,6 +460,15 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
>> new_transport = transport_g2h;
>> else
>> new_transport = transport_h2g;
>> +
>> + if (sk->sk_type == SOCK_SEQPACKET) {
>> + if (!new_transport ||
>> + !new_transport->seqpacket_seq_send_len ||
>> + !new_transport->seqpacket_seq_send_eor ||
>> + !new_transport->seqpacket_seq_get_len ||
>> + !new_transport->seqpacket_dequeue)
>> + return -ESOCKTNOSUPPORT;
>> + }
> Maybe we should move this check after the try_module_get() call, since
> the memory pointed by 'new_transport' pointer can be deallocated in the
> meantime.
>
> Also, if the socket had a transport before, we should deassign it before
> returning an error.
I think previous transport is deassigned immediately after this
'switch()' on sk->sk_type:
if (vsk->transport) {
...
vsock_deassign_transport(vsk);
}
Ok, check will be moved after 'try_module_get()'.
>
>> break;
>> default:
>> return -ESOCKTNOSUPPORT;
>> @@ -684,6 +694,7 @@ static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr)
>>
>> switch (sk->sk_socket->type) {
>> case SOCK_STREAM:
>> + case SOCK_SEQPACKET:
>> spin_lock_bh(&vsock_table_lock);
>> retval = __vsock_bind_connectible(vsk, addr);
>> spin_unlock_bh(&vsock_table_lock);
>> @@ -769,7 +780,7 @@ static struct sock *__vsock_create(struct net *net,
>>
>> static bool sock_type_connectible(u16 type)
>> {
>> - return type == SOCK_STREAM;
>> + return (type == SOCK_STREAM) || (type == SOCK_SEQPACKET);
>> }
>>
>> static void __vsock_release(struct sock *sk, int level)
>> @@ -2199,6 +2210,27 @@ static const struct proto_ops vsock_stream_ops = {
>> .sendpage = sock_no_sendpage,
>> };
>>
>> +static const struct proto_ops vsock_seqpacket_ops = {
>> + .family = PF_VSOCK,
>> + .owner = THIS_MODULE,
>> + .release = vsock_release,
>> + .bind = vsock_bind,
>> + .connect = vsock_connect,
>> + .socketpair = sock_no_socketpair,
>> + .accept = vsock_accept,
>> + .getname = vsock_getname,
>> + .poll = vsock_poll,
>> + .ioctl = sock_no_ioctl,
>> + .listen = vsock_listen,
>> + .shutdown = vsock_shutdown,
>> + .setsockopt = vsock_connectible_setsockopt,
>> + .getsockopt = vsock_connectible_getsockopt,
>> + .sendmsg = vsock_connectible_sendmsg,
>> + .recvmsg = vsock_connectible_recvmsg,
>> + .mmap = sock_no_mmap,
>> + .sendpage = sock_no_sendpage,
>> +};
>> +
>> static int vsock_create(struct net *net, struct socket *sock,
>> int protocol, int kern)
>> {
>> @@ -2219,6 +2251,9 @@ static int vsock_create(struct net *net, struct socket *sock,
>> case SOCK_STREAM:
>> sock->ops = &vsock_stream_ops;
>> break;
>> + case SOCK_SEQPACKET:
>> + sock->ops = &vsock_seqpacket_ops;
>> + break;
>> default:
>> return -ESOCKTNOSUPPORT;
>> }
>> --
>> 2.25.1
>>
>
Powered by blists - more mailing lists