diff --git a/alpine/kernel/patches/0001-virtio-make-find_vqs-checkpatch.pl-friendly.patch b/alpine/kernel/patches/0001-virtio-make-find_vqs-checkpatch.pl-friendly.patch index 4d64fbd8c..1f134a23a 100644 --- a/alpine/kernel/patches/0001-virtio-make-find_vqs-checkpatch.pl-friendly.patch +++ b/alpine/kernel/patches/0001-virtio-make-find_vqs-checkpatch.pl-friendly.patch @@ -1,7 +1,7 @@ -From 4c251c111a65c8eef8e4dcf0b7326ef7761f6ab9 Mon Sep 17 00:00:00 2001 +From 0d67af6648f600656eb20cb2ca1d35cb0985e9bd Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Thu, 17 Dec 2015 16:53:43 +0800 -Subject: [PATCH 01/40] virtio: make find_vqs() checkpatch.pl-friendly +Subject: [PATCH 01/46] virtio: make find_vqs() checkpatch.pl-friendly checkpatch.pl wants arrays of strings declared as follows: @@ -115,10 +115,10 @@ index 1b83159..bf2d130 100644 struct virtio_ccw_device *vcdev = to_vc_device(vdev); unsigned long *indicatorp = NULL; diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c -index 7d3e5d0..0c3691f 100644 +index 56f7e25..66082c9 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c -@@ -388,7 +388,7 @@ static int init_vqs(struct virtio_balloon *vb) +@@ -394,7 +394,7 @@ static int init_vqs(struct virtio_balloon *vb) { struct virtqueue *vqs[3]; vq_callback_t *callbacks[] = { balloon_ack, balloon_ack, stats_request }; @@ -215,5 +215,5 @@ index e5ce8ab..6e6cb0c 100644 u64 (*get_features)(struct virtio_device *vdev); int (*finalize_features)(struct virtio_device *vdev); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0002-VSOCK-constify-vmci_transport_notify_ops-structures.patch b/alpine/kernel/patches/0002-VSOCK-constify-vmci_transport_notify_ops-structures.patch index a853c3b3d..62df5db6d 100644 --- a/alpine/kernel/patches/0002-VSOCK-constify-vmci_transport_notify_ops-structures.patch +++ b/alpine/kernel/patches/0002-VSOCK-constify-vmci_transport_notify_ops-structures.patch @@ -1,7 +1,7 @@ -From 514c41f6df542ae7b259f5d6aefea4af508fac94 Mon Sep 17 00:00:00 2001 +From f1e0be6f17679e7f532989bae3290bb4ed3ba773 Mon Sep 17 00:00:00 2001 From: Julia Lawall Date: Sat, 21 Nov 2015 18:39:17 +0100 -Subject: [PATCH 02/40] VSOCK: constify vmci_transport_notify_ops structures +Subject: [PATCH 02/46] VSOCK: constify vmci_transport_notify_ops structures The vmci_transport_notify_ops structures are never modified, so declare them as const. @@ -73,5 +73,5 @@ index dc9c792..21e591d 100644 vmci_transport_notify_pkt_socket_destruct, vmci_transport_notify_pkt_poll_in, -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0003-AF_VSOCK-Shrink-the-area-influenced-by-prepare_to_wa.patch b/alpine/kernel/patches/0003-AF_VSOCK-Shrink-the-area-influenced-by-prepare_to_wa.patch index c69a8e09b..e544661d5 100644 --- a/alpine/kernel/patches/0003-AF_VSOCK-Shrink-the-area-influenced-by-prepare_to_wa.patch +++ b/alpine/kernel/patches/0003-AF_VSOCK-Shrink-the-area-influenced-by-prepare_to_wa.patch @@ -1,7 +1,7 @@ -From e91f4552f7a858fa44418e1996e21b3098683de4 Mon Sep 17 00:00:00 2001 +From bc63a861a8379269f4a51fdaac3d40f9161aea4d Mon Sep 17 00:00:00 2001 From: Claudio Imbrenda Date: Tue, 22 Mar 2016 17:05:52 +0100 -Subject: [PATCH 03/40] AF_VSOCK: Shrink the area influenced by prepare_to_wait +Subject: [PATCH 03/46] AF_VSOCK: Shrink the area influenced by prepare_to_wait When a thread is prepared for waiting by calling prepare_to_wait, sleeping is not allowed until either the wait has taken place or finish_wait has @@ -332,5 +332,5 @@ index 9b5bd6d..b5f1221 100644 release_sock(sk); return err; -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0041-VSOCK-make-listener-child-lock-ordering-explicit.patch b/alpine/kernel/patches/0004-vsock-make-listener-child-lock-ordering-explicit.patch similarity index 89% rename from alpine/kernel/patches/0041-VSOCK-make-listener-child-lock-ordering-explicit.patch rename to alpine/kernel/patches/0004-vsock-make-listener-child-lock-ordering-explicit.patch index b8e9bc33a..6c8795231 100644 --- a/alpine/kernel/patches/0041-VSOCK-make-listener-child-lock-ordering-explicit.patch +++ b/alpine/kernel/patches/0004-vsock-make-listener-child-lock-ordering-explicit.patch @@ -1,7 +1,7 @@ -From 4192f672fae559f32d82de72a677701853cc98a7 Mon Sep 17 00:00:00 2001 +From c1bc13ebe28532f99cb6b8edaa57a6aa61adbe58 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Thu, 23 Jun 2016 16:28:58 +0100 -Subject: [PATCH] vsock: make listener child lock ordering explicit +Subject: [PATCH 04/46] vsock: make listener child lock ordering explicit There are several places where the listener and pending or accept queue child sockets are accessed at the same time. Lockdep is unhappy that @@ -16,12 +16,13 @@ covered the vsock_pending_work() function. Suggested-by: Claudio Imbrenda Signed-off-by: Stefan Hajnoczi Signed-off-by: David S. Miller +(cherry picked from commit 4192f672fae559f32d82de72a677701853cc98a7) --- net/vmw_vsock/af_vsock.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c -index b5f1221..b96ac918 100644 +index b5f1221..b96ac91 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -61,6 +61,14 @@ @@ -57,3 +58,6 @@ index b5f1221..b96ac918 100644 vconnected = vsock_sk(connected); /* If the listener socket has received an error, then we should +-- +2.9.3 + diff --git a/alpine/kernel/patches/0004-VSOCK-transport-specific-vsock_transport-functions.patch b/alpine/kernel/patches/0005-VSOCK-transport-specific-vsock_transport-functions.patch similarity index 81% rename from alpine/kernel/patches/0004-VSOCK-transport-specific-vsock_transport-functions.patch rename to alpine/kernel/patches/0005-VSOCK-transport-specific-vsock_transport-functions.patch index 7a90d01c4..d9c50bdbe 100644 --- a/alpine/kernel/patches/0004-VSOCK-transport-specific-vsock_transport-functions.patch +++ b/alpine/kernel/patches/0005-VSOCK-transport-specific-vsock_transport-functions.patch @@ -1,7 +1,7 @@ -From c2ec5f1e2aa8784acadbaf9f625d8ca516c81c6b Mon Sep 17 00:00:00 2001 +From 3351d8e1a0e52529aea4b5c3ce0c2ef3ad43ee17 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi -Date: Thu, 17 Dec 2015 11:10:21 +0800 -Subject: [PATCH 04/40] VSOCK: transport-specific vsock_transport functions +Date: Thu, 28 Jul 2016 15:36:30 +0100 +Subject: [PATCH 05/46] VSOCK: transport-specific vsock_transport functions struct vsock_transport contains function pointers called by AF_VSOCK core code. The transport may want its own transport-specific function @@ -13,7 +13,8 @@ access transport-specific function pointers. The virtio transport will use this. Signed-off-by: Stefan Hajnoczi -(cherry picked from commit 7740f7aafc9e6f415e8b6d5e8421deae63033b8d) +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 0b01aeb3d2fbf16787f0c9629f4ca52ae792f732) --- include/net/af_vsock.h | 3 +++ net/vmw_vsock/af_vsock.c | 9 +++++++++ @@ -34,10 +35,10 @@ index e9eb2d6..23f5525 100644 void vsock_release_pending(struct sock *pending); diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c -index b5f1221..15f9595 100644 +index b96ac91..e34d96f 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c -@@ -1987,6 +1987,15 @@ void vsock_core_exit(void) +@@ -1995,6 +1995,15 @@ void vsock_core_exit(void) } EXPORT_SYMBOL_GPL(vsock_core_exit); @@ -54,5 +55,5 @@ index b5f1221..15f9595 100644 MODULE_DESCRIPTION("VMware Virtual Socket Family"); MODULE_VERSION("1.0.1.0-k"); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0006-VSOCK-defer-sock-removal-to-transports.patch b/alpine/kernel/patches/0006-VSOCK-defer-sock-removal-to-transports.patch new file mode 100644 index 000000000..1e2144489 --- /dev/null +++ b/alpine/kernel/patches/0006-VSOCK-defer-sock-removal-to-transports.patch @@ -0,0 +1,83 @@ +From 54f528a28ab97e1306180adde7ba15c4158428db Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Thu, 28 Jul 2016 15:36:31 +0100 +Subject: [PATCH 06/46] VSOCK: defer sock removal to transports + +The virtio transport will implement graceful shutdown and the related +SO_LINGER socket option. This requires orphaning the sock but keeping +it in the table of connections after .release(). + +This patch adds the vsock_remove_sock() function and leaves it up to the +transport when to remove the sock. + +Signed-off-by: Stefan Hajnoczi +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 6773b7dc39f165bd9d824b50ac52cbb3f87d53c8) +--- + include/net/af_vsock.h | 1 + + net/vmw_vsock/af_vsock.c | 16 ++++++++++------ + net/vmw_vsock/vmci_transport.c | 2 ++ + 3 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h +index 23f5525..3af0b22 100644 +--- a/include/net/af_vsock.h ++++ b/include/net/af_vsock.h +@@ -180,6 +180,7 @@ void vsock_remove_connected(struct vsock_sock *vsk); + struct sock *vsock_find_bound_socket(struct sockaddr_vm *addr); + struct sock *vsock_find_connected_socket(struct sockaddr_vm *src, + struct sockaddr_vm *dst); ++void vsock_remove_sock(struct vsock_sock *vsk); + void vsock_for_each_connected_socket(void (*fn)(struct sock *sk)); + + #endif /* __AF_VSOCK_H__ */ +diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c +index e34d96f..17dbbe6 100644 +--- a/net/vmw_vsock/af_vsock.c ++++ b/net/vmw_vsock/af_vsock.c +@@ -344,6 +344,16 @@ static bool vsock_in_connected_table(struct vsock_sock *vsk) + return ret; + } + ++void vsock_remove_sock(struct vsock_sock *vsk) ++{ ++ if (vsock_in_bound_table(vsk)) ++ vsock_remove_bound(vsk); ++ ++ if (vsock_in_connected_table(vsk)) ++ vsock_remove_connected(vsk); ++} ++EXPORT_SYMBOL_GPL(vsock_remove_sock); ++ + void vsock_for_each_connected_socket(void (*fn)(struct sock *sk)) + { + int i; +@@ -660,12 +670,6 @@ static void __vsock_release(struct sock *sk) + vsk = vsock_sk(sk); + pending = NULL; /* Compiler warning. */ + +- if (vsock_in_bound_table(vsk)) +- vsock_remove_bound(vsk); +- +- if (vsock_in_connected_table(vsk)) +- vsock_remove_connected(vsk); +- + transport->release(vsk); + + lock_sock(sk); +diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c +index 0a369bb..706991e 100644 +--- a/net/vmw_vsock/vmci_transport.c ++++ b/net/vmw_vsock/vmci_transport.c +@@ -1644,6 +1644,8 @@ static void vmci_transport_destruct(struct vsock_sock *vsk) + + static void vmci_transport_release(struct vsock_sock *vsk) + { ++ vsock_remove_sock(vsk); ++ + if (!vmci_handle_is_invalid(vmci_trans(vsk)->dg_handle)) { + vmci_datagram_destroy_handle(vmci_trans(vsk)->dg_handle); + vmci_trans(vsk)->dg_handle = VMCI_INVALID_HANDLE; +-- +2.9.3 + diff --git a/alpine/kernel/patches/0005-VSOCK-Introduce-virtio_vsock_common.ko.patch b/alpine/kernel/patches/0007-VSOCK-Introduce-virtio_vsock_common.ko.patch similarity index 80% rename from alpine/kernel/patches/0005-VSOCK-Introduce-virtio_vsock_common.ko.patch rename to alpine/kernel/patches/0007-VSOCK-Introduce-virtio_vsock_common.ko.patch index 4bbefaea7..381bf1eff 100644 --- a/alpine/kernel/patches/0005-VSOCK-Introduce-virtio_vsock_common.ko.patch +++ b/alpine/kernel/patches/0007-VSOCK-Introduce-virtio_vsock_common.ko.patch @@ -1,31 +1,36 @@ -From c3d222b1921fc5c9a6d10b2d2f2b0141fcc0741e Mon Sep 17 00:00:00 2001 +From ec54f262b84f327f1c0ecabce6f0c9b5c75ff2df Mon Sep 17 00:00:00 2001 From: Asias He -Date: Thu, 13 Jun 2013 18:27:00 +0800 -Subject: [PATCH 05/40] VSOCK: Introduce virtio_vsock_common.ko +Date: Thu, 28 Jul 2016 15:36:32 +0100 +Subject: [PATCH 07/46] 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 +Signed-off-by: Claudio Imbrenda Signed-off-by: Stefan Hajnoczi +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 06a8fc78367d070720af960dcecec917d3ae5f3b) --- MAINTAINERS | 10 + - include/linux/virtio_vsock.h | 167 ++++ - .../trace/events/vsock_virtio_transport_common.h | 144 ++++ + include/linux/virtio_vsock.h | 154 ++++ + include/net/af_vsock.h | 2 + + .../trace/events/vsock_virtio_transport_common.h | 144 +++ + include/uapi/linux/Kbuild | 1 + include/uapi/linux/virtio_ids.h | 1 + - include/uapi/linux/virtio_vsock.h | 94 +++ - net/vmw_vsock/virtio_transport_common.c | 838 +++++++++++++++++++++ - 6 files changed, 1254 insertions(+) + include/uapi/linux/virtio_vsock.h | 94 ++ + net/vmw_vsock/virtio_transport_common.c | 992 +++++++++++++++++++++ + 8 files changed, 1398 insertions(+) create mode 100644 include/linux/virtio_vsock.h create mode 100644 include/trace/events/vsock_virtio_transport_common.h create mode 100644 include/uapi/linux/virtio_vsock.h create mode 100644 net/vmw_vsock/virtio_transport_common.c diff --git a/MAINTAINERS b/MAINTAINERS -index ab65bbe..b93ba8b 100644 +index 48bd523..3e60f59 100644 --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -11382,6 +11382,16 @@ S: Maintained +@@ -11395,6 +11395,16 @@ S: Maintained F: drivers/media/v4l2-core/videobuf2-* F: include/media/videobuf2-* @@ -44,10 +49,10 @@ index ab65bbe..b93ba8b 100644 S: Maintained diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h new file mode 100644 -index 0000000..4c3d8e6 +index 0000000..9638bfe --- /dev/null +++ b/include/linux/virtio_vsock.h -@@ -0,0 +1,167 @@ +@@ -0,0 +1,154 @@ +#ifndef _LINUX_VIRTIO_VSOCK_H +#define _LINUX_VIRTIO_VSOCK_H + @@ -62,8 +67,6 @@ index 0000000..4c3d8e6 +#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) -+#define VIRTIO_VSOCK_MAX_TX_BUF_SIZE (1024 * 1024 * 16) -+#define VIRTIO_VSOCK_MAX_DGRAM_SIZE (1024 * 64) + +enum { + VSOCK_VQ_RX = 0, /* for host to guest data */ @@ -81,8 +84,8 @@ index 0000000..4c3d8e6 + u32 buf_size_min; + u32 buf_size_max; + -+ struct mutex tx_lock; -+ struct mutex rx_lock; ++ spinlock_t tx_lock; ++ spinlock_t rx_lock; + + /* Protected by tx_lock */ + u32 tx_cnt; @@ -103,6 +106,7 @@ index 0000000..4c3d8e6 + void *buf; + u32 len; + u32 off; ++ bool reply; +}; + +struct virtio_vsock_pkt_info { @@ -112,29 +116,17 @@ index 0000000..4c3d8e6 + u16 type; + u16 op; + u32 flags; ++ bool reply; +}; + +struct virtio_transport { + /* This must be the first field */ + struct vsock_transport transport; + -+ /* Send packet for a specific socket */ -+ int (*send_pkt)(struct vsock_sock *vsk, -+ struct virtio_vsock_pkt_info *info); -+ -+ /* Send packet without a socket (e.g. RST). Prefer send_pkt() over -+ * send_pkt_no_sock() when a socket exists. -+ */ -+ int (*send_pkt_no_sock)(struct virtio_vsock_pkt *pkt); ++ /* Takes ownership of the packet */ ++ int (*send_pkt)(struct virtio_vsock_pkt *pkt); +}; + -+struct virtio_vsock_pkt * -+virtio_transport_alloc_pkt(struct virtio_vsock_pkt_info *info, -+ size_t len, -+ u32 src_cid, -+ u32 src_port, -+ u32 dst_cid, -+ u32 dst_port); +ssize_t +virtio_transport_stream_dequeue(struct vsock_sock *vsk, + struct msghdr *msg, @@ -215,6 +207,19 @@ index 0000000..4c3d8e6 +void virtio_transport_put_credit(struct virtio_vsock_sock *vvs, u32 credit); + +#endif /* _LINUX_VIRTIO_VSOCK_H */ +diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h +index 3af0b22..f275896 100644 +--- a/include/net/af_vsock.h ++++ b/include/net/af_vsock.h +@@ -63,6 +63,8 @@ struct vsock_sock { + struct list_head accept_queue; + bool rejected; + struct delayed_work dwork; ++ struct delayed_work close_work; ++ bool close_work_scheduled; + u32 peer_shutdown; + bool sent_request; + bool ignore_connecting_rst; diff --git a/include/trace/events/vsock_virtio_transport_common.h b/include/trace/events/vsock_virtio_transport_common.h new file mode 100644 index 0000000..b7f1d62 @@ -365,6 +370,18 @@ index 0000000..b7f1d62 + +/* This part must be outside protection */ +#include +diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild +index 32152e7..c830e9f 100644 +--- a/include/uapi/linux/Kbuild ++++ b/include/uapi/linux/Kbuild +@@ -448,6 +448,7 @@ header-y += virtio_ring.h + header-y += virtio_rng.h + header-y += virtio_scsi.h + header-y += virtio_types.h ++header-y += virtio_vsock.h + header-y += vm_sockets.h + header-y += vt.h + header-y += wait.h diff --git a/include/uapi/linux/virtio_ids.h b/include/uapi/linux/virtio_ids.h index 77925f5..3228d58 100644 --- a/include/uapi/linux/virtio_ids.h @@ -378,7 +395,7 @@ index 77925f5..3228d58 100644 #endif /* _LINUX_VIRTIO_IDS_H */ diff --git a/include/uapi/linux/virtio_vsock.h b/include/uapi/linux/virtio_vsock.h new file mode 100644 -index 0000000..12946ab +index 0000000..6b011c1 --- /dev/null +++ b/include/uapi/linux/virtio_vsock.h @@ -0,0 +1,94 @@ @@ -423,8 +440,8 @@ index 0000000..12946ab +#include + +struct virtio_vsock_config { -+ __le32 guest_cid; -+}; ++ __le64 guest_cid; ++} __attribute__((packed)); + +enum virtio_vsock_event_id { + VIRTIO_VSOCK_EVENT_TRANSPORT_RESET = 0, @@ -432,12 +449,12 @@ index 0000000..12946ab + +struct virtio_vsock_event { + __le32 id; -+}; ++} __attribute__((packed)); + +struct virtio_vsock_hdr { -+ __le32 src_cid; ++ __le64 src_cid; ++ __le64 dst_cid; + __le32 src_port; -+ __le32 dst_cid; + __le32 dst_port; + __le32 len; + __le16 type; /* enum virtio_vsock_type */ @@ -445,7 +462,7 @@ index 0000000..12946ab + __le32 flags; + __le32 buf_alloc; + __le32 fwd_cnt; -+}; ++} __attribute__((packed)); + +enum virtio_vsock_type { + VIRTIO_VSOCK_TYPE_STREAM = 1, @@ -478,10 +495,10 @@ index 0000000..12946ab +#endif /* _UAPI_LINUX_VIRTIO_VSOCK_H */ diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c new file mode 100644 -index 0000000..5b9e202 +index 0000000..a53b3a1 --- /dev/null +++ b/net/vmw_vsock/virtio_transport_common.c -@@ -0,0 +1,838 @@ +@@ -0,0 +1,992 @@ +/* + * common code for virtio vsock + * @@ -491,6 +508,7 @@ index 0000000..5b9e202 + * + * This work is licensed under the terms of the GNU GPL, version 2. + */ ++#include +#include +#include +#include @@ -505,6 +523,9 @@ index 0000000..5b9e202 +#define CREATE_TRACE_POINTS +#include + ++/* How long to wait for graceful shutdown of a connection */ ++#define VSOCK_CLOSE_TIMEOUT (8 * HZ) ++ +static const struct virtio_transport *virtio_transport_get_ops(void) +{ + const struct vsock_transport *t = vsock_core_get_transport(); @@ -512,17 +533,6 @@ index 0000000..5b9e202 + return container_of(t, struct virtio_transport, transport); +} + -+static int virtio_transport_send_pkt(struct vsock_sock *vsk, -+ struct virtio_vsock_pkt_info *info) -+{ -+ return virtio_transport_get_ops()->send_pkt(vsk, info); -+} -+ -+static int virtio_transport_send_pkt_no_sock(struct virtio_vsock_pkt *pkt) -+{ -+ return virtio_transport_get_ops()->send_pkt_no_sock(pkt); -+} -+ +struct virtio_vsock_pkt * +virtio_transport_alloc_pkt(struct virtio_vsock_pkt_info *info, + size_t len, @@ -540,13 +550,14 @@ index 0000000..5b9e202 + + pkt->hdr.type = cpu_to_le16(info->type); + pkt->hdr.op = cpu_to_le16(info->op); -+ pkt->hdr.src_cid = cpu_to_le32(src_cid); ++ pkt->hdr.src_cid = cpu_to_le64(src_cid); ++ pkt->hdr.dst_cid = cpu_to_le64(dst_cid); + pkt->hdr.src_port = cpu_to_le32(src_port); -+ pkt->hdr.dst_cid = cpu_to_le32(dst_cid); + pkt->hdr.dst_port = cpu_to_le32(dst_port); + pkt->hdr.flags = cpu_to_le32(info->flags); + pkt->len = len; + pkt->hdr.len = cpu_to_le32(len); ++ pkt->reply = info->reply; + + if (info->msg && len > 0) { + pkt->buf = kmalloc(len, GFP_KERNEL); @@ -574,6 +585,50 @@ index 0000000..5b9e202 +} +EXPORT_SYMBOL_GPL(virtio_transport_alloc_pkt); + ++static int virtio_transport_send_pkt_info(struct vsock_sock *vsk, ++ struct virtio_vsock_pkt_info *info) ++{ ++ u32 src_cid, src_port, dst_cid, dst_port; ++ struct virtio_vsock_sock *vvs; ++ struct virtio_vsock_pkt *pkt; ++ u32 pkt_len = info->pkt_len; ++ ++ src_cid = vm_sockets_get_local_cid(); ++ src_port = vsk->local_addr.svm_port; ++ if (!info->remote_cid) { ++ dst_cid = vsk->remote_addr.svm_cid; ++ dst_port = vsk->remote_addr.svm_port; ++ } else { ++ dst_cid = info->remote_cid; ++ dst_port = info->remote_port; ++ } ++ ++ vvs = vsk->trans; ++ ++ /* we can send less than pkt_len bytes */ ++ if (pkt_len > VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE) ++ pkt_len = VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE; ++ ++ /* virtio_transport_get_credit might return less than pkt_len credit */ ++ pkt_len = virtio_transport_get_credit(vvs, pkt_len); ++ ++ /* Do not send zero length OP_RW pkt */ ++ if (pkt_len == 0 && info->op == VIRTIO_VSOCK_OP_RW) ++ return pkt_len; ++ ++ pkt = virtio_transport_alloc_pkt(info, pkt_len, ++ src_cid, src_port, ++ dst_cid, dst_port); ++ if (!pkt) { ++ virtio_transport_put_credit(vvs, pkt_len); ++ return -ENOMEM; ++ } ++ ++ virtio_transport_inc_tx_pkt(vvs, pkt); ++ ++ return virtio_transport_get_ops()->send_pkt(pkt); ++} ++ +static void virtio_transport_inc_rx_pkt(struct virtio_vsock_sock *vvs, + struct virtio_vsock_pkt *pkt) +{ @@ -589,10 +644,10 @@ index 0000000..5b9e202 + +void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct virtio_vsock_pkt *pkt) +{ -+ mutex_lock(&vvs->tx_lock); ++ spin_lock_bh(&vvs->tx_lock); + pkt->hdr.fwd_cnt = cpu_to_le32(vvs->fwd_cnt); + pkt->hdr.buf_alloc = cpu_to_le32(vvs->buf_alloc); -+ mutex_unlock(&vvs->tx_lock); ++ spin_unlock_bh(&vvs->tx_lock); +} +EXPORT_SYMBOL_GPL(virtio_transport_inc_tx_pkt); + @@ -600,12 +655,12 @@ index 0000000..5b9e202 +{ + u32 ret; + -+ mutex_lock(&vvs->tx_lock); ++ spin_lock_bh(&vvs->tx_lock); + ret = vvs->peer_buf_alloc - (vvs->tx_cnt - vvs->peer_fwd_cnt); + if (ret > credit) + ret = credit; + vvs->tx_cnt += ret; -+ mutex_unlock(&vvs->tx_lock); ++ spin_unlock_bh(&vvs->tx_lock); + + return ret; +} @@ -613,9 +668,9 @@ index 0000000..5b9e202 + +void virtio_transport_put_credit(struct virtio_vsock_sock *vvs, u32 credit) +{ -+ mutex_lock(&vvs->tx_lock); ++ spin_lock_bh(&vvs->tx_lock); + vvs->tx_cnt -= credit; -+ mutex_unlock(&vvs->tx_lock); ++ spin_unlock_bh(&vvs->tx_lock); +} +EXPORT_SYMBOL_GPL(virtio_transport_put_credit); + @@ -628,7 +683,7 @@ index 0000000..5b9e202 + .type = type, + }; + -+ return virtio_transport_send_pkt(vsk, &info); ++ return virtio_transport_send_pkt_info(vsk, &info); +} + +static ssize_t @@ -641,10 +696,8 @@ index 0000000..5b9e202 + size_t bytes, total = 0; + int err = -EFAULT; + -+ mutex_lock(&vvs->rx_lock); -+ while (total < len && -+ vvs->rx_bytes > 0 && -+ !list_empty(&vvs->rx_queue)) { ++ spin_lock_bh(&vvs->rx_lock); ++ while (total < len && !list_empty(&vvs->rx_queue)) { + pkt = list_first_entry(&vvs->rx_queue, + struct virtio_vsock_pkt, list); + @@ -652,9 +705,17 @@ index 0000000..5b9e202 + if (bytes > pkt->len - pkt->off) + bytes = pkt->len - pkt->off; + ++ /* sk_lock is held by caller so no one else can dequeue. ++ * Unlock rx_lock since memcpy_to_msg() may sleep. ++ */ ++ spin_unlock_bh(&vvs->rx_lock); ++ + err = memcpy_to_msg(msg, pkt->buf + pkt->off, bytes); + if (err) + goto out; ++ ++ spin_lock_bh(&vvs->rx_lock); ++ + total += bytes; + pkt->off += bytes; + if (pkt->off == pkt->len) { @@ -663,7 +724,7 @@ index 0000000..5b9e202 + virtio_transport_free_pkt(pkt); + } + } -+ mutex_unlock(&vvs->rx_lock); ++ spin_unlock_bh(&vvs->rx_lock); + + /* Send a credit pkt to peer */ + virtio_transport_send_credit_update(vsk, VIRTIO_VSOCK_TYPE_STREAM, @@ -672,7 +733,6 @@ index 0000000..5b9e202 + return total; + +out: -+ mutex_unlock(&vvs->rx_lock); + if (total) + err = total; + return err; @@ -704,9 +764,9 @@ index 0000000..5b9e202 + struct virtio_vsock_sock *vvs = vsk->trans; + s64 bytes; + -+ mutex_lock(&vvs->rx_lock); ++ spin_lock_bh(&vvs->rx_lock); + bytes = vvs->rx_bytes; -+ mutex_unlock(&vvs->rx_lock); ++ spin_unlock_bh(&vvs->rx_lock); + + return bytes; +} @@ -729,9 +789,9 @@ index 0000000..5b9e202 + struct virtio_vsock_sock *vvs = vsk->trans; + s64 bytes; + -+ mutex_lock(&vvs->tx_lock); ++ spin_lock_bh(&vvs->tx_lock); + bytes = virtio_transport_has_space(vsk); -+ mutex_unlock(&vvs->tx_lock); ++ spin_unlock_bh(&vvs->tx_lock); + + return bytes; +} @@ -763,8 +823,8 @@ index 0000000..5b9e202 + + vvs->buf_alloc = vvs->buf_size; + -+ mutex_init(&vvs->rx_lock); -+ mutex_init(&vvs->tx_lock); ++ spin_lock_init(&vvs->rx_lock); ++ spin_lock_init(&vvs->tx_lock); + INIT_LIST_HEAD(&vvs->rx_queue); + + return 0; @@ -962,7 +1022,7 @@ index 0000000..5b9e202 + .type = VIRTIO_VSOCK_TYPE_STREAM, + }; + -+ return virtio_transport_send_pkt(vsk, &info); ++ return virtio_transport_send_pkt_info(vsk, &info); +} +EXPORT_SYMBOL_GPL(virtio_transport_connect); + @@ -977,22 +1037,10 @@ index 0000000..5b9e202 + VIRTIO_VSOCK_SHUTDOWN_SEND : 0), + }; + -+ return virtio_transport_send_pkt(vsk, &info); ++ return virtio_transport_send_pkt_info(vsk, &info); +} +EXPORT_SYMBOL_GPL(virtio_transport_shutdown); + -+void virtio_transport_release(struct vsock_sock *vsk) -+{ -+ struct sock *sk = &vsk->sk; -+ -+ /* Tell other side to terminate connection */ -+ if (sk->sk_type == SOCK_STREAM && -+ vsk->peer_shutdown != SHUTDOWN_MASK && -+ sk->sk_state == SS_CONNECTED) -+ (void)virtio_transport_shutdown(vsk, SHUTDOWN_MASK); -+} -+EXPORT_SYMBOL_GPL(virtio_transport_release); -+ +int +virtio_transport_dgram_enqueue(struct vsock_sock *vsk, + struct sockaddr_vm *remote_addr, @@ -1015,7 +1063,7 @@ index 0000000..5b9e202 + .pkt_len = len, + }; + -+ return virtio_transport_send_pkt(vsk, &info); ++ return virtio_transport_send_pkt_info(vsk, &info); +} +EXPORT_SYMBOL_GPL(virtio_transport_stream_enqueue); + @@ -1027,29 +1075,31 @@ index 0000000..5b9e202 +} +EXPORT_SYMBOL_GPL(virtio_transport_destruct); + -+static int virtio_transport_send_reset(struct vsock_sock *vsk, -+ struct virtio_vsock_pkt *pkt) ++static int virtio_transport_reset(struct vsock_sock *vsk, ++ struct virtio_vsock_pkt *pkt) +{ + struct virtio_vsock_pkt_info info = { + .op = VIRTIO_VSOCK_OP_RST, + .type = VIRTIO_VSOCK_TYPE_STREAM, ++ .reply = !!pkt, + }; + + /* Send RST only if the original pkt is not a RST pkt */ -+ if (le16_to_cpu(pkt->hdr.op) == VIRTIO_VSOCK_OP_RST) ++ if (pkt && le16_to_cpu(pkt->hdr.op) == VIRTIO_VSOCK_OP_RST) + return 0; + -+ return virtio_transport_send_pkt(vsk, &info); ++ return virtio_transport_send_pkt_info(vsk, &info); +} + +/* Normally packets are associated with a socket. There may be no socket if an + * attempt was made to connect to a socket that does not exist. + */ -+static int virtio_transport_send_reset_no_sock(struct virtio_vsock_pkt *pkt) ++static int virtio_transport_reset_no_sock(struct virtio_vsock_pkt *pkt) +{ + struct virtio_vsock_pkt_info info = { + .op = VIRTIO_VSOCK_OP_RST, + .type = le16_to_cpu(pkt->hdr.type), ++ .reply = true, + }; + + /* Send RST only if the original pkt is not a RST pkt */ @@ -1064,9 +1114,117 @@ index 0000000..5b9e202 + if (!pkt) + return -ENOMEM; + -+ return virtio_transport_send_pkt_no_sock(pkt); ++ return virtio_transport_get_ops()->send_pkt(pkt); +} + ++static void virtio_transport_wait_close(struct sock *sk, long timeout) ++{ ++ if (timeout) { ++ DEFINE_WAIT(wait); ++ ++ do { ++ prepare_to_wait(sk_sleep(sk), &wait, ++ TASK_INTERRUPTIBLE); ++ if (sk_wait_event(sk, &timeout, ++ sock_flag(sk, SOCK_DONE))) ++ break; ++ } while (!signal_pending(current) && timeout); ++ ++ finish_wait(sk_sleep(sk), &wait); ++ } ++} ++ ++static void virtio_transport_do_close(struct vsock_sock *vsk, ++ bool cancel_timeout) ++{ ++ struct sock *sk = sk_vsock(vsk); ++ ++ sock_set_flag(sk, SOCK_DONE); ++ vsk->peer_shutdown = SHUTDOWN_MASK; ++ if (vsock_stream_has_data(vsk) <= 0) ++ sk->sk_state = SS_DISCONNECTING; ++ sk->sk_state_change(sk); ++ ++ if (vsk->close_work_scheduled && ++ (!cancel_timeout || cancel_delayed_work(&vsk->close_work))) { ++ vsk->close_work_scheduled = false; ++ ++ vsock_remove_sock(vsk); ++ ++ /* Release refcnt obtained when we scheduled the timeout */ ++ sock_put(sk); ++ } ++} ++ ++static void virtio_transport_close_timeout(struct work_struct *work) ++{ ++ struct vsock_sock *vsk = ++ container_of(work, struct vsock_sock, close_work.work); ++ struct sock *sk = sk_vsock(vsk); ++ ++ sock_hold(sk); ++ lock_sock(sk); ++ ++ if (!sock_flag(sk, SOCK_DONE)) { ++ (void)virtio_transport_reset(vsk, NULL); ++ ++ virtio_transport_do_close(vsk, false); ++ } ++ ++ vsk->close_work_scheduled = false; ++ ++ release_sock(sk); ++ sock_put(sk); ++} ++ ++/* User context, vsk->sk is locked */ ++static bool virtio_transport_close(struct vsock_sock *vsk) ++{ ++ struct sock *sk = &vsk->sk; ++ ++ if (!(sk->sk_state == SS_CONNECTED || ++ sk->sk_state == SS_DISCONNECTING)) ++ return true; ++ ++ /* Already received SHUTDOWN from peer, reply with RST */ ++ if ((vsk->peer_shutdown & SHUTDOWN_MASK) == SHUTDOWN_MASK) { ++ (void)virtio_transport_reset(vsk, NULL); ++ return true; ++ } ++ ++ if ((sk->sk_shutdown & SHUTDOWN_MASK) != SHUTDOWN_MASK) ++ (void)virtio_transport_shutdown(vsk, SHUTDOWN_MASK); ++ ++ if (sock_flag(sk, SOCK_LINGER) && !(current->flags & PF_EXITING)) ++ virtio_transport_wait_close(sk, sk->sk_lingertime); ++ ++ if (sock_flag(sk, SOCK_DONE)) { ++ return true; ++ } ++ ++ sock_hold(sk); ++ INIT_DELAYED_WORK(&vsk->close_work, ++ virtio_transport_close_timeout); ++ vsk->close_work_scheduled = true; ++ schedule_delayed_work(&vsk->close_work, VSOCK_CLOSE_TIMEOUT); ++ return false; ++} ++ ++void virtio_transport_release(struct vsock_sock *vsk) ++{ ++ struct sock *sk = &vsk->sk; ++ bool remove_sock = true; ++ ++ lock_sock(sk); ++ if (sk->sk_type == SOCK_STREAM) ++ remove_sock = virtio_transport_close(vsk); ++ release_sock(sk); ++ ++ if (remove_sock) ++ vsock_remove_sock(vsk); ++} ++EXPORT_SYMBOL_GPL(virtio_transport_release); ++ +static int +virtio_transport_recv_connecting(struct sock *sk, + struct virtio_vsock_pkt *pkt) @@ -1096,7 +1254,7 @@ index 0000000..5b9e202 + return 0; + +destroy: -+ virtio_transport_send_reset(vsk, pkt); ++ virtio_transport_reset(vsk, pkt); + sk->sk_state = SS_UNCONNECTED; + sk->sk_err = skerr; + sk->sk_error_report(sk); @@ -1116,10 +1274,10 @@ index 0000000..5b9e202 + pkt->len = le32_to_cpu(pkt->hdr.len); + pkt->off = 0; + -+ mutex_lock(&vvs->rx_lock); ++ spin_lock_bh(&vvs->rx_lock); + virtio_transport_inc_rx_pkt(vvs, pkt); + list_add_tail(&pkt->list, &vvs->rx_queue); -+ mutex_unlock(&vvs->rx_lock); ++ spin_unlock_bh(&vvs->rx_lock); + + sk->sk_data_ready(sk); + return err; @@ -1138,11 +1296,7 @@ index 0000000..5b9e202 + sk->sk_state_change(sk); + break; + case VIRTIO_VSOCK_OP_RST: -+ sock_set_flag(sk, SOCK_DONE); -+ vsk->peer_shutdown = SHUTDOWN_MASK; -+ if (vsock_stream_has_data(vsk) <= 0) -+ sk->sk_state = SS_DISCONNECTING; -+ sk->sk_state_change(sk); ++ virtio_transport_do_close(vsk, true); + break; + default: + err = -EINVAL; @@ -1153,6 +1307,16 @@ index 0000000..5b9e202 + return err; +} + ++static void ++virtio_transport_recv_disconnecting(struct sock *sk, ++ struct virtio_vsock_pkt *pkt) ++{ ++ struct vsock_sock *vsk = vsock_sk(sk); ++ ++ if (le16_to_cpu(pkt->hdr.op) == VIRTIO_VSOCK_OP_RST) ++ virtio_transport_do_close(vsk, true); ++} ++ +static int +virtio_transport_send_response(struct vsock_sock *vsk, + struct virtio_vsock_pkt *pkt) @@ -1162,9 +1326,10 @@ index 0000000..5b9e202 + .type = VIRTIO_VSOCK_TYPE_STREAM, + .remote_cid = le32_to_cpu(pkt->hdr.src_cid), + .remote_port = le32_to_cpu(pkt->hdr.src_port), ++ .reply = true, + }; + -+ return virtio_transport_send_pkt(vsk, &info); ++ return virtio_transport_send_pkt_info(vsk, &info); +} + +/* Handle server socket */ @@ -1176,25 +1341,25 @@ index 0000000..5b9e202 + struct sock *child; + + if (le16_to_cpu(pkt->hdr.op) != VIRTIO_VSOCK_OP_REQUEST) { -+ virtio_transport_send_reset(vsk, pkt); ++ virtio_transport_reset(vsk, pkt); + return -EINVAL; + } + + if (sk_acceptq_is_full(sk)) { -+ virtio_transport_send_reset(vsk, pkt); ++ virtio_transport_reset(vsk, pkt); + return -ENOMEM; + } + + child = __vsock_create(sock_net(sk), NULL, sk, GFP_KERNEL, + sk->sk_type, 0); + if (!child) { -+ virtio_transport_send_reset(vsk, pkt); ++ virtio_transport_reset(vsk, pkt); + return -ENOMEM; + } + + sk->sk_ack_backlog++; + -+ lock_sock(child); ++ lock_sock_nested(child, SINGLE_DEPTH_NESTING); + + child->sk_state = SS_CONNECTED; + @@ -1214,7 +1379,7 @@ index 0000000..5b9e202 + return 0; +} + -+static void virtio_transport_space_update(struct sock *sk, ++static bool virtio_transport_space_update(struct sock *sk, + struct virtio_vsock_pkt *pkt) +{ + struct vsock_sock *vsk = vsock_sk(sk); @@ -1222,14 +1387,12 @@ index 0000000..5b9e202 + bool space_available; + + /* buf_alloc and fwd_cnt is always included in the hdr */ -+ mutex_lock(&vvs->tx_lock); ++ spin_lock_bh(&vvs->tx_lock); + vvs->peer_buf_alloc = le32_to_cpu(pkt->hdr.buf_alloc); + vvs->peer_fwd_cnt = le32_to_cpu(pkt->hdr.fwd_cnt); + space_available = virtio_transport_has_space(vsk); -+ mutex_unlock(&vvs->tx_lock); -+ -+ if (space_available) -+ sk->sk_write_space(sk); ++ spin_unlock_bh(&vvs->tx_lock); ++ return space_available; +} + +/* We are under the virtio-vsock's vsock->rx_lock or vhost-vsock's vq->mutex @@ -1240,6 +1403,7 @@ index 0000000..5b9e202 + struct sockaddr_vm src, dst; + struct vsock_sock *vsk; + struct sock *sk; ++ bool space_available; + + vsock_addr_init(&src, le32_to_cpu(pkt->hdr.src_cid), + le32_to_cpu(pkt->hdr.src_port)); @@ -1256,7 +1420,7 @@ index 0000000..5b9e202 + le32_to_cpu(pkt->hdr.fwd_cnt)); + + if (le16_to_cpu(pkt->hdr.type) != VIRTIO_VSOCK_TYPE_STREAM) { -+ (void)virtio_transport_send_reset_no_sock(pkt); ++ (void)virtio_transport_reset_no_sock(pkt); + goto free_pkt; + } + @@ -1267,20 +1431,23 @@ index 0000000..5b9e202 + if (!sk) { + sk = vsock_find_bound_socket(&dst); + if (!sk) { -+ (void)virtio_transport_send_reset_no_sock(pkt); ++ (void)virtio_transport_reset_no_sock(pkt); + goto free_pkt; + } + } + + vsk = vsock_sk(sk); + -+ virtio_transport_space_update(sk, pkt); ++ space_available = virtio_transport_space_update(sk, pkt); + + lock_sock(sk); + + /* Update CID in case it has changed after a transport reset event */ + vsk->local_addr.svm_cid = dst.svm_cid; + ++ if (space_available) ++ sk->sk_write_space(sk); ++ + switch (sk->sk_state) { + case VSOCK_SS_LISTEN: + virtio_transport_recv_listen(sk, pkt); @@ -1293,6 +1460,10 @@ index 0000000..5b9e202 + case SS_CONNECTED: + virtio_transport_recv_connected(sk, pkt); + break; ++ case SS_DISCONNECTING: ++ virtio_transport_recv_disconnecting(sk, pkt); ++ virtio_transport_free_pkt(pkt); ++ break; + default: + virtio_transport_free_pkt(pkt); + break; @@ -1321,5 +1492,5 @@ index 0000000..5b9e202 +MODULE_AUTHOR("Asias He"); +MODULE_DESCRIPTION("common code for virtio vsock"); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0006-VSOCK-Introduce-virtio_transport.ko.patch b/alpine/kernel/patches/0008-VSOCK-Introduce-virtio_transport.ko.patch similarity index 73% rename from alpine/kernel/patches/0006-VSOCK-Introduce-virtio_transport.ko.patch rename to alpine/kernel/patches/0008-VSOCK-Introduce-virtio_transport.ko.patch index e71db3623..b8339c613 100644 --- a/alpine/kernel/patches/0006-VSOCK-Introduce-virtio_transport.ko.patch +++ b/alpine/kernel/patches/0008-VSOCK-Introduce-virtio_transport.ko.patch @@ -1,24 +1,26 @@ -From 425faa8655fbbe9191ddc88fe57097e8be2fdf44 Mon Sep 17 00:00:00 2001 +From e21bdf5a9a62fbdabddca3cafc8aa2b02f2cc165 Mon Sep 17 00:00:00 2001 From: Asias He -Date: Thu, 13 Jun 2013 18:28:48 +0800 -Subject: [PATCH 06/40] VSOCK: Introduce virtio_transport.ko +Date: Thu, 28 Jul 2016 15:36:33 +0100 +Subject: [PATCH 08/46] VSOCK: Introduce virtio_transport.ko VM sockets virtio transport implementation. This driver runs in the guest. Signed-off-by: Asias He Signed-off-by: Stefan Hajnoczi +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 0ea9e1d3a9e3ef7d2a1462d3de6b95131dc7d872) --- MAINTAINERS | 1 + - net/vmw_vsock/virtio_transport.c | 584 +++++++++++++++++++++++++++++++++++++++ - 2 files changed, 585 insertions(+) + net/vmw_vsock/virtio_transport.c | 624 +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 625 insertions(+) create mode 100644 net/vmw_vsock/virtio_transport.c diff --git a/MAINTAINERS b/MAINTAINERS -index b93ba8b..82d1123 100644 +index 3e60f59..c7e4c9a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -11391,6 +11391,7 @@ S: Maintained +@@ -11404,6 +11404,7 @@ S: Maintained F: include/linux/virtio_vsock.h F: include/uapi/linux/virtio_vsock.h F: net/vmw_vsock/virtio_transport_common.c @@ -28,10 +30,10 @@ index b93ba8b..82d1123 100644 M: Stephen Chandler Paul diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c new file mode 100644 -index 0000000..45472e0 +index 0000000..699dfab --- /dev/null +++ b/net/vmw_vsock/virtio_transport.c -@@ -0,0 +1,584 @@ +@@ -0,0 +1,624 @@ +/* + * virtio transport for vsock + * @@ -47,6 +49,7 @@ index 0000000..45472e0 +#include +#include +#include ++#include +#include +#include +#include @@ -58,7 +61,6 @@ index 0000000..45472e0 +static struct workqueue_struct *virtio_vsock_workqueue; +static struct virtio_vsock *the_virtio_vsock; +static DEFINE_MUTEX(the_virtio_vsock_mutex); /* protects the_virtio_vsock */ -+static void virtio_vsock_rx_fill(struct virtio_vsock *vsock); + +struct virtio_vsock { + struct virtio_device *vdev; @@ -69,13 +71,16 @@ index 0000000..45472e0 + struct work_struct rx_work; + struct work_struct event_work; + -+ wait_queue_head_t tx_wait; /* for waiting for tx resources */ -+ + /* The following fields are protected by tx_lock. vqs[VSOCK_VQ_TX] + * must be accessed with tx_lock held. + */ + struct mutex tx_lock; -+ u32 total_tx_buf; ++ ++ struct work_struct send_pkt_work; ++ spinlock_t send_pkt_list_lock; ++ struct list_head send_pkt_list; ++ ++ atomic_t queued_replies; + + /* The following fields are protected by rx_lock. vqs[VSOCK_VQ_RX] + * must be accessed with rx_lock held. @@ -105,45 +110,88 @@ index 0000000..45472e0 + return vsock->guest_cid; +} + -+static int -+virtio_transport_send_one_pkt(struct virtio_vsock *vsock, -+ struct virtio_vsock_pkt *pkt) ++static void ++virtio_transport_send_pkt_work(struct work_struct *work) +{ -+ struct scatterlist hdr, buf, *sgs[2]; -+ int ret, in_sg = 0, out_sg = 0; ++ struct virtio_vsock *vsock = ++ container_of(work, struct virtio_vsock, send_pkt_work); + struct virtqueue *vq; -+ DEFINE_WAIT(wait); ++ bool added = false; ++ bool restart_rx = false; ++ ++ mutex_lock(&vsock->tx_lock); + + vq = vsock->vqs[VSOCK_VQ_TX]; + -+ /* Put pkt in the virtqueue */ -+ sg_init_one(&hdr, &pkt->hdr, sizeof(pkt->hdr)); -+ sgs[out_sg++] = &hdr; -+ if (pkt->buf) { -+ sg_init_one(&buf, pkt->buf, pkt->len); -+ sgs[out_sg++] = &buf; ++ /* Avoid unnecessary interrupts while we're processing the ring */ ++ virtqueue_disable_cb(vq); ++ ++ for (;;) { ++ struct virtio_vsock_pkt *pkt; ++ struct scatterlist hdr, buf, *sgs[2]; ++ int ret, in_sg = 0, out_sg = 0; ++ bool reply; ++ ++ spin_lock_bh(&vsock->send_pkt_list_lock); ++ if (list_empty(&vsock->send_pkt_list)) { ++ spin_unlock_bh(&vsock->send_pkt_list_lock); ++ virtqueue_enable_cb(vq); ++ break; ++ } ++ ++ pkt = list_first_entry(&vsock->send_pkt_list, ++ struct virtio_vsock_pkt, list); ++ list_del_init(&pkt->list); ++ spin_unlock_bh(&vsock->send_pkt_list_lock); ++ ++ reply = pkt->reply; ++ ++ sg_init_one(&hdr, &pkt->hdr, sizeof(pkt->hdr)); ++ sgs[out_sg++] = &hdr; ++ if (pkt->buf) { ++ sg_init_one(&buf, pkt->buf, pkt->len); ++ sgs[out_sg++] = &buf; ++ } ++ ++ ret = virtqueue_add_sgs(vq, sgs, out_sg, in_sg, pkt, GFP_KERNEL); ++ if (ret < 0) { ++ spin_lock_bh(&vsock->send_pkt_list_lock); ++ list_add(&pkt->list, &vsock->send_pkt_list); ++ spin_unlock_bh(&vsock->send_pkt_list_lock); ++ ++ if (!virtqueue_enable_cb(vq) && ret == -ENOSPC) ++ continue; /* retry now that we have more space */ ++ break; ++ } ++ ++ if (reply) { ++ struct virtqueue *rx_vq = vsock->vqs[VSOCK_VQ_RX]; ++ int val; ++ ++ val = atomic_dec_return(&vsock->queued_replies); ++ ++ /* Do we now have resources to resume rx processing? */ ++ if (val + 1 == virtqueue_get_vring_size(rx_vq)) ++ restart_rx = true; ++ } ++ ++ added = true; + } + -+ mutex_lock(&vsock->tx_lock); -+ while ((ret = virtqueue_add_sgs(vq, sgs, out_sg, in_sg, pkt, -+ GFP_KERNEL)) < 0) { -+ prepare_to_wait_exclusive(&vsock->tx_wait, &wait, -+ TASK_UNINTERRUPTIBLE); -+ mutex_unlock(&vsock->tx_lock); -+ schedule(); -+ mutex_lock(&vsock->tx_lock); -+ finish_wait(&vsock->tx_wait, &wait); -+ } -+ virtqueue_kick(vq); ++ if (added) ++ virtqueue_kick(vq); ++ + mutex_unlock(&vsock->tx_lock); + -+ return pkt->len; ++ if (restart_rx) ++ queue_work(virtio_vsock_workqueue, &vsock->rx_work); +} + +static int -+virtio_transport_send_pkt_no_sock(struct virtio_vsock_pkt *pkt) ++virtio_transport_send_pkt(struct virtio_vsock_pkt *pkt) +{ + struct virtio_vsock *vsock; ++ int len = pkt->len; + + vsock = virtio_vsock_get(); + if (!vsock) { @@ -151,71 +199,15 @@ index 0000000..45472e0 + return -ENODEV; + } + -+ return virtio_transport_send_one_pkt(vsock, pkt); -+} ++ if (pkt->reply) ++ atomic_inc(&vsock->queued_replies); + -+static int -+virtio_transport_send_pkt(struct vsock_sock *vsk, -+ struct virtio_vsock_pkt_info *info) -+{ -+ u32 src_cid, src_port, dst_cid, dst_port; -+ struct virtio_vsock_sock *vvs; -+ struct virtio_vsock_pkt *pkt; -+ struct virtio_vsock *vsock; -+ u32 pkt_len = info->pkt_len; -+ DEFINE_WAIT(wait); ++ spin_lock_bh(&vsock->send_pkt_list_lock); ++ list_add_tail(&pkt->list, &vsock->send_pkt_list); ++ spin_unlock_bh(&vsock->send_pkt_list_lock); + -+ vsock = virtio_vsock_get(); -+ if (!vsock) -+ return -ENODEV; -+ -+ src_cid = virtio_transport_get_local_cid(); -+ src_port = vsk->local_addr.svm_port; -+ if (!info->remote_cid) { -+ dst_cid = vsk->remote_addr.svm_cid; -+ dst_port = vsk->remote_addr.svm_port; -+ } else { -+ dst_cid = info->remote_cid; -+ dst_port = info->remote_port; -+ } -+ -+ vvs = vsk->trans; -+ -+ if (pkt_len > VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE) -+ pkt_len = VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE; -+ pkt_len = virtio_transport_get_credit(vvs, pkt_len); -+ /* Do not send zero length OP_RW pkt*/ -+ if (pkt_len == 0 && info->op == VIRTIO_VSOCK_OP_RW) -+ return pkt_len; -+ -+ /* Respect global tx buf limitation */ -+ mutex_lock(&vsock->tx_lock); -+ while (pkt_len + vsock->total_tx_buf > VIRTIO_VSOCK_MAX_TX_BUF_SIZE) { -+ prepare_to_wait_exclusive(&vsock->tx_wait, &wait, -+ TASK_UNINTERRUPTIBLE); -+ mutex_unlock(&vsock->tx_lock); -+ schedule(); -+ mutex_lock(&vsock->tx_lock); -+ finish_wait(&vsock->tx_wait, &wait); -+ } -+ vsock->total_tx_buf += pkt_len; -+ mutex_unlock(&vsock->tx_lock); -+ -+ pkt = virtio_transport_alloc_pkt(info, pkt_len, -+ src_cid, src_port, -+ dst_cid, dst_port); -+ if (!pkt) { -+ mutex_lock(&vsock->tx_lock); -+ vsock->total_tx_buf -= pkt_len; -+ mutex_unlock(&vsock->tx_lock); -+ virtio_transport_put_credit(vvs, pkt_len); -+ wake_up(&vsock->tx_wait); -+ return -ENOMEM; -+ } -+ -+ virtio_transport_inc_tx_pkt(vvs, pkt); -+ -+ return virtio_transport_send_one_pkt(vsock, pkt); ++ queue_work(virtio_vsock_workqueue, &vsock->send_pkt_work); ++ return len; +} + +static void virtio_vsock_rx_fill(struct virtio_vsock *vsock) @@ -258,7 +250,7 @@ index 0000000..45472e0 + virtqueue_kick(vq); +} + -+static void virtio_transport_send_pkt_work(struct work_struct *work) ++static void virtio_transport_tx_work(struct work_struct *work) +{ + struct virtio_vsock *vsock = + container_of(work, struct virtio_vsock, tx_work); @@ -273,7 +265,6 @@ index 0000000..45472e0 + + virtqueue_disable_cb(vq); + while ((pkt = virtqueue_get_buf(vq, &len)) != NULL) { -+ vsock->total_tx_buf -= pkt->len; + virtio_transport_free_pkt(pkt); + added = true; + } @@ -281,23 +272,50 @@ index 0000000..45472e0 + mutex_unlock(&vsock->tx_lock); + + if (added) -+ wake_up(&vsock->tx_wait); ++ queue_work(virtio_vsock_workqueue, &vsock->send_pkt_work); +} + -+static void virtio_transport_recv_pkt_work(struct work_struct *work) ++/* Is there space left for replies to rx packets? */ ++static bool virtio_transport_more_replies(struct virtio_vsock *vsock) ++{ ++ struct virtqueue *vq = vsock->vqs[VSOCK_VQ_RX]; ++ int val; ++ ++ smp_rmb(); /* paired with atomic_inc() and atomic_dec_return() */ ++ val = atomic_read(&vsock->queued_replies); ++ ++ return val < virtqueue_get_vring_size(vq); ++} ++ ++static void virtio_transport_rx_work(struct work_struct *work) +{ + struct virtio_vsock *vsock = + container_of(work, struct virtio_vsock, rx_work); + struct virtqueue *vq; + + vq = vsock->vqs[VSOCK_VQ_RX]; -+ mutex_lock(&vsock->rx_lock); -+ do { -+ struct virtio_vsock_pkt *pkt; -+ unsigned int len; + ++ mutex_lock(&vsock->rx_lock); ++ ++ do { + virtqueue_disable_cb(vq); -+ while ((pkt = virtqueue_get_buf(vq, &len)) != NULL) { ++ for (;;) { ++ struct virtio_vsock_pkt *pkt; ++ unsigned int len; ++ ++ if (!virtio_transport_more_replies(vsock)) { ++ /* Stop rx until the device processes already ++ * pending replies. Leave rx virtqueue ++ * callbacks disabled. ++ */ ++ goto out; ++ } ++ ++ pkt = virtqueue_get_buf(vq, &len); ++ if (!pkt) { ++ break; ++ } ++ + vsock->rx_buf_nr--; + + /* Drop short/long packets */ @@ -312,6 +330,7 @@ index 0000000..45472e0 + } + } while (!virtqueue_enable_cb(vq)); + ++out: + if (vsock->rx_buf_nr < vsock->rx_buf_max_nr / 2) + virtio_vsock_rx_fill(vsock); + mutex_unlock(&vsock->rx_lock); @@ -357,11 +376,11 @@ index 0000000..45472e0 +static void virtio_vsock_update_guest_cid(struct virtio_vsock *vsock) +{ + struct virtio_device *vdev = vsock->vdev; -+ u32 guest_cid; ++ u64 guest_cid; + + vdev->config->get(vdev, offsetof(struct virtio_vsock_config, guest_cid), + &guest_cid, sizeof(guest_cid)); -+ vsock->guest_cid = le32_to_cpu(guest_cid); ++ vsock->guest_cid = le64_to_cpu(guest_cid); +} + +/* event_lock must be held */ @@ -473,8 +492,7 @@ index 0000000..45472e0 + .get_max_buffer_size = virtio_transport_get_max_buffer_size, + }, + -+ .send_pkt = virtio_transport_send_pkt, -+ .send_pkt_no_sock = virtio_transport_send_pkt_no_sock, ++ .send_pkt = virtio_transport_send_pkt, +}; + +static int virtio_vsock_probe(struct virtio_device *vdev) @@ -523,16 +541,19 @@ index 0000000..45472e0 + + vsock->rx_buf_nr = 0; + vsock->rx_buf_max_nr = 0; ++ atomic_set(&vsock->queued_replies, 0); + + vdev->priv = vsock; + the_virtio_vsock = vsock; -+ init_waitqueue_head(&vsock->tx_wait); + mutex_init(&vsock->tx_lock); + mutex_init(&vsock->rx_lock); + mutex_init(&vsock->event_lock); -+ INIT_WORK(&vsock->rx_work, virtio_transport_recv_pkt_work); -+ INIT_WORK(&vsock->tx_work, virtio_transport_send_pkt_work); ++ spin_lock_init(&vsock->send_pkt_list_lock); ++ INIT_LIST_HEAD(&vsock->send_pkt_list); ++ INIT_WORK(&vsock->rx_work, virtio_transport_rx_work); ++ INIT_WORK(&vsock->tx_work, virtio_transport_tx_work); + INIT_WORK(&vsock->event_work, virtio_transport_event_work); ++ INIT_WORK(&vsock->send_pkt_work, virtio_transport_send_pkt_work); + + mutex_lock(&vsock->rx_lock); + virtio_vsock_rx_fill(vsock); @@ -556,13 +577,34 @@ index 0000000..45472e0 +static void virtio_vsock_remove(struct virtio_device *vdev) +{ + struct virtio_vsock *vsock = vdev->priv; ++ struct virtio_vsock_pkt *pkt; + + flush_work(&vsock->rx_work); + flush_work(&vsock->tx_work); + flush_work(&vsock->event_work); ++ flush_work(&vsock->send_pkt_work); + + vdev->config->reset(vdev); + ++ mutex_lock(&vsock->rx_lock); ++ while ((pkt = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_RX]))) ++ virtio_transport_free_pkt(pkt); ++ mutex_unlock(&vsock->rx_lock); ++ ++ mutex_lock(&vsock->tx_lock); ++ while ((pkt = virtqueue_detach_unused_buf(vsock->vqs[VSOCK_VQ_TX]))) ++ virtio_transport_free_pkt(pkt); ++ mutex_unlock(&vsock->tx_lock); ++ ++ spin_lock_bh(&vsock->send_pkt_list_lock); ++ while (!list_empty(&vsock->send_pkt_list)) { ++ pkt = list_first_entry(&vsock->send_pkt_list, ++ struct virtio_vsock_pkt, list); ++ list_del(&pkt->list); ++ virtio_transport_free_pkt(pkt); ++ } ++ spin_unlock_bh(&vsock->send_pkt_list_lock); ++ + mutex_lock(&the_virtio_vsock_mutex); + the_virtio_vsock = NULL; + vsock_core_exit(); @@ -617,5 +659,5 @@ index 0000000..45472e0 +MODULE_DESCRIPTION("virtio transport for vsock"); +MODULE_DEVICE_TABLE(virtio, id_table); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0007-VSOCK-Introduce-vhost_vsock.ko.patch b/alpine/kernel/patches/0009-VSOCK-Introduce-vhost_vsock.ko.patch similarity index 73% rename from alpine/kernel/patches/0007-VSOCK-Introduce-vhost_vsock.ko.patch rename to alpine/kernel/patches/0009-VSOCK-Introduce-vhost_vsock.ko.patch index ce47edb23..6a43020bc 100644 --- a/alpine/kernel/patches/0007-VSOCK-Introduce-vhost_vsock.ko.patch +++ b/alpine/kernel/patches/0009-VSOCK-Introduce-vhost_vsock.ko.patch @@ -1,26 +1,27 @@ -From b83fd98b14a95b6ae4b5eee5c565e645aee41442 Mon Sep 17 00:00:00 2001 +From 7cba4e91a9e1359345ccb7dbff243cedf5b5e6ea Mon Sep 17 00:00:00 2001 From: Asias He -Date: Thu, 13 Jun 2013 18:29:21 +0800 -Subject: [PATCH 07/40] VSOCK: Introduce vhost_vsock.ko +Date: Thu, 28 Jul 2016 15:36:34 +0100 +Subject: [PATCH 09/46] VSOCK: Introduce vhost_vsock.ko VM sockets vhost transport implementation. This driver runs on the host. Signed-off-by: Asias He Signed-off-by: Stefan Hajnoczi +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 433fc58e6bf2c8bd97e57153ed28e64fd78207b8) --- - MAINTAINERS | 2 + - drivers/vhost/vsock.c | 694 ++++++++++++++++++++++++++++++++++++++++++++++++++ - drivers/vhost/vsock.h | 5 + - 3 files changed, 701 insertions(+) + MAINTAINERS | 2 + + drivers/vhost/vsock.c | 722 +++++++++++++++++++++++++++++++++++++++++++++ + include/uapi/linux/vhost.h | 5 + + 3 files changed, 729 insertions(+) create mode 100644 drivers/vhost/vsock.c - create mode 100644 drivers/vhost/vsock.h diff --git a/MAINTAINERS b/MAINTAINERS -index 82d1123..12d49f5 100644 +index c7e4c9a..fa94182 100644 --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -11392,6 +11392,8 @@ F: include/linux/virtio_vsock.h +@@ -11405,6 +11405,8 @@ F: include/linux/virtio_vsock.h F: include/uapi/linux/virtio_vsock.h F: net/vmw_vsock/virtio_transport_common.c F: net/vmw_vsock/virtio_transport.c @@ -31,10 +32,10 @@ index 82d1123..12d49f5 100644 M: Stephen Chandler Paul diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c new file mode 100644 -index 0000000..8488d01 +index 0000000..028ca16 --- /dev/null +++ b/drivers/vhost/vsock.c -@@ -0,0 +1,694 @@ +@@ -0,0 +1,722 @@ +/* + * vhost transport for vsock + * @@ -45,15 +46,16 @@ index 0000000..8488d01 + * This work is licensed under the terms of the GNU GPL, version 2. + */ +#include ++#include +#include +#include ++#include +#include +#include +#include + +#include +#include "vhost.h" -+#include "vsock.h" + +#define VHOST_VSOCK_DEFAULT_HOST_CID 2 + @@ -62,22 +64,21 @@ index 0000000..8488d01 +}; + +/* Used to track all the vhost_vsock instances on the system. */ ++static DEFINE_SPINLOCK(vhost_vsock_lock); +static LIST_HEAD(vhost_vsock_list); -+static DEFINE_MUTEX(vhost_vsock_mutex); + +struct vhost_vsock { + struct vhost_dev dev; + struct vhost_virtqueue vqs[2]; + -+ /* Link to global vhost_vsock_list, protected by vhost_vsock_mutex */ ++ /* Link to global vhost_vsock_list, protected by vhost_vsock_lock */ + struct list_head list; + + struct vhost_work send_pkt_work; -+ wait_queue_head_t send_wait; -+ -+ /* Fields protected by vqs[VSOCK_VQ_RX].mutex */ ++ spinlock_t send_pkt_list_lock; + struct list_head send_pkt_list; /* host->guest pending packets */ -+ u32 total_tx_buf; ++ ++ atomic_t queued_replies; + + u32 guest_cid; +}; @@ -91,7 +92,7 @@ index 0000000..8488d01 +{ + struct vhost_vsock *vsock; + -+ mutex_lock(&vhost_vsock_mutex); ++ spin_lock_bh(&vhost_vsock_lock); + list_for_each_entry(vsock, &vhost_vsock_list, list) { + u32 other_cid = vsock->guest_cid; + @@ -100,11 +101,11 @@ index 0000000..8488d01 + continue; + + if (other_cid == guest_cid) { -+ mutex_unlock(&vhost_vsock_mutex); ++ spin_unlock_bh(&vhost_vsock_lock); + return vsock; + } + } -+ mutex_unlock(&vhost_vsock_mutex); ++ spin_unlock_bh(&vhost_vsock_lock); + + return NULL; +} @@ -113,10 +114,15 @@ index 0000000..8488d01 +vhost_transport_do_send_pkt(struct vhost_vsock *vsock, + struct vhost_virtqueue *vq) +{ ++ struct vhost_virtqueue *tx_vq = &vsock->vqs[VSOCK_VQ_TX]; + bool added = false; ++ bool restart_tx = false; + + mutex_lock(&vq->mutex); + ++ if (!vq->private_data) ++ goto out; ++ + /* Avoid further vmexits, we're already processing the virtqueue */ + vhost_disable_notify(&vsock->dev, vq); + @@ -128,17 +134,32 @@ index 0000000..8488d01 + size_t len; + int head; + ++ spin_lock_bh(&vsock->send_pkt_list_lock); + if (list_empty(&vsock->send_pkt_list)) { ++ spin_unlock_bh(&vsock->send_pkt_list_lock); + vhost_enable_notify(&vsock->dev, vq); + break; + } + ++ pkt = list_first_entry(&vsock->send_pkt_list, ++ struct virtio_vsock_pkt, list); ++ list_del_init(&pkt->list); ++ spin_unlock_bh(&vsock->send_pkt_list_lock); ++ + head = vhost_get_vq_desc(vq, vq->iov, ARRAY_SIZE(vq->iov), + &out, &in, NULL, NULL); -+ if (head < 0) ++ if (head < 0) { ++ spin_lock_bh(&vsock->send_pkt_list_lock); ++ list_add(&pkt->list, &vsock->send_pkt_list); ++ spin_unlock_bh(&vsock->send_pkt_list_lock); + break; ++ } + + if (head == vq->num) { ++ spin_lock_bh(&vsock->send_pkt_list_lock); ++ list_add(&pkt->list, &vsock->send_pkt_list); ++ spin_unlock_bh(&vsock->send_pkt_list_lock); ++ + /* We cannot finish yet if more buffers snuck in while + * re-enabling notify. + */ @@ -149,10 +170,6 @@ index 0000000..8488d01 + break; + } + -+ pkt = list_first_entry(&vsock->send_pkt_list, -+ struct virtio_vsock_pkt, list); -+ list_del_init(&pkt->list); -+ + if (out) { + virtio_transport_free_pkt(pkt); + vq_err(vq, "Expected 0 output buffers, got %u\n", out); @@ -179,16 +196,26 @@ index 0000000..8488d01 + vhost_add_used(vq, head, sizeof(pkt->hdr) + pkt->len); + added = true; + -+ vsock->total_tx_buf -= pkt->len; ++ if (pkt->reply) { ++ int val; ++ ++ val = atomic_dec_return(&vsock->queued_replies); ++ ++ /* Do we have resources to resume tx processing? */ ++ if (val + 1 == tx_vq->num) ++ restart_tx = true; ++ } + + virtio_transport_free_pkt(pkt); + } + if (added) + vhost_signal(&vsock->dev, vq); ++ ++out: + mutex_unlock(&vq->mutex); + -+ if (added) -+ wake_up(&vsock->send_wait); ++ if (restart_tx) ++ vhost_poll_queue(&tx_vq->poll); +} + +static void vhost_transport_send_pkt_work(struct vhost_work *work) @@ -203,104 +230,30 @@ index 0000000..8488d01 +} + +static int -+vhost_transport_send_one_pkt(struct vhost_vsock *vsock, -+ struct virtio_vsock_pkt *pkt) -+{ -+ struct vhost_virtqueue *vq = &vsock->vqs[VSOCK_VQ_RX]; -+ -+ /* Queue it up in vhost work */ -+ mutex_lock(&vq->mutex); -+ list_add_tail(&pkt->list, &vsock->send_pkt_list); -+ vhost_work_queue(&vsock->dev, &vsock->send_pkt_work); -+ mutex_unlock(&vq->mutex); -+ -+ return pkt->len; -+} -+ -+static int -+vhost_transport_send_pkt_no_sock(struct virtio_vsock_pkt *pkt) ++vhost_transport_send_pkt(struct virtio_vsock_pkt *pkt) +{ + struct vhost_vsock *vsock; ++ struct vhost_virtqueue *vq; ++ int len = pkt->len; + + /* Find the vhost_vsock according to guest context id */ -+ vsock = vhost_vsock_get(le32_to_cpu(pkt->hdr.dst_cid)); ++ vsock = vhost_vsock_get(le64_to_cpu(pkt->hdr.dst_cid)); + if (!vsock) { + virtio_transport_free_pkt(pkt); + return -ENODEV; + } + -+ return vhost_transport_send_one_pkt(vsock, pkt); -+} -+ -+static int -+vhost_transport_send_pkt(struct vsock_sock *vsk, -+ struct virtio_vsock_pkt_info *info) -+{ -+ u32 src_cid, src_port, dst_cid, dst_port; -+ struct virtio_vsock_sock *vvs; -+ struct virtio_vsock_pkt *pkt; -+ struct vhost_virtqueue *vq; -+ struct vhost_vsock *vsock; -+ u32 pkt_len = info->pkt_len; -+ DEFINE_WAIT(wait); -+ -+ src_cid = vhost_transport_get_local_cid(); -+ src_port = vsk->local_addr.svm_port; -+ if (!info->remote_cid) { -+ dst_cid = vsk->remote_addr.svm_cid; -+ dst_port = vsk->remote_addr.svm_port; -+ } else { -+ dst_cid = info->remote_cid; -+ dst_port = info->remote_port; -+ } -+ -+ /* Find the vhost_vsock according to guest context id */ -+ vsock = vhost_vsock_get(dst_cid); -+ if (!vsock) -+ return -ENODEV; -+ -+ vvs = vsk->trans; + vq = &vsock->vqs[VSOCK_VQ_RX]; + -+ /* we can send less than pkt_len bytes */ -+ if (pkt_len > VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE) -+ pkt_len = VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE; ++ if (pkt->reply) ++ atomic_inc(&vsock->queued_replies); + -+ /* virtio_transport_get_credit might return less than pkt_len credit */ -+ pkt_len = virtio_transport_get_credit(vvs, pkt_len); ++ spin_lock_bh(&vsock->send_pkt_list_lock); ++ list_add_tail(&pkt->list, &vsock->send_pkt_list); ++ spin_unlock_bh(&vsock->send_pkt_list_lock); + -+ /* Do not send zero length OP_RW pkt*/ -+ if (pkt_len == 0 && info->op == VIRTIO_VSOCK_OP_RW) -+ return pkt_len; -+ -+ /* Respect global tx buf limitation */ -+ mutex_lock(&vq->mutex); -+ while (pkt_len + vsock->total_tx_buf > VIRTIO_VSOCK_MAX_TX_BUF_SIZE) { -+ prepare_to_wait_exclusive(&vsock->send_wait, &wait, -+ TASK_UNINTERRUPTIBLE); -+ mutex_unlock(&vq->mutex); -+ schedule(); -+ mutex_lock(&vq->mutex); -+ finish_wait(&vsock->send_wait, &wait); -+ } -+ vsock->total_tx_buf += pkt_len; -+ mutex_unlock(&vq->mutex); -+ -+ pkt = virtio_transport_alloc_pkt(info, pkt_len, -+ src_cid, src_port, -+ dst_cid, dst_port); -+ if (!pkt) { -+ mutex_lock(&vq->mutex); -+ vsock->total_tx_buf -= pkt_len; -+ mutex_unlock(&vq->mutex); -+ virtio_transport_put_credit(vvs, pkt_len); -+ wake_up(&vsock->send_wait); -+ return -ENOMEM; -+ } -+ -+ virtio_transport_inc_tx_pkt(vvs, pkt); -+ -+ return vhost_transport_send_one_pkt(vsock, pkt); ++ vhost_work_queue(&vsock->dev, &vsock->send_pkt_work); ++ return len; +} + +static struct virtio_vsock_pkt * @@ -362,6 +315,18 @@ index 0000000..8488d01 + return pkt; +} + ++/* Is there space left for replies to rx packets? */ ++static bool vhost_vsock_more_replies(struct vhost_vsock *vsock) ++{ ++ struct vhost_virtqueue *vq = &vsock->vqs[VSOCK_VQ_TX]; ++ int val; ++ ++ smp_rmb(); /* paired with atomic_inc() and atomic_dec_return() */ ++ val = atomic_read(&vsock->queued_replies); ++ ++ return val < vq->num; ++} ++ +static void vhost_vsock_handle_tx_kick(struct vhost_work *work) +{ + struct vhost_virtqueue *vq = container_of(work, struct vhost_virtqueue, @@ -374,8 +339,20 @@ index 0000000..8488d01 + bool added = false; + + mutex_lock(&vq->mutex); ++ ++ if (!vq->private_data) ++ goto out; ++ + vhost_disable_notify(&vsock->dev, vq); + for (;;) { ++ if (!vhost_vsock_more_replies(vsock)) { ++ /* Stop tx until the device processes already ++ * pending replies. Leave tx virtqueue ++ * callbacks disabled. ++ */ ++ goto no_more_replies; ++ } ++ + head = vhost_get_vq_desc(vq, vq->iov, ARRAY_SIZE(vq->iov), + &out, &in, NULL, NULL); + if (head < 0) @@ -396,7 +373,7 @@ index 0000000..8488d01 + } + + /* Only accept correctly addressed packets */ -+ if (le32_to_cpu(pkt->hdr.src_cid) == vsock->guest_cid) ++ if (le64_to_cpu(pkt->hdr.src_cid) == vsock->guest_cid) + virtio_transport_recv_pkt(pkt); + else + virtio_transport_free_pkt(pkt); @@ -404,8 +381,12 @@ index 0000000..8488d01 + vhost_add_used(vq, head, sizeof(pkt->hdr) + pkt->len); + added = true; + } ++ ++no_more_replies: + if (added) + vhost_signal(&vsock->dev, vq); ++ ++out: + mutex_unlock(&vq->mutex); +} + @@ -465,21 +446,36 @@ index 0000000..8488d01 + return ret; +} + -+static void vhost_vsock_stop(struct vhost_vsock *vsock) ++static int vhost_vsock_stop(struct vhost_vsock *vsock) +{ + size_t i; ++ int ret; + + mutex_lock(&vsock->dev.mutex); + ++ ret = vhost_dev_check_owner(&vsock->dev); ++ if (ret) ++ goto err; ++ + for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) { + struct vhost_virtqueue *vq = &vsock->vqs[i]; + + mutex_lock(&vq->mutex); -+ vq->private_data = vsock; ++ vq->private_data = NULL; + mutex_unlock(&vq->mutex); + } + ++err: + mutex_unlock(&vsock->dev.mutex); ++ return ret; ++} ++ ++static void vhost_vsock_free(struct vhost_vsock *vsock) ++{ ++ if (is_vmalloc_addr(vsock)) ++ vfree(vsock); ++ else ++ kfree(vsock); +} + +static int vhost_vsock_dev_open(struct inode *inode, struct file *file) @@ -488,9 +484,15 @@ index 0000000..8488d01 + struct vhost_vsock *vsock; + int ret; + -+ vsock = kzalloc(sizeof(*vsock), GFP_KERNEL); -+ if (!vsock) -+ return -ENOMEM; ++ /* This struct is large and allocation could fail, fall back to vmalloc ++ * if there is no other way. ++ */ ++ vsock = kzalloc(sizeof(*vsock), GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); ++ if (!vsock) { ++ vsock = vmalloc(sizeof(*vsock)); ++ if (!vsock) ++ return -ENOMEM; ++ } + + vqs = kmalloc_array(ARRAY_SIZE(vsock->vqs), sizeof(*vqs), GFP_KERNEL); + if (!vqs) { @@ -498,6 +500,8 @@ index 0000000..8488d01 + goto out; + } + ++ atomic_set(&vsock->queued_replies, 0); ++ + vqs[VSOCK_VQ_TX] = &vsock->vqs[VSOCK_VQ_TX]; + vqs[VSOCK_VQ_RX] = &vsock->vqs[VSOCK_VQ_RX]; + vsock->vqs[VSOCK_VQ_TX].handle_kick = vhost_vsock_handle_tx_kick; @@ -506,17 +510,17 @@ index 0000000..8488d01 + vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs)); + + file->private_data = vsock; -+ init_waitqueue_head(&vsock->send_wait); ++ spin_lock_init(&vsock->send_pkt_list_lock); + INIT_LIST_HEAD(&vsock->send_pkt_list); + vhost_work_init(&vsock->send_pkt_work, vhost_transport_send_pkt_work); + -+ mutex_lock(&vhost_vsock_mutex); ++ spin_lock_bh(&vhost_vsock_lock); + list_add_tail(&vsock->list, &vhost_vsock_list); -+ mutex_unlock(&vhost_vsock_mutex); ++ spin_unlock_bh(&vhost_vsock_lock); + return 0; + +out: -+ kfree(vsock); ++ vhost_vsock_free(vsock); + return ret; +} + @@ -534,22 +538,27 @@ index 0000000..8488d01 +{ + struct vsock_sock *vsk = vsock_sk(sk); + -+ lock_sock(sk); ++ /* vmci_transport.c doesn't take sk_lock here either. At least we're ++ * under vsock_table_lock so the sock cannot disappear while we're ++ * executing. ++ */ ++ + if (!vhost_vsock_get(vsk->local_addr.svm_cid)) { ++ sock_set_flag(sk, SOCK_DONE); ++ vsk->peer_shutdown = SHUTDOWN_MASK; + sk->sk_state = SS_UNCONNECTED; + sk->sk_err = ECONNRESET; + sk->sk_error_report(sk); + } -+ release_sock(sk); +} + +static int vhost_vsock_dev_release(struct inode *inode, struct file *file) +{ + struct vhost_vsock *vsock = file->private_data; + -+ mutex_lock(&vhost_vsock_mutex); ++ spin_lock_bh(&vhost_vsock_lock); + list_del(&vsock->list); -+ mutex_unlock(&vhost_vsock_mutex); ++ spin_unlock_bh(&vhost_vsock_lock); + + /* Iterating over all connections for all CIDs to find orphans is + * inefficient. Room for improvement here. */ @@ -558,18 +567,35 @@ index 0000000..8488d01 + vhost_vsock_stop(vsock); + vhost_vsock_flush(vsock); + vhost_dev_stop(&vsock->dev); ++ ++ spin_lock_bh(&vsock->send_pkt_list_lock); ++ while (!list_empty(&vsock->send_pkt_list)) { ++ struct virtio_vsock_pkt *pkt; ++ ++ pkt = list_first_entry(&vsock->send_pkt_list, ++ struct virtio_vsock_pkt, list); ++ list_del_init(&pkt->list); ++ virtio_transport_free_pkt(pkt); ++ } ++ spin_unlock_bh(&vsock->send_pkt_list_lock); ++ + vhost_dev_cleanup(&vsock->dev, false); + kfree(vsock->dev.vqs); -+ kfree(vsock); ++ vhost_vsock_free(vsock); + return 0; +} + -+static int vhost_vsock_set_cid(struct vhost_vsock *vsock, u32 guest_cid) ++static int vhost_vsock_set_cid(struct vhost_vsock *vsock, u64 guest_cid) +{ + struct vhost_vsock *other; + + /* Refuse reserved CIDs */ -+ if (guest_cid <= VMADDR_CID_HOST) ++ if (guest_cid <= VMADDR_CID_HOST || ++ guest_cid == U32_MAX) ++ return -EINVAL; ++ ++ /* 64-bit CIDs are not yet supported */ ++ if (guest_cid > U32_MAX) + return -EINVAL; + + /* Refuse if CID is already in use */ @@ -577,9 +603,9 @@ index 0000000..8488d01 + if (other && other != vsock) + return -EADDRINUSE; + -+ mutex_lock(&vhost_vsock_mutex); ++ spin_lock_bh(&vhost_vsock_lock); + vsock->guest_cid = guest_cid; -+ mutex_unlock(&vhost_vsock_mutex); ++ spin_unlock_bh(&vhost_vsock_lock); + + return 0; +} @@ -614,26 +640,30 @@ index 0000000..8488d01 +{ + struct vhost_vsock *vsock = f->private_data; + void __user *argp = (void __user *)arg; -+ u64 __user *featurep = argp; -+ u32 __user *cidp = argp; -+ u32 guest_cid; ++ u64 guest_cid; + u64 features; ++ int start; + int r; + + switch (ioctl) { + case VHOST_VSOCK_SET_GUEST_CID: -+ if (get_user(guest_cid, cidp)) ++ if (copy_from_user(&guest_cid, argp, sizeof(guest_cid))) + return -EFAULT; + return vhost_vsock_set_cid(vsock, guest_cid); -+ case VHOST_VSOCK_START: -+ return vhost_vsock_start(vsock); ++ case VHOST_VSOCK_SET_RUNNING: ++ if (copy_from_user(&start, argp, sizeof(start))) ++ return -EFAULT; ++ if (start) ++ return vhost_vsock_start(vsock); ++ else ++ return vhost_vsock_stop(vsock); + case VHOST_GET_FEATURES: + features = VHOST_VSOCK_FEATURES; -+ if (copy_to_user(featurep, &features, sizeof(features))) ++ if (copy_to_user(argp, &features, sizeof(features))) + return -EFAULT; + return 0; + case VHOST_SET_FEATURES: -+ if (copy_from_user(&features, featurep, sizeof(features))) ++ if (copy_from_user(&features, argp, sizeof(features))) + return -EFAULT; + return vhost_vsock_set_features(vsock, features); + default: @@ -705,7 +735,6 @@ index 0000000..8488d01 + }, + + .send_pkt = vhost_transport_send_pkt, -+ .send_pkt_no_sock = vhost_transport_send_pkt_no_sock, +}; + +static int __init vhost_vsock_init(void) @@ -729,17 +758,20 @@ index 0000000..8488d01 +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Asias He"); +MODULE_DESCRIPTION("vhost transport for vsock "); -diff --git a/drivers/vhost/vsock.h b/drivers/vhost/vsock.h -new file mode 100644 -index 0000000..173f9fc ---- /dev/null -+++ b/drivers/vhost/vsock.h -@@ -0,0 +1,5 @@ -+#ifndef VHOST_VSOCK_H -+#define VHOST_VSOCK_H -+#define VHOST_VSOCK_SET_GUEST_CID _IOW(VHOST_VIRTIO, 0x60, __u32) -+#define VHOST_VSOCK_START _IO(VHOST_VIRTIO, 0x61) -+#endif +diff --git a/include/uapi/linux/vhost.h b/include/uapi/linux/vhost.h +index ab373191..b306476 100644 +--- a/include/uapi/linux/vhost.h ++++ b/include/uapi/linux/vhost.h +@@ -169,4 +169,9 @@ struct vhost_scsi_target { + #define VHOST_SCSI_SET_EVENTS_MISSED _IOW(VHOST_VIRTIO, 0x43, __u32) + #define VHOST_SCSI_GET_EVENTS_MISSED _IOW(VHOST_VIRTIO, 0x44, __u32) + ++/* VHOST_VSOCK specific defines */ ++ ++#define VHOST_VSOCK_SET_GUEST_CID _IOW(VHOST_VIRTIO, 0x60, __u64) ++#define VHOST_VSOCK_SET_RUNNING _IOW(VHOST_VIRTIO, 0x61, int) ++ + #endif -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0008-VSOCK-Add-Makefile-and-Kconfig.patch b/alpine/kernel/patches/0010-VSOCK-Add-Makefile-and-Kconfig.patch similarity index 64% rename from alpine/kernel/patches/0008-VSOCK-Add-Makefile-and-Kconfig.patch rename to alpine/kernel/patches/0010-VSOCK-Add-Makefile-and-Kconfig.patch index b524409bb..ecb5ba766 100644 --- a/alpine/kernel/patches/0008-VSOCK-Add-Makefile-and-Kconfig.patch +++ b/alpine/kernel/patches/0010-VSOCK-Add-Makefile-and-Kconfig.patch @@ -1,24 +1,26 @@ -From 17871c8224feaa5cf4944f3f09800968a8f19589 Mon Sep 17 00:00:00 2001 +From 5600cbdcb09f2a322c696e37570d031932a3baa4 Mon Sep 17 00:00:00 2001 From: Asias He -Date: Thu, 13 Jun 2013 18:30:19 +0800 -Subject: [PATCH 08/40] VSOCK: Add Makefile and Kconfig +Date: Thu, 28 Jul 2016 15:36:35 +0100 +Subject: [PATCH 10/46] VSOCK: Add Makefile and Kconfig Enable virtio-vsock and vhost-vsock. Signed-off-by: Asias He Signed-off-by: Stefan Hajnoczi +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 304ba62fd4e670c1a5784585da0fac9f7309ef6c) --- - drivers/vhost/Kconfig | 15 +++++++++++++++ + drivers/vhost/Kconfig | 14 ++++++++++++++ drivers/vhost/Makefile | 4 ++++ - net/vmw_vsock/Kconfig | 19 +++++++++++++++++++ - net/vmw_vsock/Makefile | 2 ++ - 4 files changed, 40 insertions(+) + net/vmw_vsock/Kconfig | 20 ++++++++++++++++++++ + net/vmw_vsock/Makefile | 6 ++++++ + 4 files changed, 44 insertions(+) diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig -index 533eaf0..d7aae9e 100644 +index 533eaf0..2b5f588 100644 --- a/drivers/vhost/Kconfig +++ b/drivers/vhost/Kconfig -@@ -21,6 +21,21 @@ config VHOST_SCSI +@@ -21,6 +21,20 @@ config VHOST_SCSI Say M here to enable the vhost_scsi TCM fabric module for use with virtio-scsi guests @@ -27,7 +29,6 @@ index 533eaf0..d7aae9e 100644 + depends on VSOCKETS && EVENTFD + select VIRTIO_VSOCKETS_COMMON + select VHOST -+ select VHOST_RING + default n + ---help--- + This kernel module can be loaded in the host kernel to provide AF_VSOCK @@ -55,10 +56,10 @@ index e0441c3..6b012b9 100644 + obj-$(CONFIG_VHOST) += vhost.o diff --git a/net/vmw_vsock/Kconfig b/net/vmw_vsock/Kconfig -index 14810ab..f27e74b 100644 +index 14810ab..8831e7c 100644 --- a/net/vmw_vsock/Kconfig +++ b/net/vmw_vsock/Kconfig -@@ -26,3 +26,22 @@ config VMWARE_VMCI_VSOCKETS +@@ -26,3 +26,23 @@ config VMWARE_VMCI_VSOCKETS To compile this driver as a module, choose M here: the module will be called vmw_vsock_vmci_transport. If unsure, say N. @@ -73,26 +74,33 @@ index 14810ab..f27e74b 100644 + Enable this transport if your Virtual Machine host supports Virtual + Sockets over virtio. + -+ To compile this driver as a module, choose M here: the module -+ will be called virtio_vsock_transport. If unsure, say N. ++ To compile this driver as a module, choose M here: the module will be ++ called vmw_vsock_virtio_transport. If unsure, say N. + +config VIRTIO_VSOCKETS_COMMON -+ tristate -+ ---help--- -+ This option is selected by any driver which needs to access -+ the virtio_vsock. ++ tristate ++ help ++ This option is selected by any driver which needs to access ++ the virtio_vsock. The module will be called ++ vmw_vsock_virtio_transport_common. diff --git a/net/vmw_vsock/Makefile b/net/vmw_vsock/Makefile -index 2ce52d7..cf4c294 100644 +index 2ce52d7..bc27c70 100644 --- a/net/vmw_vsock/Makefile +++ b/net/vmw_vsock/Makefile -@@ -1,5 +1,7 @@ +@@ -1,7 +1,13 @@ obj-$(CONFIG_VSOCKETS) += vsock.o obj-$(CONFIG_VMWARE_VMCI_VSOCKETS) += vmw_vsock_vmci_transport.o -+obj-$(CONFIG_VIRTIO_VSOCKETS) += virtio_transport.o -+obj-$(CONFIG_VIRTIO_VSOCKETS_COMMON) += virtio_transport_common.o ++obj-$(CONFIG_VIRTIO_VSOCKETS) += vmw_vsock_virtio_transport.o ++obj-$(CONFIG_VIRTIO_VSOCKETS_COMMON) += vmw_vsock_virtio_transport_common.o vsock-y += af_vsock.o vsock_addr.o + vmw_vsock_vmci_transport-y += vmci_transport.o vmci_transport_notify.o \ + vmci_transport_notify_qstate.o ++ ++vmw_vsock_virtio_transport-y += virtio_transport.o ++ ++vmw_vsock_virtio_transport_common-y += virtio_transport_common.o -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0011-VSOCK-Use-kvfree.patch b/alpine/kernel/patches/0011-VSOCK-Use-kvfree.patch new file mode 100644 index 000000000..8a13a250b --- /dev/null +++ b/alpine/kernel/patches/0011-VSOCK-Use-kvfree.patch @@ -0,0 +1,33 @@ +From d722f0d8acd78f91e079f2fe0b4e4a29b42435b7 Mon Sep 17 00:00:00 2001 +From: Wei Yongjun +Date: Tue, 2 Aug 2016 13:50:42 +0000 +Subject: [PATCH 11/46] VSOCK: Use kvfree() + +Use kvfree() instead of open-coding it. + +Signed-off-by: Wei Yongjun +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit b226acab2f6aaa45c2af27279b63f622b23a44bd) +--- + drivers/vhost/vsock.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c +index 028ca16..0ddf3a2 100644 +--- a/drivers/vhost/vsock.c ++++ b/drivers/vhost/vsock.c +@@ -434,10 +434,7 @@ err: + + static void vhost_vsock_free(struct vhost_vsock *vsock) + { +- if (is_vmalloc_addr(vsock)) +- vfree(vsock); +- else +- kfree(vsock); ++ kvfree(vsock); + } + + static int vhost_vsock_dev_open(struct inode *inode, struct file *file) +-- +2.9.3 + diff --git a/alpine/kernel/patches/0012-vhost-vsock-fix-vhost-virtio_vsock_pkt-use-after-fre.patch b/alpine/kernel/patches/0012-vhost-vsock-fix-vhost-virtio_vsock_pkt-use-after-fre.patch new file mode 100644 index 000000000..e54e75673 --- /dev/null +++ b/alpine/kernel/patches/0012-vhost-vsock-fix-vhost-virtio_vsock_pkt-use-after-fre.patch @@ -0,0 +1,53 @@ +From f2e2e9e439f717e454a1cf0e71e098b19ff0005d Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Thu, 4 Aug 2016 14:52:53 +0100 +Subject: [PATCH 12/46] vhost/vsock: fix vhost virtio_vsock_pkt use-after-free + +Stash the packet length in a local variable before handing over +ownership of the packet to virtio_transport_recv_pkt() or +virtio_transport_free_pkt(). + +This patch solves the use-after-free since pkt is no longer guaranteed +to be alive. + +Reported-by: Dan Carpenter +Signed-off-by: Stefan Hajnoczi +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 3fda5d6e580193fa005014355b3a61498f1b3ae0) +--- + drivers/vhost/vsock.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c +index 0ddf3a2..e3b30ea 100644 +--- a/drivers/vhost/vsock.c ++++ b/drivers/vhost/vsock.c +@@ -307,6 +307,8 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work) + + vhost_disable_notify(&vsock->dev, vq); + for (;;) { ++ u32 len; ++ + if (!vhost_vsock_more_replies(vsock)) { + /* Stop tx until the device processes already + * pending replies. Leave tx virtqueue +@@ -334,13 +336,15 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work) + continue; + } + ++ len = pkt->len; ++ + /* Only accept correctly addressed packets */ + if (le64_to_cpu(pkt->hdr.src_cid) == vsock->guest_cid) + virtio_transport_recv_pkt(pkt); + else + virtio_transport_free_pkt(pkt); + +- vhost_add_used(vq, head, sizeof(pkt->hdr) + pkt->len); ++ vhost_add_used(vq, head, sizeof(pkt->hdr) + len); + added = true; + } + +-- +2.9.3 + diff --git a/alpine/kernel/patches/0013-virtio-vsock-fix-include-guard-typo.patch b/alpine/kernel/patches/0013-virtio-vsock-fix-include-guard-typo.patch new file mode 100644 index 000000000..1f858b3cc --- /dev/null +++ b/alpine/kernel/patches/0013-virtio-vsock-fix-include-guard-typo.patch @@ -0,0 +1,28 @@ +From 1a8274f5f22a79f10aae3b4cf35f9b8a65f7f423 Mon Sep 17 00:00:00 2001 +From: Stefan Hajnoczi +Date: Fri, 5 Aug 2016 13:52:09 +0100 +Subject: [PATCH 13/46] virtio-vsock: fix include guard typo + +Signed-off-by: Stefan Hajnoczi +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 28ad55578b8a76390d966b09da8c7fa3644f5140) +--- + include/uapi/linux/virtio_vsock.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/uapi/linux/virtio_vsock.h b/include/uapi/linux/virtio_vsock.h +index 6b011c1..1d57ed3 100644 +--- a/include/uapi/linux/virtio_vsock.h ++++ b/include/uapi/linux/virtio_vsock.h +@@ -32,7 +32,7 @@ + */ + + #ifndef _UAPI_LINUX_VIRTIO_VSOCK_H +-#define _UAPI_LINUX_VIRTIO_VOSCK_H ++#define _UAPI_LINUX_VIRTIO_VSOCK_H + + #include + #include +-- +2.9.3 + diff --git a/alpine/kernel/patches/0014-vhost-vsock-drop-space-available-check-for-TX-vq.patch b/alpine/kernel/patches/0014-vhost-vsock-drop-space-available-check-for-TX-vq.patch new file mode 100644 index 000000000..c8c5b4b00 --- /dev/null +++ b/alpine/kernel/patches/0014-vhost-vsock-drop-space-available-check-for-TX-vq.patch @@ -0,0 +1,61 @@ +From 5377a4a3e61adb924efdb4ff47ca2213c63e5bc4 Mon Sep 17 00:00:00 2001 +From: Gerard Garcia +Date: Wed, 10 Aug 2016 17:24:34 +0200 +Subject: [PATCH 14/46] vhost/vsock: drop space available check for TX vq + +Remove unnecessary use of enable/disable callback notifications +and the incorrect more space available check. + +The virtio_transport_tx_work handles when the TX virtqueue +has more buffers available. + +Signed-off-by: Gerard Garcia +Acked-by: Stefan Hajnoczi +Signed-off-by: Michael S. Tsirkin +(cherry picked from commit 21bc54fc0cdc31de72b57d2b3c79cf9c2b83cf39) +--- + net/vmw_vsock/virtio_transport.c | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c +index 699dfab..936d7ee 100644 +--- a/net/vmw_vsock/virtio_transport.c ++++ b/net/vmw_vsock/virtio_transport.c +@@ -87,9 +87,6 @@ virtio_transport_send_pkt_work(struct work_struct *work) + + vq = vsock->vqs[VSOCK_VQ_TX]; + +- /* Avoid unnecessary interrupts while we're processing the ring */ +- virtqueue_disable_cb(vq); +- + for (;;) { + struct virtio_vsock_pkt *pkt; + struct scatterlist hdr, buf, *sgs[2]; +@@ -99,7 +96,6 @@ virtio_transport_send_pkt_work(struct work_struct *work) + spin_lock_bh(&vsock->send_pkt_list_lock); + if (list_empty(&vsock->send_pkt_list)) { + spin_unlock_bh(&vsock->send_pkt_list_lock); +- virtqueue_enable_cb(vq); + break; + } + +@@ -118,13 +114,13 @@ virtio_transport_send_pkt_work(struct work_struct *work) + } + + ret = virtqueue_add_sgs(vq, sgs, out_sg, in_sg, pkt, GFP_KERNEL); ++ /* Usually this means that there is no more space available in ++ * the vq ++ */ + if (ret < 0) { + spin_lock_bh(&vsock->send_pkt_list_lock); + list_add(&pkt->list, &vsock->send_pkt_list); + spin_unlock_bh(&vsock->send_pkt_list_lock); +- +- if (!virtqueue_enable_cb(vq) && ret == -ENOSPC) +- continue; /* retry now that we have more space */ + break; + } + +-- +2.9.3 + diff --git a/alpine/kernel/patches/0009-VSOCK-Only-allow-host-network-namespace-to-use-AF_VS.patch b/alpine/kernel/patches/0015-VSOCK-Only-allow-host-network-namespace-to-use-AF_VS.patch similarity index 75% rename from alpine/kernel/patches/0009-VSOCK-Only-allow-host-network-namespace-to-use-AF_VS.patch rename to alpine/kernel/patches/0015-VSOCK-Only-allow-host-network-namespace-to-use-AF_VS.patch index 56ef77da9..5beaa076d 100644 --- a/alpine/kernel/patches/0009-VSOCK-Only-allow-host-network-namespace-to-use-AF_VS.patch +++ b/alpine/kernel/patches/0015-VSOCK-Only-allow-host-network-namespace-to-use-AF_VS.patch @@ -1,7 +1,7 @@ -From a8a0423ba3b9cc33e2c673890d917318be602145 Mon Sep 17 00:00:00 2001 +From fc2bc563ce2a5205b7504c39e8dbb0a5db2d63e9 Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Mon, 4 Apr 2016 14:50:10 +0100 -Subject: [PATCH 09/40] VSOCK: Only allow host network namespace to use +Subject: [PATCH 15/46] VSOCK: Only allow host network namespace to use AF_VSOCK. The VSOCK addressing schema does not really lend itself to simply creating an @@ -13,10 +13,10 @@ Signed-off-by: Ian Campbell 1 file changed, 3 insertions(+) diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c -index 15f9595..8373709 100644 +index 17dbbe6..1bb1b01 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c -@@ -1840,6 +1840,9 @@ static const struct proto_ops vsock_stream_ops = { +@@ -1852,6 +1852,9 @@ static const struct proto_ops vsock_stream_ops = { static int vsock_create(struct net *net, struct socket *sock, int protocol, int kern) { @@ -27,5 +27,5 @@ index 15f9595..8373709 100644 return -EINVAL; -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0010-drivers-hv-Define-the-channel-type-for-Hyper-V-PCI-E.patch b/alpine/kernel/patches/0016-drivers-hv-Define-the-channel-type-for-Hyper-V-PCI-E.patch similarity index 91% rename from alpine/kernel/patches/0010-drivers-hv-Define-the-channel-type-for-Hyper-V-PCI-E.patch rename to alpine/kernel/patches/0016-drivers-hv-Define-the-channel-type-for-Hyper-V-PCI-E.patch index ee23f0bec..d249b435a 100644 --- a/alpine/kernel/patches/0010-drivers-hv-Define-the-channel-type-for-Hyper-V-PCI-E.patch +++ b/alpine/kernel/patches/0016-drivers-hv-Define-the-channel-type-for-Hyper-V-PCI-E.patch @@ -1,7 +1,7 @@ -From bab5ea0c103fe9e59b91e3f02ffd3a45c4e6be4a Mon Sep 17 00:00:00 2001 +From 7c37cbd1fd8bff6d8373cff4d7e1c33fcb2aa653 Mon Sep 17 00:00:00 2001 From: Jake Oshins Date: Mon, 14 Dec 2015 16:01:41 -0800 -Subject: [PATCH 10/40] drivers:hv: Define the channel type for Hyper-V PCI +Subject: [PATCH 16/46] drivers:hv: Define the channel type for Hyper-V PCI Express pass-through This defines the channel type for PCI front-ends in Hyper-V VMs. @@ -59,5 +59,5 @@ index ae6a711..10dda1e 100644 */ -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0011-Drivers-hv-vmbus-Use-uuid_le-type-consistently.patch b/alpine/kernel/patches/0017-Drivers-hv-vmbus-Use-uuid_le-type-consistently.patch similarity index 95% rename from alpine/kernel/patches/0011-Drivers-hv-vmbus-Use-uuid_le-type-consistently.patch rename to alpine/kernel/patches/0017-Drivers-hv-vmbus-Use-uuid_le-type-consistently.patch index 32e354f8c..67ed80b3c 100644 --- a/alpine/kernel/patches/0011-Drivers-hv-vmbus-Use-uuid_le-type-consistently.patch +++ b/alpine/kernel/patches/0017-Drivers-hv-vmbus-Use-uuid_le-type-consistently.patch @@ -1,7 +1,7 @@ -From 6a0ed33229365bc267788283730cde6ddc0c7ff8 Mon Sep 17 00:00:00 2001 +From b26f3791593f6645c4e0e11fd93db7e47390fab6 Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Mon, 14 Dec 2015 16:01:43 -0800 -Subject: [PATCH 11/40] Drivers: hv: vmbus: Use uuid_le type consistently +Subject: [PATCH 17/46] Drivers: hv: vmbus: Use uuid_le type consistently Consistently use uuid_le type in the Hyper-V driver code. @@ -30,10 +30,10 @@ index a77646b..38470aa 100644 perf_chn = true; break; diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index f19b6f7..e64934e 100644 +index 9b5440f..9aadcc2 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c -@@ -531,7 +531,7 @@ static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) +@@ -532,7 +532,7 @@ static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) static const uuid_le null_guid; @@ -42,7 +42,7 @@ index f19b6f7..e64934e 100644 { if (memcmp(guid, &null_guid, sizeof(uuid_le))) return false; -@@ -544,9 +544,9 @@ static inline bool is_null_guid(const __u8 *guid) +@@ -545,9 +545,9 @@ static inline bool is_null_guid(const __u8 *guid) */ static const struct hv_vmbus_device_id *hv_vmbus_get_id( const struct hv_vmbus_device_id *id, @@ -54,7 +54,7 @@ index f19b6f7..e64934e 100644 if (!memcmp(&id->guid, guid, sizeof(uuid_le))) return id; -@@ -563,7 +563,7 @@ static int vmbus_match(struct device *device, struct device_driver *driver) +@@ -564,7 +564,7 @@ static int vmbus_match(struct device *device, struct device_driver *driver) struct hv_driver *drv = drv_to_hv_drv(driver); struct hv_device *hv_dev = device_to_hv_device(device); @@ -63,7 +63,7 @@ index f19b6f7..e64934e 100644 return 1; return 0; -@@ -580,7 +580,7 @@ static int vmbus_probe(struct device *child_device) +@@ -581,7 +581,7 @@ static int vmbus_probe(struct device *child_device) struct hv_device *dev = device_to_hv_device(child_device); const struct hv_vmbus_device_id *dev_id; @@ -280,7 +280,7 @@ index 64f36e0..6e4c645 100644 }; diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c -index 5b96206..8adca44 100644 +index 9f5cdd4..8e8c69b 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -917,7 +917,7 @@ static int do_vmbus_entry(const char *filename, void *symval, @@ -293,5 +293,5 @@ index 5b96206..8adca44 100644 strcpy(alias, "vmbus:"); strcat(alias, guid_name); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0012-Drivers-hv-vmbus-Use-uuid_le_cmp-for-comparing-GUIDs.patch b/alpine/kernel/patches/0018-Drivers-hv-vmbus-Use-uuid_le_cmp-for-comparing-GUIDs.patch similarity index 83% rename from alpine/kernel/patches/0012-Drivers-hv-vmbus-Use-uuid_le_cmp-for-comparing-GUIDs.patch rename to alpine/kernel/patches/0018-Drivers-hv-vmbus-Use-uuid_le_cmp-for-comparing-GUIDs.patch index 06dc53dca..3da4267d0 100644 --- a/alpine/kernel/patches/0012-Drivers-hv-vmbus-Use-uuid_le_cmp-for-comparing-GUIDs.patch +++ b/alpine/kernel/patches/0018-Drivers-hv-vmbus-Use-uuid_le_cmp-for-comparing-GUIDs.patch @@ -1,7 +1,7 @@ -From 2be59f6d9924239fa410a184d06fc7d0338c83fc Mon Sep 17 00:00:00 2001 +From 9ae0af317c2a085434b46197a663165895decaf6 Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Mon, 14 Dec 2015 16:01:44 -0800 -Subject: [PATCH 12/40] Drivers: hv: vmbus: Use uuid_le_cmp() for comparing +Subject: [PATCH 18/46] Drivers: hv: vmbus: Use uuid_le_cmp() for comparing GUIDs Use uuid_le_cmp() for comparing GUIDs. @@ -29,10 +29,10 @@ index 38470aa..dc4fb0b 100644 break; } diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index e64934e..aa4d8cc 100644 +index 9aadcc2..bf54455 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c -@@ -533,7 +533,7 @@ static const uuid_le null_guid; +@@ -534,7 +534,7 @@ static const uuid_le null_guid; static inline bool is_null_guid(const uuid_le *guid) { @@ -41,7 +41,7 @@ index e64934e..aa4d8cc 100644 return false; return true; } -@@ -547,7 +547,7 @@ static const struct hv_vmbus_device_id *hv_vmbus_get_id( +@@ -548,7 +548,7 @@ static const struct hv_vmbus_device_id *hv_vmbus_get_id( const uuid_le *guid) { for (; !is_null_guid(&id->guid); id++) @@ -51,5 +51,5 @@ index e64934e..aa4d8cc 100644 return NULL; -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0013-Drivers-hv-vmbus-serialize-process_chn_event-and-vmb.patch b/alpine/kernel/patches/0019-Drivers-hv-vmbus-serialize-process_chn_event-and-vmb.patch similarity index 95% rename from alpine/kernel/patches/0013-Drivers-hv-vmbus-serialize-process_chn_event-and-vmb.patch rename to alpine/kernel/patches/0019-Drivers-hv-vmbus-serialize-process_chn_event-and-vmb.patch index 83479d605..7b19e429d 100644 --- a/alpine/kernel/patches/0013-Drivers-hv-vmbus-serialize-process_chn_event-and-vmb.patch +++ b/alpine/kernel/patches/0019-Drivers-hv-vmbus-serialize-process_chn_event-and-vmb.patch @@ -1,7 +1,7 @@ -From 5111097f2add634ea6b2964841ad15d9149da96e Mon Sep 17 00:00:00 2001 +From 5c3a0d077f4c0ecd17117c04b0b6fef7e8acbdea Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Mon, 14 Dec 2015 16:01:47 -0800 -Subject: [PATCH 13/40] Drivers: hv: vmbus: serialize process_chn_event() and +Subject: [PATCH 19/46] Drivers: hv: vmbus: serialize process_chn_event() and vmbus_close_internal() process_chn_event(), running in the tasklet, can race with @@ -83,5 +83,5 @@ index 9098f13..6a90c69 100644 } -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0014-Drivers-hv-vmbus-do-sanity-check-of-channel-state-in.patch b/alpine/kernel/patches/0020-Drivers-hv-vmbus-do-sanity-check-of-channel-state-in.patch similarity index 91% rename from alpine/kernel/patches/0014-Drivers-hv-vmbus-do-sanity-check-of-channel-state-in.patch rename to alpine/kernel/patches/0020-Drivers-hv-vmbus-do-sanity-check-of-channel-state-in.patch index a2c8decdf..4ed003690 100644 --- a/alpine/kernel/patches/0014-Drivers-hv-vmbus-do-sanity-check-of-channel-state-in.patch +++ b/alpine/kernel/patches/0020-Drivers-hv-vmbus-do-sanity-check-of-channel-state-in.patch @@ -1,7 +1,7 @@ -From df06857f7adf8fb4bb6cacdc80e174c9cb20ee8a Mon Sep 17 00:00:00 2001 +From 8bba0d5b705be1f1d0bdfe7fa8465042fa936c3c Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Mon, 14 Dec 2015 16:01:48 -0800 -Subject: [PATCH 14/40] Drivers: hv: vmbus: do sanity check of channel state in +Subject: [PATCH 20/46] Drivers: hv: vmbus: do sanity check of channel state in vmbus_close_internal() This fixes an incorrect assumption of channel state in the function. @@ -38,5 +38,5 @@ index 6a90c69..b3c14ca 100644 channel->sc_creation_callback = NULL; /* Stop callback and cancel the timer asap */ -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0015-Drivers-hv-vmbus-fix-rescind-offer-handling-for-devi.patch b/alpine/kernel/patches/0021-Drivers-hv-vmbus-fix-rescind-offer-handling-for-devi.patch similarity index 93% rename from alpine/kernel/patches/0015-Drivers-hv-vmbus-fix-rescind-offer-handling-for-devi.patch rename to alpine/kernel/patches/0021-Drivers-hv-vmbus-fix-rescind-offer-handling-for-devi.patch index b19f9611a..a65a6e127 100644 --- a/alpine/kernel/patches/0015-Drivers-hv-vmbus-fix-rescind-offer-handling-for-devi.patch +++ b/alpine/kernel/patches/0021-Drivers-hv-vmbus-fix-rescind-offer-handling-for-devi.patch @@ -1,7 +1,7 @@ -From 8f7f448b5f9b613f9dec4b4554062c6f709dce96 Mon Sep 17 00:00:00 2001 +From 4185d167c4c6db493a3e96e59689e32562761563 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Mon, 14 Dec 2015 16:01:49 -0800 -Subject: [PATCH 15/40] Drivers: hv: vmbus: fix rescind-offer handling for +Subject: [PATCH 21/46] Drivers: hv: vmbus: fix rescind-offer handling for device without a driver In the path vmbus_onoffer_rescind() -> vmbus_device_unregister() -> @@ -79,10 +79,10 @@ index dc4fb0b..7903acc 100644 vmbus_device_unregister(channel->device_obj); diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index aa4d8cc..5a71b2a 100644 +index bf54455..8bf1f31 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c -@@ -602,23 +602,11 @@ static int vmbus_remove(struct device *child_device) +@@ -603,23 +603,11 @@ static int vmbus_remove(struct device *child_device) { struct hv_driver *drv; struct hv_device *dev = device_to_hv_device(child_device); @@ -106,7 +106,7 @@ index aa4d8cc..5a71b2a 100644 } return 0; -@@ -653,7 +641,10 @@ static void vmbus_shutdown(struct device *child_device) +@@ -654,7 +642,10 @@ static void vmbus_shutdown(struct device *child_device) static void vmbus_device_release(struct device *device) { struct hv_device *hv_dev = device_to_hv_device(device); @@ -118,5 +118,5 @@ index aa4d8cc..5a71b2a 100644 } -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0016-Drivers-hv-vmbus-release-relid-on-error-in-vmbus_pro.patch b/alpine/kernel/patches/0022-Drivers-hv-vmbus-release-relid-on-error-in-vmbus_pro.patch similarity index 94% rename from alpine/kernel/patches/0016-Drivers-hv-vmbus-release-relid-on-error-in-vmbus_pro.patch rename to alpine/kernel/patches/0022-Drivers-hv-vmbus-release-relid-on-error-in-vmbus_pro.patch index 4451ff526..79deac9fe 100644 --- a/alpine/kernel/patches/0016-Drivers-hv-vmbus-release-relid-on-error-in-vmbus_pro.patch +++ b/alpine/kernel/patches/0022-Drivers-hv-vmbus-release-relid-on-error-in-vmbus_pro.patch @@ -1,7 +1,7 @@ -From bf5d3511a1f0b147e32eec71f610e780fd11701a Mon Sep 17 00:00:00 2001 +From 667defbc25ef5dcfa89b60c0bd534d5a27f8c116 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Mon, 14 Dec 2015 16:01:50 -0800 -Subject: [PATCH 16/40] Drivers: hv: vmbus: release relid on error in +Subject: [PATCH 22/46] Drivers: hv: vmbus: release relid on error in vmbus_process_offer() We want to simplify vmbus_onoffer_rescind() by not invoking @@ -70,5 +70,5 @@ index 7903acc..9c9da3a 100644 } -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0017-Drivers-hv-vmbus-channge-vmbus_connection.channel_lo.patch b/alpine/kernel/patches/0023-Drivers-hv-vmbus-channge-vmbus_connection.channel_lo.patch similarity index 96% rename from alpine/kernel/patches/0017-Drivers-hv-vmbus-channge-vmbus_connection.channel_lo.patch rename to alpine/kernel/patches/0023-Drivers-hv-vmbus-channge-vmbus_connection.channel_lo.patch index cdb32f788..a802c9959 100644 --- a/alpine/kernel/patches/0017-Drivers-hv-vmbus-channge-vmbus_connection.channel_lo.patch +++ b/alpine/kernel/patches/0023-Drivers-hv-vmbus-channge-vmbus_connection.channel_lo.patch @@ -1,7 +1,7 @@ -From dfc150e7bb90be0591784b1f8a532670ee1c011a Mon Sep 17 00:00:00 2001 +From 235e2935d2d0700ac21db0cb0d6a64d6f9ff09fa Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Mon, 14 Dec 2015 16:01:51 -0800 -Subject: [PATCH 17/40] Drivers: hv: vmbus: channge +Subject: [PATCH 23/46] Drivers: hv: vmbus: channge vmbus_connection.channel_lock to mutex spinlock is unnecessary here. @@ -112,5 +112,5 @@ index 3782636..d9937be 100644 struct workqueue_struct *work_queue; }; -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0018-Drivers-hv-remove-code-duplication-between-vmbus_rec.patch b/alpine/kernel/patches/0024-Drivers-hv-remove-code-duplication-between-vmbus_rec.patch similarity index 96% rename from alpine/kernel/patches/0018-Drivers-hv-remove-code-duplication-between-vmbus_rec.patch rename to alpine/kernel/patches/0024-Drivers-hv-remove-code-duplication-between-vmbus_rec.patch index acd6e06c8..501fc0393 100644 --- a/alpine/kernel/patches/0018-Drivers-hv-remove-code-duplication-between-vmbus_rec.patch +++ b/alpine/kernel/patches/0024-Drivers-hv-remove-code-duplication-between-vmbus_rec.patch @@ -1,7 +1,7 @@ -From c1ebc6e51a4e579e5b20ba4fd517e0da7dc563d1 Mon Sep 17 00:00:00 2001 +From d6cc8615d22926bb1e2d8ba85fd391df9f1cf089 Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Mon, 14 Dec 2015 19:02:00 -0800 -Subject: [PATCH 18/40] Drivers: hv: remove code duplication between +Subject: [PATCH 24/46] Drivers: hv: remove code duplication between vmbus_recvpacket()/vmbus_recvpacket_raw() vmbus_recvpacket() and vmbus_recvpacket_raw() are almost identical but @@ -122,5 +122,5 @@ index 2889d97..dd6de7f 100644 } EXPORT_SYMBOL_GPL(vmbus_recvpacket_raw); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0019-Drivers-hv-vmbus-fix-the-building-warning-with-hyper.patch b/alpine/kernel/patches/0025-Drivers-hv-vmbus-fix-the-building-warning-with-hyper.patch similarity index 94% rename from alpine/kernel/patches/0019-Drivers-hv-vmbus-fix-the-building-warning-with-hyper.patch rename to alpine/kernel/patches/0025-Drivers-hv-vmbus-fix-the-building-warning-with-hyper.patch index 362923279..4cc594162 100644 --- a/alpine/kernel/patches/0019-Drivers-hv-vmbus-fix-the-building-warning-with-hyper.patch +++ b/alpine/kernel/patches/0025-Drivers-hv-vmbus-fix-the-building-warning-with-hyper.patch @@ -1,7 +1,7 @@ -From cc4a6558e39bfc3042357669ff74d13f55e4f856 Mon Sep 17 00:00:00 2001 +From 64c112c50e6a404431f5adc7685915cd9b5e8d42 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Mon, 21 Dec 2015 12:21:22 -0800 -Subject: [PATCH 19/40] Drivers: hv: vmbus: fix the building warning with +Subject: [PATCH 25/46] Drivers: hv: vmbus: fix the building warning with hyperv-keyboard With the recent change af3ff643ea91ba64dd8d0b1cbed54d44512f96cd @@ -68,5 +68,5 @@ index 4712d7d..9e2de6a 100644 */ #define HV_VSS_GUID \ -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0020-Drivers-hv-vmbus-Treat-Fibre-Channel-devices-as-perf.patch b/alpine/kernel/patches/0026-Drivers-hv-vmbus-Treat-Fibre-Channel-devices-as-perf.patch similarity index 89% rename from alpine/kernel/patches/0020-Drivers-hv-vmbus-Treat-Fibre-Channel-devices-as-perf.patch rename to alpine/kernel/patches/0026-Drivers-hv-vmbus-Treat-Fibre-Channel-devices-as-perf.patch index bfef6f4ca..53c5d83e7 100644 --- a/alpine/kernel/patches/0020-Drivers-hv-vmbus-Treat-Fibre-Channel-devices-as-perf.patch +++ b/alpine/kernel/patches/0026-Drivers-hv-vmbus-Treat-Fibre-Channel-devices-as-perf.patch @@ -1,7 +1,7 @@ -From e9725d58380af9a2549b7fc76f512fc8bddea14b Mon Sep 17 00:00:00 2001 +From 6ee99ea70b9975b03c436c05a55c154bed392a94 Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Tue, 15 Dec 2015 16:27:27 -0800 -Subject: [PATCH 20/40] Drivers: hv: vmbus: Treat Fibre Channel devices as +Subject: [PATCH 26/46] Drivers: hv: vmbus: Treat Fibre Channel devices as performance critical For performance critical devices, we distribute the incoming @@ -38,5 +38,5 @@ index d013171..1c1ad47 100644 { HV_NIC_GUID, }, /* NetworkDirect Guest RDMA */ -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0021-Drivers-hv-vmbus-Add-vendor-and-device-atttributes.patch b/alpine/kernel/patches/0027-Drivers-hv-vmbus-Add-vendor-and-device-atttributes.patch similarity index 96% rename from alpine/kernel/patches/0021-Drivers-hv-vmbus-Add-vendor-and-device-atttributes.patch rename to alpine/kernel/patches/0027-Drivers-hv-vmbus-Add-vendor-and-device-atttributes.patch index 8dc933c90..f8ff33ff7 100644 --- a/alpine/kernel/patches/0021-Drivers-hv-vmbus-Add-vendor-and-device-atttributes.patch +++ b/alpine/kernel/patches/0027-Drivers-hv-vmbus-Add-vendor-and-device-atttributes.patch @@ -1,7 +1,7 @@ -From 396bc263df13d54d2468c5d2a7888fc9f4067894 Mon Sep 17 00:00:00 2001 +From 5131dc31aecd376785b71bb3bb16bf70573682b3 Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Fri, 25 Dec 2015 20:00:30 -0800 -Subject: [PATCH 21/40] Drivers: hv: vmbus: Add vendor and device atttributes +Subject: [PATCH 27/46] Drivers: hv: vmbus: Add vendor and device atttributes Add vendor and device attributes to VMBUS devices. These will be used by Hyper-V tools as well user-level RDMA libraries that will use the @@ -259,10 +259,10 @@ index 1c1ad47..107d72f 100644 (vmbus_proto_version == VERSION_WIN7) || (!perf_chn)) { /* diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index 5a71b2a..3b83dfe 100644 +index 8bf1f31..959b656 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c -@@ -478,6 +478,24 @@ static ssize_t channel_vp_mapping_show(struct device *dev, +@@ -479,6 +479,24 @@ static ssize_t channel_vp_mapping_show(struct device *dev, } static DEVICE_ATTR_RO(channel_vp_mapping); @@ -287,7 +287,7 @@ index 5a71b2a..3b83dfe 100644 /* Set up per device attributes in /sys/bus/vmbus/devices/ */ static struct attribute *vmbus_attrs[] = { &dev_attr_id.attr, -@@ -503,6 +521,8 @@ static struct attribute *vmbus_attrs[] = { +@@ -504,6 +522,8 @@ static struct attribute *vmbus_attrs[] = { &dev_attr_in_read_bytes_avail.attr, &dev_attr_in_write_bytes_avail.attr, &dev_attr_channel_vp_mapping.attr, @@ -296,7 +296,7 @@ index 5a71b2a..3b83dfe 100644 NULL, }; ATTRIBUTE_GROUPS(vmbus); -@@ -957,6 +977,7 @@ struct hv_device *vmbus_device_create(const uuid_le *type, +@@ -960,6 +980,7 @@ struct hv_device *vmbus_device_create(const uuid_le *type, memcpy(&child_device_obj->dev_type, type, sizeof(uuid_le)); memcpy(&child_device_obj->dev_instance, instance, sizeof(uuid_le)); @@ -351,5 +351,5 @@ index 9e2de6a..51c98fd 100644 struct device device; -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0022-Drivers-hv-vmbus-avoid-infinite-loop-in-init_vp_inde.patch b/alpine/kernel/patches/0028-Drivers-hv-vmbus-avoid-infinite-loop-in-init_vp_inde.patch similarity index 92% rename from alpine/kernel/patches/0022-Drivers-hv-vmbus-avoid-infinite-loop-in-init_vp_inde.patch rename to alpine/kernel/patches/0028-Drivers-hv-vmbus-avoid-infinite-loop-in-init_vp_inde.patch index 3b2e75a12..9a707241c 100644 --- a/alpine/kernel/patches/0022-Drivers-hv-vmbus-avoid-infinite-loop-in-init_vp_inde.patch +++ b/alpine/kernel/patches/0028-Drivers-hv-vmbus-avoid-infinite-loop-in-init_vp_inde.patch @@ -1,7 +1,7 @@ -From 864ad2a0988143fecd3b3c9282777a6930b34d5e Mon Sep 17 00:00:00 2001 +From 2dd3d37c7e1a4ce1adeb2a4af3df878907d44ebe Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Wed, 27 Jan 2016 22:29:34 -0800 -Subject: [PATCH 22/40] Drivers: hv: vmbus: avoid infinite loop in +Subject: [PATCH 28/46] Drivers: hv: vmbus: avoid infinite loop in init_vp_index() When we pick a CPU to use for a new subchannel we try find a non-used one @@ -45,5 +45,5 @@ index 107d72f..af1d82e 100644 cur_cpu = cpumask_next(cur_cpu, &available_mask); if (cur_cpu >= nr_cpu_ids) { -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0023-Drivers-hv-vmbus-avoid-scheduling-in-interrupt-conte.patch b/alpine/kernel/patches/0029-Drivers-hv-vmbus-avoid-scheduling-in-interrupt-conte.patch similarity index 95% rename from alpine/kernel/patches/0023-Drivers-hv-vmbus-avoid-scheduling-in-interrupt-conte.patch rename to alpine/kernel/patches/0029-Drivers-hv-vmbus-avoid-scheduling-in-interrupt-conte.patch index 5da7f514d..2ae3337ec 100644 --- a/alpine/kernel/patches/0023-Drivers-hv-vmbus-avoid-scheduling-in-interrupt-conte.patch +++ b/alpine/kernel/patches/0029-Drivers-hv-vmbus-avoid-scheduling-in-interrupt-conte.patch @@ -1,7 +1,7 @@ -From fa2a38837ff00acfa5a1cb8fedbff33260f36653 Mon Sep 17 00:00:00 2001 +From f478bef9bcd76c17c338c7c96422f22dad0d02e3 Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Wed, 27 Jan 2016 22:29:35 -0800 -Subject: [PATCH 23/40] Drivers: hv: vmbus: avoid scheduling in interrupt +Subject: [PATCH 29/46] Drivers: hv: vmbus: avoid scheduling in interrupt context in vmbus_initiate_unload() We have to call vmbus_initiate_unload() on crash to make kdump work but @@ -95,5 +95,5 @@ index af1d82e..d6c6114 100644 /* -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0024-Drivers-hv-vmbus-add-a-helper-function-to-set-a-chan.patch b/alpine/kernel/patches/0030-Drivers-hv-vmbus-add-a-helper-function-to-set-a-chan.patch similarity index 88% rename from alpine/kernel/patches/0024-Drivers-hv-vmbus-add-a-helper-function-to-set-a-chan.patch rename to alpine/kernel/patches/0030-Drivers-hv-vmbus-add-a-helper-function-to-set-a-chan.patch index bc90c47f0..2923f53f7 100644 --- a/alpine/kernel/patches/0024-Drivers-hv-vmbus-add-a-helper-function-to-set-a-chan.patch +++ b/alpine/kernel/patches/0030-Drivers-hv-vmbus-add-a-helper-function-to-set-a-chan.patch @@ -1,7 +1,7 @@ -From d24827511ecaab87a0763e43a13e7c742338ca90 Mon Sep 17 00:00:00 2001 +From 1686f700609459bc6cf9d4597a8a39bf5f133409 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Wed, 27 Jan 2016 22:29:37 -0800 -Subject: [PATCH 24/40] Drivers: hv: vmbus: add a helper function to set a +Subject: [PATCH 30/46] Drivers: hv: vmbus: add a helper function to set a channel's pending send size This will be used by the coming net/hvsock driver. @@ -32,5 +32,5 @@ index 51c98fd..934542a 100644 int vmbus_request_offers(void); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0025-Drivers-hv-vmbus-define-the-new-offer-type-for-Hyper.patch b/alpine/kernel/patches/0031-Drivers-hv-vmbus-define-the-new-offer-type-for-Hyper.patch similarity index 90% rename from alpine/kernel/patches/0025-Drivers-hv-vmbus-define-the-new-offer-type-for-Hyper.patch rename to alpine/kernel/patches/0031-Drivers-hv-vmbus-define-the-new-offer-type-for-Hyper.patch index 6ecd7cb07..f0b00c742 100644 --- a/alpine/kernel/patches/0025-Drivers-hv-vmbus-define-the-new-offer-type-for-Hyper.patch +++ b/alpine/kernel/patches/0031-Drivers-hv-vmbus-define-the-new-offer-type-for-Hyper.patch @@ -1,7 +1,7 @@ -From 81caa506ed7b4af65b15c7f79e2cd82ba9565d8e Mon Sep 17 00:00:00 2001 +From f22a67d17cb1f357da61258ee181729bcf0af3b1 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Wed, 27 Jan 2016 22:29:38 -0800 -Subject: [PATCH 25/40] Drivers: hv: vmbus: define the new offer type for +Subject: [PATCH 31/46] Drivers: hv: vmbus: define the new offer type for Hyper-V socket (hvsock) A helper function is also added. @@ -40,5 +40,5 @@ index 934542a..a4f105d 100644 enum hv_signal_policy policy) { -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0026-Drivers-hv-vmbus-vmbus_sendpacket_ctl-hvsock-avoid-u.patch b/alpine/kernel/patches/0032-Drivers-hv-vmbus-vmbus_sendpacket_ctl-hvsock-avoid-u.patch similarity index 91% rename from alpine/kernel/patches/0026-Drivers-hv-vmbus-vmbus_sendpacket_ctl-hvsock-avoid-u.patch rename to alpine/kernel/patches/0032-Drivers-hv-vmbus-vmbus_sendpacket_ctl-hvsock-avoid-u.patch index 7f61e070a..cbb2c68ff 100644 --- a/alpine/kernel/patches/0026-Drivers-hv-vmbus-vmbus_sendpacket_ctl-hvsock-avoid-u.patch +++ b/alpine/kernel/patches/0032-Drivers-hv-vmbus-vmbus_sendpacket_ctl-hvsock-avoid-u.patch @@ -1,7 +1,7 @@ -From 460356566f2e7d6a3b8f70154d0208620ee93063 Mon Sep 17 00:00:00 2001 +From 6d465cc94028d9c3b7e36996b09e7c9d95b269f3 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Wed, 27 Jan 2016 22:29:39 -0800 -Subject: [PATCH 26/40] Drivers: hv: vmbus: vmbus_sendpacket_ctl: hvsock: avoid +Subject: [PATCH 32/46] Drivers: hv: vmbus: vmbus_sendpacket_ctl: hvsock: avoid unnecessary signaling When the hvsock channel's outbound ringbuffer is full (i.e., @@ -41,5 +41,5 @@ index dd6de7f..128dcf2 100644 return ret; -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0027-Drivers-hv-vmbus-define-a-new-VMBus-message-type-for.patch b/alpine/kernel/patches/0033-Drivers-hv-vmbus-define-a-new-VMBus-message-type-for.patch similarity index 96% rename from alpine/kernel/patches/0027-Drivers-hv-vmbus-define-a-new-VMBus-message-type-for.patch rename to alpine/kernel/patches/0033-Drivers-hv-vmbus-define-a-new-VMBus-message-type-for.patch index a2f443826..b1f1f4562 100644 --- a/alpine/kernel/patches/0027-Drivers-hv-vmbus-define-a-new-VMBus-message-type-for.patch +++ b/alpine/kernel/patches/0033-Drivers-hv-vmbus-define-a-new-VMBus-message-type-for.patch @@ -1,7 +1,7 @@ -From 7b1854b482f0a1e22e3ff5dfc5111ae968354b55 Mon Sep 17 00:00:00 2001 +From 7a337a1dcbdcb4c5ab22822f5cbf5b5fbe45551c Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Wed, 27 Jan 2016 22:29:40 -0800 -Subject: [PATCH 27/40] Drivers: hv: vmbus: define a new VMBus message type for +Subject: [PATCH 33/46] Drivers: hv: vmbus: define a new VMBus message type for hvsock A function to send the type of message is also added. @@ -97,5 +97,5 @@ index a4f105d..191bc5d 100644 + const uuid_le *shv_host_servie_id); #endif /* _HYPERV_H */ -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0028-Drivers-hv-vmbus-add-a-hvsock-flag-in-struct-hv_driv.patch b/alpine/kernel/patches/0034-Drivers-hv-vmbus-add-a-hvsock-flag-in-struct-hv_driv.patch similarity index 90% rename from alpine/kernel/patches/0028-Drivers-hv-vmbus-add-a-hvsock-flag-in-struct-hv_driv.patch rename to alpine/kernel/patches/0034-Drivers-hv-vmbus-add-a-hvsock-flag-in-struct-hv_driv.patch index 9f4a78bc0..0642ce2a7 100644 --- a/alpine/kernel/patches/0028-Drivers-hv-vmbus-add-a-hvsock-flag-in-struct-hv_driv.patch +++ b/alpine/kernel/patches/0034-Drivers-hv-vmbus-add-a-hvsock-flag-in-struct-hv_driv.patch @@ -1,7 +1,7 @@ -From 80bf79d36dbffe682ccc62c8a4210e3ba4a6ecd3 Mon Sep 17 00:00:00 2001 +From 6a067b8e07452ec14629bea5bfe0951877c27451 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Wed, 27 Jan 2016 22:29:41 -0800 -Subject: [PATCH 28/40] Drivers: hv: vmbus: add a hvsock flag in struct +Subject: [PATCH 34/46] Drivers: hv: vmbus: add a hvsock flag in struct hv_driver Only the coming hv_sock driver has a "true" value for this flag. @@ -20,10 +20,10 @@ Signed-off-by: Greg Kroah-Hartman 2 files changed, 18 insertions(+) diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index 3b83dfe..d76a65f 100644 +index 959b656..d46b4ff 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c -@@ -583,6 +583,10 @@ static int vmbus_match(struct device *device, struct device_driver *driver) +@@ -584,6 +584,10 @@ static int vmbus_match(struct device *device, struct device_driver *driver) struct hv_driver *drv = drv_to_hv_drv(driver); struct hv_device *hv_dev = device_to_hv_device(device); @@ -60,5 +60,5 @@ index 191bc5d..05966e2 100644 uuid_le dev_type; const struct hv_vmbus_device_id *id_table; -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0029-Drivers-hv-vmbus-add-a-per-channel-rescind-callback.patch b/alpine/kernel/patches/0035-Drivers-hv-vmbus-add-a-per-channel-rescind-callback.patch similarity index 94% rename from alpine/kernel/patches/0029-Drivers-hv-vmbus-add-a-per-channel-rescind-callback.patch rename to alpine/kernel/patches/0035-Drivers-hv-vmbus-add-a-per-channel-rescind-callback.patch index 840a878f0..7ba70125a 100644 --- a/alpine/kernel/patches/0029-Drivers-hv-vmbus-add-a-per-channel-rescind-callback.patch +++ b/alpine/kernel/patches/0035-Drivers-hv-vmbus-add-a-per-channel-rescind-callback.patch @@ -1,7 +1,7 @@ -From 82e699723be65d45ae64999eb60bde5cbb016368 Mon Sep 17 00:00:00 2001 +From e8bf64d13b450b3a224bd12779c38931e4a5691d Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Wed, 27 Jan 2016 22:29:42 -0800 -Subject: [PATCH 29/40] Drivers: hv: vmbus: add a per-channel rescind callback +Subject: [PATCH 35/46] Drivers: hv: vmbus: add a per-channel rescind callback This will be used by the coming hv_sock driver. @@ -68,5 +68,5 @@ index 05966e2..ad04017 100644 * Retrieve the (sub) channel on which to send an outgoing request. * When a primary channel has multiple sub-channels, we choose a -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0030-Drivers-hv-vmbus-add-an-API-vmbus_hvsock_device_unre.patch b/alpine/kernel/patches/0036-Drivers-hv-vmbus-add-an-API-vmbus_hvsock_device_unre.patch similarity index 97% rename from alpine/kernel/patches/0030-Drivers-hv-vmbus-add-an-API-vmbus_hvsock_device_unre.patch rename to alpine/kernel/patches/0036-Drivers-hv-vmbus-add-an-API-vmbus_hvsock_device_unre.patch index fe7291698..0dc43d99d 100644 --- a/alpine/kernel/patches/0030-Drivers-hv-vmbus-add-an-API-vmbus_hvsock_device_unre.patch +++ b/alpine/kernel/patches/0036-Drivers-hv-vmbus-add-an-API-vmbus_hvsock_device_unre.patch @@ -1,7 +1,7 @@ -From d29f80db881010c9eb7f7f09e33adcb2ec815f58 Mon Sep 17 00:00:00 2001 +From b27d9192ab78946005526ee9574bc971b69205a2 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Wed, 27 Jan 2016 22:29:43 -0800 -Subject: [PATCH 30/40] Drivers: hv: vmbus: add an API +Subject: [PATCH 36/46] Drivers: hv: vmbus: add an API vmbus_hvsock_device_unregister() The hvsock driver needs this API to release all the resources related @@ -149,5 +149,5 @@ index ad04017..993318a 100644 resource_size_t min, resource_size_t max, resource_size_t size, resource_size_t align, -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0031-Drivers-hv-vmbus-Give-control-over-how-the-ring-acce.patch b/alpine/kernel/patches/0037-Drivers-hv-vmbus-Give-control-over-how-the-ring-acce.patch similarity index 98% rename from alpine/kernel/patches/0031-Drivers-hv-vmbus-Give-control-over-how-the-ring-acce.patch rename to alpine/kernel/patches/0037-Drivers-hv-vmbus-Give-control-over-how-the-ring-acce.patch index 5908e7049..e36ff3198 100644 --- a/alpine/kernel/patches/0031-Drivers-hv-vmbus-Give-control-over-how-the-ring-acce.patch +++ b/alpine/kernel/patches/0037-Drivers-hv-vmbus-Give-control-over-how-the-ring-acce.patch @@ -1,7 +1,7 @@ -From 73a45a3f46df47b046fea2fa656602a3422ba54a Mon Sep 17 00:00:00 2001 +From d5f89659d3c0c5e05c3a76c3cc1b84aa505bc06e Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Wed, 27 Jan 2016 22:29:45 -0800 -Subject: [PATCH 31/40] Drivers: hv: vmbus: Give control over how the ring +Subject: [PATCH 37/46] Drivers: hv: vmbus: Give control over how the ring access is serialized On the channel send side, many of the VMBUS @@ -204,5 +204,5 @@ index 993318a..6c9695e 100644 { return !!(c->offermsg.offer.chn_flags & -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0032-Drivers-hv-vmbus-avoid-wait_for_completion-on-crash.patch b/alpine/kernel/patches/0038-Drivers-hv-vmbus-avoid-wait_for_completion-on-crash.patch similarity index 92% rename from alpine/kernel/patches/0032-Drivers-hv-vmbus-avoid-wait_for_completion-on-crash.patch rename to alpine/kernel/patches/0038-Drivers-hv-vmbus-avoid-wait_for_completion-on-crash.patch index 12a1e6030..28ee6214d 100644 --- a/alpine/kernel/patches/0032-Drivers-hv-vmbus-avoid-wait_for_completion-on-crash.patch +++ b/alpine/kernel/patches/0038-Drivers-hv-vmbus-avoid-wait_for_completion-on-crash.patch @@ -1,7 +1,7 @@ -From aa5c8776d3db2e7f09804631aec6d8e7b7265332 Mon Sep 17 00:00:00 2001 +From f565fcc8decc0d57427b8506ea4b430de70440b1 Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Fri, 26 Feb 2016 15:13:16 -0800 -Subject: [PATCH 32/40] Drivers: hv: vmbus: avoid wait_for_completion() on +Subject: [PATCH 38/46] Drivers: hv: vmbus: avoid wait_for_completion() on crash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -74,10 +74,10 @@ index b925fa3..10efab0 100644 static inline void hv_poll_channel(struct vmbus_channel *channel, void (*cb)(void *)) diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c -index d76a65f..45ea71e 100644 +index d46b4ff..f5f57ee 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c -@@ -1263,7 +1263,7 @@ static void hv_kexec_handler(void) +@@ -1266,7 +1266,7 @@ static void hv_kexec_handler(void) int cpu; hv_synic_clockevents_cleanup(); @@ -86,7 +86,7 @@ index d76a65f..45ea71e 100644 for_each_online_cpu(cpu) smp_call_function_single(cpu, hv_synic_cleanup, NULL, 1); hv_cleanup(); -@@ -1271,7 +1271,7 @@ static void hv_kexec_handler(void) +@@ -1274,7 +1274,7 @@ static void hv_kexec_handler(void) static void hv_crash_handler(struct pt_regs *regs) { @@ -96,5 +96,5 @@ index d76a65f..45ea71e 100644 * In crash handler we can't schedule synic cleanup for all CPUs, * doing the cleanup for current CPU only. This should be sufficient -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0033-Drivers-hv-vmbus-avoid-unneeded-compiler-optimizatio.patch b/alpine/kernel/patches/0039-Drivers-hv-vmbus-avoid-unneeded-compiler-optimizatio.patch similarity index 90% rename from alpine/kernel/patches/0033-Drivers-hv-vmbus-avoid-unneeded-compiler-optimizatio.patch rename to alpine/kernel/patches/0039-Drivers-hv-vmbus-avoid-unneeded-compiler-optimizatio.patch index fe8571b99..b3f28682f 100644 --- a/alpine/kernel/patches/0033-Drivers-hv-vmbus-avoid-unneeded-compiler-optimizatio.patch +++ b/alpine/kernel/patches/0039-Drivers-hv-vmbus-avoid-unneeded-compiler-optimizatio.patch @@ -1,7 +1,7 @@ -From f6eda6e9caee4b2eac5c5ad7a63002b7691f2102 Mon Sep 17 00:00:00 2001 +From 0b4365983ef397e8b43f9f77e591c4c9f83fca26 Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Fri, 26 Feb 2016 15:13:18 -0800 -Subject: [PATCH 33/40] Drivers: hv: vmbus: avoid unneeded compiler +Subject: [PATCH 39/46] Drivers: hv: vmbus: avoid unneeded compiler optimizations in vmbus_wait_for_unload() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -35,5 +35,5 @@ index f70e352..c892db5 100644 continue; } -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0034-kcm-Kernel-Connection-Multiplexor-module.patch b/alpine/kernel/patches/0040-kcm-Kernel-Connection-Multiplexor-module.patch similarity index 99% rename from alpine/kernel/patches/0034-kcm-Kernel-Connection-Multiplexor-module.patch rename to alpine/kernel/patches/0040-kcm-Kernel-Connection-Multiplexor-module.patch index 077466d68..b27b58471 100644 --- a/alpine/kernel/patches/0034-kcm-Kernel-Connection-Multiplexor-module.patch +++ b/alpine/kernel/patches/0040-kcm-Kernel-Connection-Multiplexor-module.patch @@ -1,7 +1,7 @@ -From f377090a6256e4bbe8bc26ee524a03ea198fb402 Mon Sep 17 00:00:00 2001 +From f3d84d9ee57ed72603ea8334302c2ed2971882b9 Mon Sep 17 00:00:00 2001 From: Tom Herbert Date: Mon, 7 Mar 2016 14:11:06 -0800 -Subject: [PATCH 34/40] kcm: Kernel Connection Multiplexor module +Subject: [PATCH 40/46] kcm: Kernel Connection Multiplexor module This module implements the Kernel Connection Multiplexor. @@ -2308,5 +2308,5 @@ index 0000000..649d246 +MODULE_LICENSE("GPL"); +MODULE_ALIAS_NETPROTO(PF_KCM); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0035-net-add-the-AF_KCM-entries-to-family-name-tables.patch b/alpine/kernel/patches/0041-net-add-the-AF_KCM-entries-to-family-name-tables.patch similarity index 94% rename from alpine/kernel/patches/0035-net-add-the-AF_KCM-entries-to-family-name-tables.patch rename to alpine/kernel/patches/0041-net-add-the-AF_KCM-entries-to-family-name-tables.patch index 255824c7b..a06100c1d 100644 --- a/alpine/kernel/patches/0035-net-add-the-AF_KCM-entries-to-family-name-tables.patch +++ b/alpine/kernel/patches/0041-net-add-the-AF_KCM-entries-to-family-name-tables.patch @@ -1,7 +1,7 @@ -From 1aaf078c41b6150c42a40ca165003c5b902ba541 Mon Sep 17 00:00:00 2001 +From d436f250cb94cdc0f8ceb18c73e641f8285f2c87 Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Mon, 21 Mar 2016 02:51:09 -0700 -Subject: [PATCH 35/40] net: add the AF_KCM entries to family name tables +Subject: [PATCH 41/46] net: add the AF_KCM entries to family name tables This is for the recent kcm driver, which introduces AF_KCM(41) in b7ac4eb(kcm: Kernel Connection Multiplexor module). @@ -48,5 +48,5 @@ index 0d91f7d..925def4 100644 /* -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0036-net-Add-Qualcomm-IPC-router.patch b/alpine/kernel/patches/0042-net-Add-Qualcomm-IPC-router.patch similarity index 99% rename from alpine/kernel/patches/0036-net-Add-Qualcomm-IPC-router.patch rename to alpine/kernel/patches/0042-net-Add-Qualcomm-IPC-router.patch index 9f2e9a442..7f528f523 100644 --- a/alpine/kernel/patches/0036-net-Add-Qualcomm-IPC-router.patch +++ b/alpine/kernel/patches/0042-net-Add-Qualcomm-IPC-router.patch @@ -1,7 +1,7 @@ -From 46cb53195e3a65ab11c6447b855ef9684f29812b Mon Sep 17 00:00:00 2001 +From 550437ba0f633b470b719d981110cbd38a4a83c4 Mon Sep 17 00:00:00 2001 From: Courtney Cavin Date: Wed, 27 Apr 2016 12:13:03 -0700 -Subject: [PATCH 36/40] net: Add Qualcomm IPC router +Subject: [PATCH 42/46] net: Add Qualcomm IPC router Add an implementation of Qualcomm's IPC router protocol, used to communicate with service providing remote processors. @@ -1303,5 +1303,5 @@ index 0000000..84ebce7 +MODULE_DESCRIPTION("Qualcomm IPC-Router SMD interface driver"); +MODULE_LICENSE("GPL v2"); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0037-hv_sock-introduce-Hyper-V-Sockets.patch b/alpine/kernel/patches/0043-hv_sock-introduce-Hyper-V-Sockets.patch similarity index 99% rename from alpine/kernel/patches/0037-hv_sock-introduce-Hyper-V-Sockets.patch rename to alpine/kernel/patches/0043-hv_sock-introduce-Hyper-V-Sockets.patch index b3e6f6b56..9cb20ceba 100644 --- a/alpine/kernel/patches/0037-hv_sock-introduce-Hyper-V-Sockets.patch +++ b/alpine/kernel/patches/0043-hv_sock-introduce-Hyper-V-Sockets.patch @@ -1,7 +1,7 @@ -From 04b3d63b757432d90ce323a748b85a866114d9ac Mon Sep 17 00:00:00 2001 +From 87e2463282f0dc46f866cce2efd5cb36eb964bdb Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Sun, 15 May 2016 09:53:11 -0700 -Subject: [PATCH 37/40] hv_sock: introduce Hyper-V Sockets +Subject: [PATCH 43/46] hv_sock: introduce Hyper-V Sockets Hyper-V Sockets (hv_sock) supplies a byte-stream based communication mechanism between the host and the guest. It's somewhat like TCP over @@ -41,10 +41,10 @@ Origin: https://patchwork.ozlabs.org/patch/622404/ create mode 100644 net/hv_sock/af_hvsock.c diff --git a/MAINTAINERS b/MAINTAINERS -index 12d49f5..fa87bdd 100644 +index fa94182..ff17e76 100644 --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -5123,7 +5123,9 @@ F: drivers/input/serio/hyperv-keyboard.c +@@ -5136,7 +5136,9 @@ F: drivers/input/serio/hyperv-keyboard.c F: drivers/net/hyperv/ F: drivers/scsi/storvsc_drv.c F: drivers/video/fbdev/hyperv_fb.c @@ -1801,5 +1801,5 @@ index 0000000..b91bd60 +MODULE_DESCRIPTION("Hyper-V Sockets"); +MODULE_LICENSE("Dual BSD/GPL"); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0038-net-add-the-AF_HYPERV-entries-to-family-name-tables.patch b/alpine/kernel/patches/0044-net-add-the-AF_HYPERV-entries-to-family-name-tables.patch similarity index 93% rename from alpine/kernel/patches/0038-net-add-the-AF_HYPERV-entries-to-family-name-tables.patch rename to alpine/kernel/patches/0044-net-add-the-AF_HYPERV-entries-to-family-name-tables.patch index 46437ca1f..f43f27997 100644 --- a/alpine/kernel/patches/0038-net-add-the-AF_HYPERV-entries-to-family-name-tables.patch +++ b/alpine/kernel/patches/0044-net-add-the-AF_HYPERV-entries-to-family-name-tables.patch @@ -1,7 +1,7 @@ -From 179a4a8d5ad76cab98d2bc4b0f2633898d59e9f8 Mon Sep 17 00:00:00 2001 +From d3aac2768b413cea5e281290dfe236d7531638ad Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Mon, 21 Mar 2016 02:53:08 -0700 -Subject: [PATCH 38/40] net: add the AF_HYPERV entries to family name tables +Subject: [PATCH 44/46] net: add the AF_HYPERV entries to family name tables This is for the hv_sock driver, which introduces AF_HYPERV(42). @@ -45,5 +45,5 @@ index 925def4..323f7a3 100644 /* -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0039-Drivers-hv-vmbus-fix-the-race-when-querying-updating.patch b/alpine/kernel/patches/0045-Drivers-hv-vmbus-fix-the-race-when-querying-updating.patch similarity index 96% rename from alpine/kernel/patches/0039-Drivers-hv-vmbus-fix-the-race-when-querying-updating.patch rename to alpine/kernel/patches/0045-Drivers-hv-vmbus-fix-the-race-when-querying-updating.patch index beecbf7b4..28566a1c6 100644 --- a/alpine/kernel/patches/0039-Drivers-hv-vmbus-fix-the-race-when-querying-updating.patch +++ b/alpine/kernel/patches/0045-Drivers-hv-vmbus-fix-the-race-when-querying-updating.patch @@ -1,7 +1,7 @@ -From 6857a15b84ea9a592cfbe8a9064d77a63d49bc68 Mon Sep 17 00:00:00 2001 +From 56e767526878b2fc79b0dfaa2860ed2ae836a52e Mon Sep 17 00:00:00 2001 From: Dexuan Cui Date: Sat, 21 May 2016 16:55:50 +0800 -Subject: [PATCH 39/40] Drivers: hv: vmbus: fix the race when querying & +Subject: [PATCH 45/46] Drivers: hv: vmbus: fix the race when querying & updating the percpu list There is a rare race when we remove an entry from the global list @@ -129,5 +129,5 @@ index c892db5..0a54317 100644 err_free_chan: free_channel(newchannel); -- -2.9.0 +2.9.3 diff --git a/alpine/kernel/patches/0040-vmbus-Don-t-spam-the-logs-with-unknown-GUIDs.patch b/alpine/kernel/patches/0046-vmbus-Don-t-spam-the-logs-with-unknown-GUIDs.patch similarity index 86% rename from alpine/kernel/patches/0040-vmbus-Don-t-spam-the-logs-with-unknown-GUIDs.patch rename to alpine/kernel/patches/0046-vmbus-Don-t-spam-the-logs-with-unknown-GUIDs.patch index 3dafc6af1..fa6b53ea5 100644 --- a/alpine/kernel/patches/0040-vmbus-Don-t-spam-the-logs-with-unknown-GUIDs.patch +++ b/alpine/kernel/patches/0046-vmbus-Don-t-spam-the-logs-with-unknown-GUIDs.patch @@ -1,7 +1,7 @@ -From e3e9e646e4cd69f7dec7f5acc4a30cb1beb6e95a Mon Sep 17 00:00:00 2001 +From 44694d7a14f502c9222ea100ab62fa7030acf548 Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Mon, 23 May 2016 18:55:45 +0100 -Subject: [PATCH 40/40] vmbus: Don't spam the logs with unknown GUIDs +Subject: [PATCH 46/46] vmbus: Don't spam the logs with unknown GUIDs With Hyper-V sockets device types are introduced on the fly. The pr_info() then prints a message on every connection, which is way too verbose. Since @@ -26,5 +26,5 @@ index 0a54317..120ee22 100644 } -- -2.9.0 +2.9.3