Skip to content

Commit fe502c4

Browse files
stefano-garzarelladavem330
authored andcommitted
vsock: add 'transport' member in the struct vsock_sock
As a preparation to support multiple transports, this patch adds the 'transport' member at the 'struct vsock_sock'. This new field is initialized during the creation in the __vsock_create() function. This patch also renames the global 'transport' pointer to 'transport_single', since for now we're only supporting a single transport registered at run-time. Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Jorgen Hansen <jhansen@vmware.com> Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 3603a2e commit fe502c4

File tree

2 files changed

+39
-18
lines changed

2 files changed

+39
-18
lines changed

include/net/af_vsock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ extern spinlock_t vsock_table_lock;
2727
struct vsock_sock {
2828
/* sk must be the first member. */
2929
struct sock sk;
30+
const struct vsock_transport *transport;
3031
struct sockaddr_vm local_addr;
3132
struct sockaddr_vm remote_addr;
3233
/* Links for the global tables of bound and connected sockets. */

net/vmw_vsock/af_vsock.c

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ static struct proto vsock_proto = {
126126
*/
127127
#define VSOCK_DEFAULT_CONNECT_TIMEOUT (2 * HZ)
128128

129-
static const struct vsock_transport *transport;
129+
static const struct vsock_transport *transport_single;
130130
static DEFINE_MUTEX(vsock_register_mutex);
131131

132132
/**** UTILS ****/
@@ -408,7 +408,9 @@ static bool vsock_is_pending(struct sock *sk)
408408

409409
static int vsock_send_shutdown(struct sock *sk, int mode)
410410
{
411-
return transport->shutdown(vsock_sk(sk), mode);
411+
struct vsock_sock *vsk = vsock_sk(sk);
412+
413+
return vsk->transport->shutdown(vsk, mode);
412414
}
413415

414416
static void vsock_pending_work(struct work_struct *work)
@@ -518,7 +520,7 @@ static int __vsock_bind_stream(struct vsock_sock *vsk,
518520
static int __vsock_bind_dgram(struct vsock_sock *vsk,
519521
struct sockaddr_vm *addr)
520522
{
521-
return transport->dgram_bind(vsk, addr);
523+
return vsk->transport->dgram_bind(vsk, addr);
522524
}
523525

524526
static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr)
@@ -536,7 +538,7 @@ static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr)
536538
* like AF_INET prevents binding to a non-local IP address (in most
537539
* cases), we only allow binding to the local CID.
538540
*/
539-
cid = transport->get_local_cid();
541+
cid = vsk->transport->get_local_cid();
540542
if (addr->svm_cid != cid && addr->svm_cid != VMADDR_CID_ANY)
541543
return -EADDRNOTAVAIL;
542544

@@ -586,6 +588,7 @@ struct sock *__vsock_create(struct net *net,
586588
sk->sk_type = type;
587589

588590
vsk = vsock_sk(sk);
591+
vsk->transport = transport_single;
589592
vsock_addr_init(&vsk->local_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY);
590593
vsock_addr_init(&vsk->remote_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY);
591594

@@ -616,7 +619,7 @@ struct sock *__vsock_create(struct net *net,
616619
vsk->connect_timeout = VSOCK_DEFAULT_CONNECT_TIMEOUT;
617620
}
618621

619-
if (transport->init(vsk, psk) < 0) {
622+
if (vsk->transport->init(vsk, psk) < 0) {
620623
sk_free(sk);
621624
return NULL;
622625
}
@@ -640,7 +643,7 @@ static void __vsock_release(struct sock *sk, int level)
640643
/* The release call is supposed to use lock_sock_nested()
641644
* rather than lock_sock(), if a sock lock should be acquired.
642645
*/
643-
transport->release(vsk);
646+
vsk->transport->release(vsk);
644647

645648
/* When "level" is SINGLE_DEPTH_NESTING, use the nested
646649
* version to avoid the warning "possible recursive locking
@@ -668,7 +671,7 @@ static void vsock_sk_destruct(struct sock *sk)
668671
{
669672
struct vsock_sock *vsk = vsock_sk(sk);
670673

671-
transport->destruct(vsk);
674+
vsk->transport->destruct(vsk);
672675

673676
/* When clearing these addresses, there's no need to set the family and
674677
* possibly register the address family with the kernel.
@@ -692,13 +695,13 @@ static int vsock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
692695

693696
s64 vsock_stream_has_data(struct vsock_sock *vsk)
694697
{
695-
return transport->stream_has_data(vsk);
698+
return vsk->transport->stream_has_data(vsk);
696699
}
697700
EXPORT_SYMBOL_GPL(vsock_stream_has_data);
698701

699702
s64 vsock_stream_has_space(struct vsock_sock *vsk)
700703
{
701-
return transport->stream_has_space(vsk);
704+
return vsk->transport->stream_has_space(vsk);
702705
}
703706
EXPORT_SYMBOL_GPL(vsock_stream_has_space);
704707

@@ -867,6 +870,7 @@ static __poll_t vsock_poll(struct file *file, struct socket *sock,
867870
mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
868871

869872
} else if (sock->type == SOCK_STREAM) {
873+
const struct vsock_transport *transport = vsk->transport;
870874
lock_sock(sk);
871875

872876
/* Listening sockets that have connections in their accept
@@ -942,6 +946,7 @@ static int vsock_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
942946
struct sock *sk;
943947
struct vsock_sock *vsk;
944948
struct sockaddr_vm *remote_addr;
949+
const struct vsock_transport *transport;
945950

946951
if (msg->msg_flags & MSG_OOB)
947952
return -EOPNOTSUPP;
@@ -950,6 +955,7 @@ static int vsock_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
950955
err = 0;
951956
sk = sock->sk;
952957
vsk = vsock_sk(sk);
958+
transport = vsk->transport;
953959

954960
lock_sock(sk);
955961

@@ -1034,8 +1040,8 @@ static int vsock_dgram_connect(struct socket *sock,
10341040
if (err)
10351041
goto out;
10361042

1037-
if (!transport->dgram_allow(remote_addr->svm_cid,
1038-
remote_addr->svm_port)) {
1043+
if (!vsk->transport->dgram_allow(remote_addr->svm_cid,
1044+
remote_addr->svm_port)) {
10391045
err = -EINVAL;
10401046
goto out;
10411047
}
@@ -1051,7 +1057,9 @@ static int vsock_dgram_connect(struct socket *sock,
10511057
static int vsock_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
10521058
size_t len, int flags)
10531059
{
1054-
return transport->dgram_dequeue(vsock_sk(sock->sk), msg, len, flags);
1060+
struct vsock_sock *vsk = vsock_sk(sock->sk);
1061+
1062+
return vsk->transport->dgram_dequeue(vsk, msg, len, flags);
10551063
}
10561064

10571065
static const struct proto_ops vsock_dgram_ops = {
@@ -1077,6 +1085,8 @@ static const struct proto_ops vsock_dgram_ops = {
10771085

10781086
static int vsock_transport_cancel_pkt(struct vsock_sock *vsk)
10791087
{
1088+
const struct vsock_transport *transport = vsk->transport;
1089+
10801090
if (!transport->cancel_pkt)
10811091
return -EOPNOTSUPP;
10821092

@@ -1113,13 +1123,15 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
11131123
int err;
11141124
struct sock *sk;
11151125
struct vsock_sock *vsk;
1126+
const struct vsock_transport *transport;
11161127
struct sockaddr_vm *remote_addr;
11171128
long timeout;
11181129
DEFINE_WAIT(wait);
11191130

11201131
err = 0;
11211132
sk = sock->sk;
11221133
vsk = vsock_sk(sk);
1134+
transport = vsk->transport;
11231135

11241136
lock_sock(sk);
11251137

@@ -1363,6 +1375,7 @@ static int vsock_stream_setsockopt(struct socket *sock,
13631375
int err;
13641376
struct sock *sk;
13651377
struct vsock_sock *vsk;
1378+
const struct vsock_transport *transport;
13661379
u64 val;
13671380

13681381
if (level != AF_VSOCK)
@@ -1383,6 +1396,7 @@ static int vsock_stream_setsockopt(struct socket *sock,
13831396
err = 0;
13841397
sk = sock->sk;
13851398
vsk = vsock_sk(sk);
1399+
transport = vsk->transport;
13861400

13871401
lock_sock(sk);
13881402

@@ -1440,6 +1454,7 @@ static int vsock_stream_getsockopt(struct socket *sock,
14401454
int len;
14411455
struct sock *sk;
14421456
struct vsock_sock *vsk;
1457+
const struct vsock_transport *transport;
14431458
u64 val;
14441459

14451460
if (level != AF_VSOCK)
@@ -1463,6 +1478,7 @@ static int vsock_stream_getsockopt(struct socket *sock,
14631478
err = 0;
14641479
sk = sock->sk;
14651480
vsk = vsock_sk(sk);
1481+
transport = vsk->transport;
14661482

14671483
switch (optname) {
14681484
case SO_VM_SOCKETS_BUFFER_SIZE:
@@ -1507,6 +1523,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
15071523
{
15081524
struct sock *sk;
15091525
struct vsock_sock *vsk;
1526+
const struct vsock_transport *transport;
15101527
ssize_t total_written;
15111528
long timeout;
15121529
int err;
@@ -1515,6 +1532,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
15151532

15161533
sk = sock->sk;
15171534
vsk = vsock_sk(sk);
1535+
transport = vsk->transport;
15181536
total_written = 0;
15191537
err = 0;
15201538

@@ -1646,6 +1664,7 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
16461664
{
16471665
struct sock *sk;
16481666
struct vsock_sock *vsk;
1667+
const struct vsock_transport *transport;
16491668
int err;
16501669
size_t target;
16511670
ssize_t copied;
@@ -1656,6 +1675,7 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
16561675

16571676
sk = sock->sk;
16581677
vsk = vsock_sk(sk);
1678+
transport = vsk->transport;
16591679
err = 0;
16601680

16611681
lock_sock(sk);
@@ -1870,7 +1890,7 @@ static long vsock_dev_do_ioctl(struct file *filp,
18701890

18711891
switch (cmd) {
18721892
case IOCTL_VM_SOCKETS_GET_LOCAL_CID:
1873-
if (put_user(transport->get_local_cid(), p) != 0)
1893+
if (put_user(transport_single->get_local_cid(), p) != 0)
18741894
retval = -EFAULT;
18751895
break;
18761896

@@ -1917,7 +1937,7 @@ int __vsock_core_init(const struct vsock_transport *t, struct module *owner)
19171937
if (err)
19181938
return err;
19191939

1920-
if (transport) {
1940+
if (transport_single) {
19211941
err = -EBUSY;
19221942
goto err_busy;
19231943
}
@@ -1926,7 +1946,7 @@ int __vsock_core_init(const struct vsock_transport *t, struct module *owner)
19261946
* unload while there are open sockets.
19271947
*/
19281948
vsock_proto.owner = owner;
1929-
transport = t;
1949+
transport_single = t;
19301950

19311951
vsock_device.minor = MISC_DYNAMIC_MINOR;
19321952
err = misc_register(&vsock_device);
@@ -1956,7 +1976,7 @@ int __vsock_core_init(const struct vsock_transport *t, struct module *owner)
19561976
err_deregister_misc:
19571977
misc_deregister(&vsock_device);
19581978
err_reset_transport:
1959-
transport = NULL;
1979+
transport_single = NULL;
19601980
err_busy:
19611981
mutex_unlock(&vsock_register_mutex);
19621982
return err;
@@ -1973,7 +1993,7 @@ void vsock_core_exit(void)
19731993

19741994
/* We do not want the assignment below re-ordered. */
19751995
mb();
1976-
transport = NULL;
1996+
transport_single = NULL;
19771997

19781998
mutex_unlock(&vsock_register_mutex);
19791999
}
@@ -1984,7 +2004,7 @@ const struct vsock_transport *vsock_core_get_transport(void)
19842004
/* vsock_register_mutex not taken since only the transport uses this
19852005
* function and only while registered.
19862006
*/
1987-
return transport;
2007+
return transport_single;
19882008
}
19892009
EXPORT_SYMBOL_GPL(vsock_core_get_transport);
19902010

0 commit comments

Comments
 (0)