forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
VSOCK: Introduce virtio_vsock_common.ko
This module contains the common code and header files for the following virtio_transporto and vhost_vsock kernel modules. Signed-off-by: Asias He <[email protected]> Signed-off-by: Claudio Imbrenda <[email protected]> Signed-off-by: Stefan Hajnoczi <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
- Loading branch information
Showing
8 changed files
with
1,398 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12138,6 +12138,16 @@ S: Maintained | |
F: drivers/media/v4l2-core/videobuf2-* | ||
F: include/media/videobuf2-* | ||
|
||
VIRTIO AND VHOST VSOCK DRIVER | ||
M: Stefan Hajnoczi <[email protected]> | ||
L: [email protected] | ||
L: [email protected] | ||
L: [email protected] | ||
S: Maintained | ||
F: include/linux/virtio_vsock.h | ||
F: include/uapi/linux/virtio_vsock.h | ||
F: net/vmw_vsock/virtio_transport_common.c | ||
|
||
VIRTUAL SERIO DEVICE DRIVER | ||
M: Stephen Chandler Paul <[email protected]> | ||
S: Maintained | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
#ifndef _LINUX_VIRTIO_VSOCK_H | ||
#define _LINUX_VIRTIO_VSOCK_H | ||
|
||
#include <uapi/linux/virtio_vsock.h> | ||
#include <linux/socket.h> | ||
#include <net/sock.h> | ||
#include <net/af_vsock.h> | ||
|
||
#define VIRTIO_VSOCK_DEFAULT_MIN_BUF_SIZE 128 | ||
#define VIRTIO_VSOCK_DEFAULT_BUF_SIZE (1024 * 256) | ||
#define VIRTIO_VSOCK_DEFAULT_MAX_BUF_SIZE (1024 * 256) | ||
#define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE (1024 * 4) | ||
#define VIRTIO_VSOCK_MAX_BUF_SIZE 0xFFFFFFFFUL | ||
#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE (1024 * 64) | ||
|
||
enum { | ||
VSOCK_VQ_RX = 0, /* for host to guest data */ | ||
VSOCK_VQ_TX = 1, /* for guest to host data */ | ||
VSOCK_VQ_EVENT = 2, | ||
VSOCK_VQ_MAX = 3, | ||
}; | ||
|
||
/* Per-socket state (accessed via vsk->trans) */ | ||
struct virtio_vsock_sock { | ||
struct vsock_sock *vsk; | ||
|
||
/* Protected by lock_sock(sk_vsock(trans->vsk)) */ | ||
u32 buf_size; | ||
u32 buf_size_min; | ||
u32 buf_size_max; | ||
|
||
spinlock_t tx_lock; | ||
spinlock_t rx_lock; | ||
|
||
/* Protected by tx_lock */ | ||
u32 tx_cnt; | ||
u32 buf_alloc; | ||
u32 peer_fwd_cnt; | ||
u32 peer_buf_alloc; | ||
|
||
/* Protected by rx_lock */ | ||
u32 fwd_cnt; | ||
u32 rx_bytes; | ||
struct list_head rx_queue; | ||
}; | ||
|
||
struct virtio_vsock_pkt { | ||
struct virtio_vsock_hdr hdr; | ||
struct work_struct work; | ||
struct list_head list; | ||
void *buf; | ||
u32 len; | ||
u32 off; | ||
bool reply; | ||
}; | ||
|
||
struct virtio_vsock_pkt_info { | ||
u32 remote_cid, remote_port; | ||
struct msghdr *msg; | ||
u32 pkt_len; | ||
u16 type; | ||
u16 op; | ||
u32 flags; | ||
bool reply; | ||
}; | ||
|
||
struct virtio_transport { | ||
/* This must be the first field */ | ||
struct vsock_transport transport; | ||
|
||
/* Takes ownership of the packet */ | ||
int (*send_pkt)(struct virtio_vsock_pkt *pkt); | ||
}; | ||
|
||
ssize_t | ||
virtio_transport_stream_dequeue(struct vsock_sock *vsk, | ||
struct msghdr *msg, | ||
size_t len, | ||
int type); | ||
int | ||
virtio_transport_dgram_dequeue(struct vsock_sock *vsk, | ||
struct msghdr *msg, | ||
size_t len, int flags); | ||
|
||
s64 virtio_transport_stream_has_data(struct vsock_sock *vsk); | ||
s64 virtio_transport_stream_has_space(struct vsock_sock *vsk); | ||
|
||
int virtio_transport_do_socket_init(struct vsock_sock *vsk, | ||
struct vsock_sock *psk); | ||
u64 virtio_transport_get_buffer_size(struct vsock_sock *vsk); | ||
u64 virtio_transport_get_min_buffer_size(struct vsock_sock *vsk); | ||
u64 virtio_transport_get_max_buffer_size(struct vsock_sock *vsk); | ||
void virtio_transport_set_buffer_size(struct vsock_sock *vsk, u64 val); | ||
void virtio_transport_set_min_buffer_size(struct vsock_sock *vsk, u64 val); | ||
void virtio_transport_set_max_buffer_size(struct vsock_sock *vs, u64 val); | ||
int | ||
virtio_transport_notify_poll_in(struct vsock_sock *vsk, | ||
size_t target, | ||
bool *data_ready_now); | ||
int | ||
virtio_transport_notify_poll_out(struct vsock_sock *vsk, | ||
size_t target, | ||
bool *space_available_now); | ||
|
||
int virtio_transport_notify_recv_init(struct vsock_sock *vsk, | ||
size_t target, struct vsock_transport_recv_notify_data *data); | ||
int virtio_transport_notify_recv_pre_block(struct vsock_sock *vsk, | ||
size_t target, struct vsock_transport_recv_notify_data *data); | ||
int virtio_transport_notify_recv_pre_dequeue(struct vsock_sock *vsk, | ||
size_t target, struct vsock_transport_recv_notify_data *data); | ||
int virtio_transport_notify_recv_post_dequeue(struct vsock_sock *vsk, | ||
size_t target, ssize_t copied, bool data_read, | ||
struct vsock_transport_recv_notify_data *data); | ||
int virtio_transport_notify_send_init(struct vsock_sock *vsk, | ||
struct vsock_transport_send_notify_data *data); | ||
int virtio_transport_notify_send_pre_block(struct vsock_sock *vsk, | ||
struct vsock_transport_send_notify_data *data); | ||
int virtio_transport_notify_send_pre_enqueue(struct vsock_sock *vsk, | ||
struct vsock_transport_send_notify_data *data); | ||
int virtio_transport_notify_send_post_enqueue(struct vsock_sock *vsk, | ||
ssize_t written, struct vsock_transport_send_notify_data *data); | ||
|
||
u64 virtio_transport_stream_rcvhiwat(struct vsock_sock *vsk); | ||
bool virtio_transport_stream_is_active(struct vsock_sock *vsk); | ||
bool virtio_transport_stream_allow(u32 cid, u32 port); | ||
int virtio_transport_dgram_bind(struct vsock_sock *vsk, | ||
struct sockaddr_vm *addr); | ||
bool virtio_transport_dgram_allow(u32 cid, u32 port); | ||
|
||
int virtio_transport_connect(struct vsock_sock *vsk); | ||
|
||
int virtio_transport_shutdown(struct vsock_sock *vsk, int mode); | ||
|
||
void virtio_transport_release(struct vsock_sock *vsk); | ||
|
||
ssize_t | ||
virtio_transport_stream_enqueue(struct vsock_sock *vsk, | ||
struct msghdr *msg, | ||
size_t len); | ||
int | ||
virtio_transport_dgram_enqueue(struct vsock_sock *vsk, | ||
struct sockaddr_vm *remote_addr, | ||
struct msghdr *msg, | ||
size_t len); | ||
|
||
void virtio_transport_destruct(struct vsock_sock *vsk); | ||
|
||
void virtio_transport_recv_pkt(struct virtio_vsock_pkt *pkt); | ||
void virtio_transport_free_pkt(struct virtio_vsock_pkt *pkt); | ||
void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct virtio_vsock_pkt *pkt); | ||
u32 virtio_transport_get_credit(struct virtio_vsock_sock *vvs, u32 wanted); | ||
void virtio_transport_put_credit(struct virtio_vsock_sock *vvs, u32 credit); | ||
|
||
#endif /* _LINUX_VIRTIO_VSOCK_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
#undef TRACE_SYSTEM | ||
#define TRACE_SYSTEM vsock | ||
|
||
#if !defined(_TRACE_VSOCK_VIRTIO_TRANSPORT_COMMON_H) || \ | ||
defined(TRACE_HEADER_MULTI_READ) | ||
#define _TRACE_VSOCK_VIRTIO_TRANSPORT_COMMON_H | ||
|
||
#include <linux/tracepoint.h> | ||
|
||
TRACE_DEFINE_ENUM(VIRTIO_VSOCK_TYPE_STREAM); | ||
|
||
#define show_type(val) \ | ||
__print_symbolic(val, { VIRTIO_VSOCK_TYPE_STREAM, "STREAM" }) | ||
|
||
TRACE_DEFINE_ENUM(VIRTIO_VSOCK_OP_INVALID); | ||
TRACE_DEFINE_ENUM(VIRTIO_VSOCK_OP_REQUEST); | ||
TRACE_DEFINE_ENUM(VIRTIO_VSOCK_OP_RESPONSE); | ||
TRACE_DEFINE_ENUM(VIRTIO_VSOCK_OP_RST); | ||
TRACE_DEFINE_ENUM(VIRTIO_VSOCK_OP_SHUTDOWN); | ||
TRACE_DEFINE_ENUM(VIRTIO_VSOCK_OP_RW); | ||
TRACE_DEFINE_ENUM(VIRTIO_VSOCK_OP_CREDIT_UPDATE); | ||
TRACE_DEFINE_ENUM(VIRTIO_VSOCK_OP_CREDIT_REQUEST); | ||
|
||
#define show_op(val) \ | ||
__print_symbolic(val, \ | ||
{ VIRTIO_VSOCK_OP_INVALID, "INVALID" }, \ | ||
{ VIRTIO_VSOCK_OP_REQUEST, "REQUEST" }, \ | ||
{ VIRTIO_VSOCK_OP_RESPONSE, "RESPONSE" }, \ | ||
{ VIRTIO_VSOCK_OP_RST, "RST" }, \ | ||
{ VIRTIO_VSOCK_OP_SHUTDOWN, "SHUTDOWN" }, \ | ||
{ VIRTIO_VSOCK_OP_RW, "RW" }, \ | ||
{ VIRTIO_VSOCK_OP_CREDIT_UPDATE, "CREDIT_UPDATE" }, \ | ||
{ VIRTIO_VSOCK_OP_CREDIT_REQUEST, "CREDIT_REQUEST" }) | ||
|
||
TRACE_EVENT(virtio_transport_alloc_pkt, | ||
TP_PROTO( | ||
__u32 src_cid, __u32 src_port, | ||
__u32 dst_cid, __u32 dst_port, | ||
__u32 len, | ||
__u16 type, | ||
__u16 op, | ||
__u32 flags | ||
), | ||
TP_ARGS( | ||
src_cid, src_port, | ||
dst_cid, dst_port, | ||
len, | ||
type, | ||
op, | ||
flags | ||
), | ||
TP_STRUCT__entry( | ||
__field(__u32, src_cid) | ||
__field(__u32, src_port) | ||
__field(__u32, dst_cid) | ||
__field(__u32, dst_port) | ||
__field(__u32, len) | ||
__field(__u16, type) | ||
__field(__u16, op) | ||
__field(__u32, flags) | ||
), | ||
TP_fast_assign( | ||
__entry->src_cid = src_cid; | ||
__entry->src_port = src_port; | ||
__entry->dst_cid = dst_cid; | ||
__entry->dst_port = dst_port; | ||
__entry->len = len; | ||
__entry->type = type; | ||
__entry->op = op; | ||
__entry->flags = flags; | ||
), | ||
TP_printk("%u:%u -> %u:%u len=%u type=%s op=%s flags=%#x", | ||
__entry->src_cid, __entry->src_port, | ||
__entry->dst_cid, __entry->dst_port, | ||
__entry->len, | ||
show_type(__entry->type), | ||
show_op(__entry->op), | ||
__entry->flags) | ||
); | ||
|
||
TRACE_EVENT(virtio_transport_recv_pkt, | ||
TP_PROTO( | ||
__u32 src_cid, __u32 src_port, | ||
__u32 dst_cid, __u32 dst_port, | ||
__u32 len, | ||
__u16 type, | ||
__u16 op, | ||
__u32 flags, | ||
__u32 buf_alloc, | ||
__u32 fwd_cnt | ||
), | ||
TP_ARGS( | ||
src_cid, src_port, | ||
dst_cid, dst_port, | ||
len, | ||
type, | ||
op, | ||
flags, | ||
buf_alloc, | ||
fwd_cnt | ||
), | ||
TP_STRUCT__entry( | ||
__field(__u32, src_cid) | ||
__field(__u32, src_port) | ||
__field(__u32, dst_cid) | ||
__field(__u32, dst_port) | ||
__field(__u32, len) | ||
__field(__u16, type) | ||
__field(__u16, op) | ||
__field(__u32, flags) | ||
__field(__u32, buf_alloc) | ||
__field(__u32, fwd_cnt) | ||
), | ||
TP_fast_assign( | ||
__entry->src_cid = src_cid; | ||
__entry->src_port = src_port; | ||
__entry->dst_cid = dst_cid; | ||
__entry->dst_port = dst_port; | ||
__entry->len = len; | ||
__entry->type = type; | ||
__entry->op = op; | ||
__entry->flags = flags; | ||
__entry->buf_alloc = buf_alloc; | ||
__entry->fwd_cnt = fwd_cnt; | ||
), | ||
TP_printk("%u:%u -> %u:%u len=%u type=%s op=%s flags=%#x " | ||
"buf_alloc=%u fwd_cnt=%u", | ||
__entry->src_cid, __entry->src_port, | ||
__entry->dst_cid, __entry->dst_port, | ||
__entry->len, | ||
show_type(__entry->type), | ||
show_op(__entry->op), | ||
__entry->flags, | ||
__entry->buf_alloc, | ||
__entry->fwd_cnt) | ||
); | ||
|
||
#endif /* _TRACE_VSOCK_VIRTIO_TRANSPORT_COMMON_H */ | ||
|
||
#undef TRACE_INCLUDE_FILE | ||
#define TRACE_INCLUDE_FILE vsock_virtio_transport_common | ||
|
||
/* This part must be outside protection */ | ||
#include <trace/define_trace.h> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.