diff --git a/0004-54f9e32-vhost-handle-dirty-pages-logging-request.patch b/0004-54f9e32-vhost-handle-dirty-pages-logging-request.patch new file mode 100644 index 0000000..d6576c1 --- /dev/null +++ b/0004-54f9e32-vhost-handle-dirty-pages-logging-request.patch @@ -0,0 +1,152 @@ +commit 54f9e32305d4a8d30c2a4ae059d310189b312498 +Author: Yuanhan Liu +Date: Fri Jan 29 12:57:56 2016 +0800 + + vhost: handle dirty pages logging request + + VHOST_USER_SET_LOG_BASE request is used to tell the backend (dpdk + vhost-user) where we should log dirty pages, and how big the log + buffer is. + + This request introduces a new payload: + + typedef struct VhostUserLog { + uint64_t mmap_size; + uint64_t mmap_offset; + } VhostUserLog; + + Also, a fd is delivered from QEMU by ancillary data. + + With those info given, an area of memory is mmaped, assigned + to dev->log_base, for logging dirty pages. + + Signed-off-by: Yuanhan Liu + Signed-off-by: Victor Kaplansky + Tested-by: Pavel Fedin + +Index: dpdk-2.2.0/lib/librte_vhost/rte_virtio_net.h +=================================================================== +--- dpdk-2.2.0.orig/lib/librte_vhost/rte_virtio_net.h ++++ dpdk-2.2.0/lib/librte_vhost/rte_virtio_net.h +@@ -129,7 +129,9 @@ struct virtio_net { + char ifname[IF_NAME_SZ]; /**< Name of the tap device or socket path. */ + uint32_t virt_qp_nb; /**< number of queue pair we have allocated */ + void *priv; /**< private context */ +- uint64_t reserved[64]; /**< Reserve some spaces for future extension. */ ++ uint64_t log_size; /**< Size of log area */ ++ uint64_t log_base; /**< Where dirty pages are logged */ ++ uint64_t reserved[62]; /**< Reserve some spaces for future extension. */ + struct vhost_virtqueue *virtqueue[VHOST_MAX_QUEUE_PAIRS * 2]; /**< Contains all virtqueue information. */ + } __rte_cache_aligned; + +Index: dpdk-2.2.0/lib/librte_vhost/vhost_user/vhost-net-user.c +=================================================================== +--- dpdk-2.2.0.orig/lib/librte_vhost/vhost_user/vhost-net-user.c ++++ dpdk-2.2.0/lib/librte_vhost/vhost_user/vhost-net-user.c +@@ -388,9 +388,12 @@ vserver_message_handler(int connfd, void + break; + + case VHOST_USER_SET_LOG_BASE: +- RTE_LOG(INFO, VHOST_CONFIG, "not implemented.\n"); +- break; ++ user_set_log_base(ctx, &msg); + ++ /* it needs a reply */ ++ msg.size = sizeof(msg.payload.u64); ++ send_vhost_message(connfd, &msg); ++ break; + case VHOST_USER_SET_LOG_FD: + close(msg.fds[0]); + RTE_LOG(INFO, VHOST_CONFIG, "not implemented.\n"); +Index: dpdk-2.2.0/lib/librte_vhost/vhost_user/vhost-net-user.h +=================================================================== +--- dpdk-2.2.0.orig/lib/librte_vhost/vhost_user/vhost-net-user.h ++++ dpdk-2.2.0/lib/librte_vhost/vhost_user/vhost-net-user.h +@@ -83,6 +83,11 @@ typedef struct VhostUserMemory { + VhostUserMemoryRegion regions[VHOST_MEMORY_MAX_NREGIONS]; + } VhostUserMemory; + ++typedef struct VhostUserLog { ++ uint64_t mmap_size; ++ uint64_t mmap_offset; ++} VhostUserLog; ++ + typedef struct VhostUserMsg { + VhostUserRequest request; + +@@ -97,6 +102,7 @@ typedef struct VhostUserMsg { + struct vhost_vring_state state; + struct vhost_vring_addr addr; + VhostUserMemory memory; ++ VhostUserLog log; + } payload; + int fds[VHOST_MEMORY_MAX_NREGIONS]; + } __attribute((packed)) VhostUserMsg; +Index: dpdk-2.2.0/lib/librte_vhost/vhost_user/virtio-net-user.c +=================================================================== +--- dpdk-2.2.0.orig/lib/librte_vhost/vhost_user/virtio-net-user.c ++++ dpdk-2.2.0/lib/librte_vhost/vhost_user/virtio-net-user.c +@@ -365,3 +365,51 @@ user_set_protocol_features(struct vhost_ + + dev->protocol_features = protocol_features; + } ++ ++int ++user_set_log_base(struct vhost_device_ctx ctx, ++ struct VhostUserMsg *msg) ++{ ++ struct virtio_net *dev; ++ int fd = msg->fds[0]; ++ uint64_t size, off; ++ void *addr; ++ ++ dev = get_device(ctx); ++ if (!dev) ++ return -1; ++ ++ if (fd < 0) { ++ RTE_LOG(ERR, VHOST_CONFIG, "invalid log fd: %d\n", fd); ++ return -1; ++ } ++ ++ if (msg->size != sizeof(VhostUserLog)) { ++ RTE_LOG(ERR, VHOST_CONFIG, ++ "invalid log base msg size: %"PRId32" != %d\n", ++ msg->size, (int)sizeof(VhostUserLog)); ++ return -1; ++ } ++ ++ size = msg->payload.log.mmap_size; ++ off = msg->payload.log.mmap_offset; ++ RTE_LOG(INFO, VHOST_CONFIG, ++ "log mmap size: %"PRId64", offset: %"PRId64"\n", ++ size, off); ++ ++ /* ++ * mmap from 0 to workaround a hugepage mmap bug: mmap will ++ * fail when offset is not page size aligned. ++ */ ++ addr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); ++ if (addr == MAP_FAILED) { ++ RTE_LOG(ERR, VHOST_CONFIG, "mmap log base failed!\n"); ++ return -1; ++ } ++ ++ /* TODO: unmap on stop */ ++ dev->log_base = (uint64_t)(uintptr_t)addr + off; ++ dev->log_size = size; ++ ++ return 0; ++} +Index: dpdk-2.2.0/lib/librte_vhost/vhost_user/virtio-net-user.h +=================================================================== +--- dpdk-2.2.0.orig/lib/librte_vhost/vhost_user/virtio-net-user.h ++++ dpdk-2.2.0/lib/librte_vhost/vhost_user/virtio-net-user.h +@@ -49,6 +49,7 @@ void user_set_vring_kick(struct vhost_de + + void user_set_protocol_features(struct vhost_device_ctx ctx, + uint64_t protocol_features); ++int user_set_log_base(struct vhost_device_ctx ctx, struct VhostUserMsg *); + + int user_get_vring_base(struct vhost_device_ctx, struct vhost_vring_state *); + diff --git a/0005-d293dac-vhost-claim-support-of-guest-announce.patch b/0005-d293dac-vhost-claim-support-of-guest-announce.patch new file mode 100644 index 0000000..db035eb --- /dev/null +++ b/0005-d293dac-vhost-claim-support-of-guest-announce.patch @@ -0,0 +1,28 @@ +commit d293dac8f30e46f0cb66fbcce2977d73d56fe103 +Author: Yuanhan Liu +Date: Fri Jan 29 12:58:00 2016 +0800 + + vhost: claim support of guest announce + + It's actually a feature already enabled in Linux kernel (since v3.5). + What we need to do is simply to claim that we support such feature, + and nothing else. + + With that, the guest will send an ARP message after live migration + to notify the switches about the new location of migrated VM. + + Signed-off-by: Yuanhan Liu + Tested-by: Pavel Fedin + +Index: dpdk-2.2.0/lib/librte_vhost/virtio-net.c +=================================================================== +--- dpdk-2.2.0.orig/lib/librte_vhost/virtio-net.c ++++ dpdk-2.2.0/lib/librte_vhost/virtio-net.c +@@ -74,6 +74,7 @@ static struct virtio_net_config_ll *ll_r + #define VHOST_SUPPORTED_FEATURES ((1ULL << VIRTIO_NET_F_MRG_RXBUF) | \ + (1ULL << VIRTIO_NET_F_CTRL_VQ) | \ + (1ULL << VIRTIO_NET_F_CTRL_RX) | \ ++ (1ULL << VIRTIO_NET_F_GUEST_ANNOUNCE) | \ + (VHOST_SUPPORTS_MQ) | \ + (1ULL << VIRTIO_F_VERSION_1) | \ + (1ULL << VHOST_F_LOG_ALL) | \ diff --git a/0006-d639996-vhost-enable-log_shmfd-protocol-feature.patch b/0006-d639996-vhost-enable-log_shmfd-protocol-feature.patch new file mode 100644 index 0000000..df42d2b --- /dev/null +++ b/0006-d639996-vhost-enable-log_shmfd-protocol-feature.patch @@ -0,0 +1,33 @@ +commit d639996a74fa71a9553bcef7cb2b2e9bb0fd5203 +Author: Yuanhan Liu +Date: Fri Jan 29 12:58:02 2016 +0800 + + vhost: enable log_shmfd protocol feature + + To claim that we support vhost-user live migration support: + SET_LOG_BASE request will be send only when this feature flag + is set. + + Besides this flag, we actually need another feature flag set + to make vhost-user live migration work: VHOST_F_LOG_ALL. + Which, however, has been enabled long time ago. + + Signed-off-by: Yuanhan Liu + Tested-by: Pavel Fedin + +Index: dpdk-2.2.0/lib/librte_vhost/vhost_user/virtio-net-user.h +=================================================================== +--- dpdk-2.2.0.orig/lib/librte_vhost/vhost_user/virtio-net-user.h ++++ dpdk-2.2.0/lib/librte_vhost/vhost_user/virtio-net-user.h +@@ -38,8 +38,10 @@ + #include "vhost-net-user.h" + + #define VHOST_USER_PROTOCOL_F_MQ 0 ++#define VHOST_USER_PROTOCOL_F_LOG_SHMFD 1 + +-#define VHOST_USER_PROTOCOL_FEATURES (1ULL << VHOST_USER_PROTOCOL_F_MQ) ++#define VHOST_USER_PROTOCOL_FEATURES ((1ULL << VHOST_USER_PROTOCOL_F_MQ) | \ ++ (1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD)) + + int user_set_mem_table(struct vhost_device_ctx, struct VhostUserMsg *); + diff --git a/0007-ixgbe-fix-VLAN-filter-missing-brackets.patch b/0007-ixgbe-fix-VLAN-filter-missing-brackets.patch new file mode 100644 index 0000000..3c4b6b7 --- /dev/null +++ b/0007-ixgbe-fix-VLAN-filter-missing-brackets.patch @@ -0,0 +1,33 @@ +From c0de18e856d8c6b4e98ca198091ec7c3528c38e4 Mon Sep 17 00:00:00 2001 +From: Aaron Conole +Date: Tue, 22 Mar 2016 17:37:15 -0400 +Subject: [PATCH] ixgbe: fix VLAN filter missing brackets + +The ixgbe vlan filter code has an if check with an incorrect whitespace. + +Fixes: fe3a45fd4104 ("ixgbe: add VMDq support") + +Signed-off-by: Aaron Conole +Acked-by: Panu Matilainen +Acked-by: Helin Zhang +--- + drivers/net/ixgbe/ixgbe_ethdev.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +Index: dpdk/drivers/net/ixgbe/ixgbe_ethdev.c +=================================================================== +--- dpdk.orig/drivers/net/ixgbe/ixgbe_ethdev.c ++++ dpdk/drivers/net/ixgbe/ixgbe_ethdev.c +@@ -4258,10 +4258,11 @@ ixgbe_set_pool_vlan_filter(struct rte_et + if (ixgbe_vmdq_mode_check(hw) < 0) + return (-ENOTSUP); + for (pool_idx = 0; pool_idx < ETH_64_POOLS; pool_idx++) { +- if (pool_mask & ((uint64_t)(1ULL << pool_idx))) ++ if (pool_mask & ((uint64_t)(1ULL << pool_idx))) { + ret = hw->mac.ops.set_vfta(hw,vlan,pool_idx,vlan_on); + if (ret < 0) + return ret; ++ } + } + + return ret; diff --git a/0004-mk-fix-gcc-5-version-on-suse.patch b/0099-mk-fix-gcc-5-version-on-suse.patch similarity index 100% rename from 0004-mk-fix-gcc-5-version-on-suse.patch rename to 0099-mk-fix-gcc-5-version-on-suse.patch diff --git a/dpdk.changes b/dpdk.changes index f8259aa..e64f863 100644 --- a/dpdk.changes +++ b/dpdk.changes @@ -1,4 +1,24 @@ ------------------------------------------------------------------- +Thu Apr 28 14:39:36 CEST 2016 - ndas@suse.de + +- Create DPDK packages for 32 bit x86(bsc#977639). + +------------------------------------------------------------------- +Wed Apr 27 14:55:37 UTC 2016 - mchandras@suse.de + +- Add upstream patch for the ixgbe driver + * 0007-ixgbe-fix-VLAN-filter-missing-brackets.patch: Fix VLAN + filtering logic by adding the missing brackets in the 'if' statement. + +------------------------------------------------------------------- +Tue Apr 19 10:45:29 CEST 2016 - ndas@suse.de + +- DPDK is most common vhost-user backend, Adding upstream patches to + help qemu vm live migration with vhost-user (fate#320713). + [+ 0004-54f9e32-vhost-handle-dirty-pages-logging-request.patch + + 0005-d293dac-vhost-claim-support-of-guest-announce.patch + + 0006-d639996-vhost-enable-log_shmfd-protocol-feature.patch] +------------------------------------------------------------------- Mon Apr 18 08:45:58 UTC 2016 - mchandras@suse.de - Use fdupes to manage duplicate files diff --git a/dpdk.spec b/dpdk.spec index dbce1f0..5f78f03 100644 --- a/dpdk.spec +++ b/dpdk.spec @@ -17,7 +17,12 @@ %define machine native +%ifarch x86_64 %define target x86_64-%{machine}-linuxapp-gcc +%else if %ix86 +%define target i686-%{machine}-linuxapp-gcc +%endif + %bcond_without shared # Add option to build without examples %bcond_without examples @@ -34,10 +39,15 @@ Source: http://dpdk.org/browse/dpdk/snapshot/dpdk-stable-%{version}.tar. Patch1: 0001-enic-fix-Type-punning-and-strict-aliasing-warning.patch Patch2: 0002-examples-ip_pipeline-fix-implicit-declaration-of-fun.patch Patch3: 0003-mk-fix-external-shared-library-dependencies-of-libraries.patch -# PATCH-FIX-UPSTREAM: 0004-mk-fix-gcc-5-version-on-suse.patch -Patch4: 0004-mk-fix-gcc-5-version-on-suse.patch -BuildRequires: fdupes +Patch4: 0004-54f9e32-vhost-handle-dirty-pages-logging-request.patch +Patch5: 0005-d293dac-vhost-claim-support-of-guest-announce.patch +Patch6: 0006-d639996-vhost-enable-log_shmfd-protocol-feature.patch +#PATCH-FIX-UPSTREAM 0007-ixgbe-fix-VLAN-filter-missing-brackets.patch +Patch7: 0007-ixgbe-fix-VLAN-filter-missing-brackets.patch +# PATCH-FIX-UPSTREAM: 0099-mk-fix-gcc-5-version-on-suse.patch +Patch99: 0099-mk-fix-gcc-5-version-on-suse.patch BuildRequires: doxygen +BuildRequires: fdupes BuildRequires: libnuma-devel BuildRequires: libpcap-devel BuildRequires: zlib-devel @@ -46,7 +56,7 @@ BuildRequires: zlib-devel # other techniques, carefully crafted x86 assembly instructions. As such it # currently (and likely never will) run on non-x86 platforms # -ExclusiveArch: x86_64 +ExclusiveArch: x86_64 %ix86 %description The Data Plane Development Kit is a set of libraries and drivers for @@ -101,7 +111,11 @@ as L2 and L3 forwarding. %patch1 -p1 -z .enic %patch2 -p1 -z .examples %patch3 -p1 -z .dtneeded -%patch4 -p1 -z .rtetoolchain +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch99 -p1 -z .rtetoolchain %build # set up a method for modifying the resulting .config file @@ -227,7 +241,7 @@ mkdir %{buildroot}%{_docdir}/ mv %{buildroot}%{_datadir}/doc/dpdk %{buildroot}%{_docdir}/ # Remove duplicates -%fdupes %{buildroot}/%{_prefix} +%fdupes %{buildroot}/%{_prefix} %post devel -p /sbin/ldconfig %postun devel -p /sbin/ldconfig