include/linux/virtio_vsock.h

Source file repositories/reference/linux-study-clean/include/linux/virtio_vsock.h

File Facts

System
Linux kernel
Corpus path
include/linux/virtio_vsock.h
Extension
.h
Size
8627 bytes
Lines
293
Domain
Core OS
Bucket
Core Kernel Interface
Inferred role
Core OS: implementation source
Status
source implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

struct virtio_vsock_skb_cb {
	bool reply;
	bool tap_delivered;
	u32 offset;
};

#define VIRTIO_VSOCK_SKB_CB(skb) ((struct virtio_vsock_skb_cb *)((skb)->cb))

static inline struct virtio_vsock_hdr *virtio_vsock_hdr(struct sk_buff *skb)
{
	return (struct virtio_vsock_hdr *)skb->head;
}

static inline bool virtio_vsock_skb_reply(struct sk_buff *skb)
{
	return VIRTIO_VSOCK_SKB_CB(skb)->reply;
}

static inline void virtio_vsock_skb_set_reply(struct sk_buff *skb)
{
	VIRTIO_VSOCK_SKB_CB(skb)->reply = true;
}

static inline bool virtio_vsock_skb_tap_delivered(struct sk_buff *skb)
{
	return VIRTIO_VSOCK_SKB_CB(skb)->tap_delivered;
}

static inline void virtio_vsock_skb_set_tap_delivered(struct sk_buff *skb)
{
	VIRTIO_VSOCK_SKB_CB(skb)->tap_delivered = true;
}

static inline void virtio_vsock_skb_clear_tap_delivered(struct sk_buff *skb)
{
	VIRTIO_VSOCK_SKB_CB(skb)->tap_delivered = false;
}

static inline void virtio_vsock_skb_put(struct sk_buff *skb, u32 len)
{
	DEBUG_NET_WARN_ON_ONCE(skb->len);

	if (skb_is_nonlinear(skb))
		skb->len = len;
	else
		skb_put(skb, len);
}

static inline struct sk_buff *
__virtio_vsock_alloc_skb_with_frags(unsigned int header_len,
				    unsigned int data_len,
				    gfp_t mask)
{
	struct sk_buff *skb;
	int err;

	skb = alloc_skb_with_frags(header_len, data_len,
				   PAGE_ALLOC_COSTLY_ORDER, &err, mask);
	if (!skb)
		return NULL;

	skb_reserve(skb, VIRTIO_VSOCK_SKB_HEADROOM);
	skb->data_len = data_len;
	return skb;
}

static inline struct sk_buff *
virtio_vsock_alloc_linear_skb(unsigned int size, gfp_t mask)
{
	return __virtio_vsock_alloc_skb_with_frags(size, 0, mask);
}

static inline struct sk_buff *virtio_vsock_alloc_skb(unsigned int size, gfp_t mask)
{
	if (size <= SKB_WITH_OVERHEAD(PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
		return virtio_vsock_alloc_linear_skb(size, mask);

	size -= VIRTIO_VSOCK_SKB_HEADROOM;
	return __virtio_vsock_alloc_skb_with_frags(VIRTIO_VSOCK_SKB_HEADROOM,
						   size, mask);
}

static inline void
virtio_vsock_skb_queue_head(struct sk_buff_head *list, struct sk_buff *skb)
{
	spin_lock_bh(&list->lock);
	__skb_queue_head(list, skb);
	spin_unlock_bh(&list->lock);
}

Annotation

Implementation Notes