1
The following changes since commit 23895cbd82be95428e90168b12e925d0d3ca2f06:
1
The following changes since commit 5288bee45fbd33203b61f8c76e41b15bb5913e6e:
2
2
3
Merge remote-tracking branch 'remotes/awilliam/tags/vfio-update-20201123.0' into staging (2020-11-23 18:51:13 +0000)
3
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging (2022-07-21 11:13:01 +0100)
4
4
5
are available in the git repository at:
5
are available in the git repository at:
6
6
7
https://github.com/jasowang/qemu.git tags/net-pull-request
7
https://github.com/jasowang/qemu.git tags/net-pull-request
8
8
9
for you to fetch changes up to 9925990d01a92564af55f6f69d0f5f59b47609b1:
9
for you to fetch changes up to 75a8ce64f6e37513698857fb4284170da163ed06:
10
10
11
net: Use correct default-path macro for downscript (2020-11-24 10:40:17 +0800)
11
vdpa: Fix memory listener deletions of iova tree (2022-07-26 16:24:19 +0800)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
14
15
----------------------------------------------------------------
15
----------------------------------------------------------------
16
Keqian Zhu (1):
16
Ake Koomsin (1):
17
net: Use correct default-path macro for downscript
17
e1000e: Fix possible interrupt loss when using MSI
18
18
19
Paolo Bonzini (1):
19
Eugenio Pérez (2):
20
net: do not exit on "netdev_add help" monitor command
20
vhost: Get vring base from vq, not svq
21
vdpa: Fix memory listener deletions of iova tree
21
22
22
Prasad J Pandit (1):
23
hw/net/e1000e_core.c | 2 ++
23
hw/net/e1000e: advance desc_offset in case of null descriptor
24
hw/virtio/vhost-vdpa.c | 26 +++++++++++++-------------
24
25
2 files changed, 15 insertions(+), 13 deletions(-)
25
Yuri Benditovich (1):
26
net: purge queued rx packets on queue deletion
27
28
yuanjungong (1):
29
tap: fix a memory leak
30
31
hw/net/e1000e_core.c | 8 +++---
32
include/net/net.h | 1 +
33
monitor/hmp-cmds.c | 6 ++++
34
net/net.c | 80 +++++++++++++++++++++++++++-------------------------
35
net/tap.c | 5 +++-
36
5 files changed, 57 insertions(+), 43 deletions(-)
37
26
38
27
diff view generated by jsdifflib
1
From: Prasad J Pandit <pjp@fedoraproject.org>
1
From: Ake Koomsin <ake@igel.co.jp>
2
2
3
While receiving packets via e1000e_write_packet_to_guest() routine,
3
Commit "e1000e: Prevent MSI/MSI-X storms" introduced msi_causes_pending
4
'desc_offset' is advanced only when RX descriptor is processed. And
4
to prevent interrupt storms problem. It was tested with MSI-X.
5
RX descriptor is not processed if it has NULL buffer address.
6
This may lead to an infinite loop condition. Increament 'desc_offset'
7
to process next descriptor in the ring to avoid infinite loop.
8
5
9
Reported-by: Cheol-woo Myung <330cjfdn@gmail.com>
6
In case of MSI, the guest can rely solely on interrupts to clear ICR.
10
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
7
Upon clearing all pending interrupts, msi_causes_pending gets cleared.
8
However, when e1000e_itr_should_postpone() in e1000e_send_msi() returns
9
true, MSI never gets fired by e1000e_intrmgr_on_throttling_timer()
10
because msi_causes_pending is still set. This results in interrupt loss.
11
12
To prevent this, we need to clear msi_causes_pending when MSI is going
13
to get fired by the throttling timer. The guest can then receive
14
interrupts eventually.
15
16
Signed-off-by: Ake Koomsin <ake@igel.co.jp>
11
Signed-off-by: Jason Wang <jasowang@redhat.com>
17
Signed-off-by: Jason Wang <jasowang@redhat.com>
12
---
18
---
13
hw/net/e1000e_core.c | 8 ++++----
19
hw/net/e1000e_core.c | 2 ++
14
1 file changed, 4 insertions(+), 4 deletions(-)
20
1 file changed, 2 insertions(+)
15
21
16
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
22
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
17
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/net/e1000e_core.c
24
--- a/hw/net/e1000e_core.c
19
+++ b/hw/net/e1000e_core.c
25
+++ b/hw/net/e1000e_core.c
20
@@ -XXX,XX +XXX,XX @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
26
@@ -XXX,XX +XXX,XX @@ e1000e_intrmgr_on_throttling_timer(void *opaque)
21
(const char *) &fcs_pad, e1000x_fcs_len(core->mac));
27
22
}
28
if (msi_enabled(timer->core->owner)) {
23
}
29
trace_e1000e_irq_msi_notify_postponed();
24
- desc_offset += desc_size;
30
+ /* Clear msi_causes_pending to fire MSI eventually */
25
- if (desc_offset >= total_size) {
31
+ timer->core->msi_causes_pending = 0;
26
- is_last = true;
32
e1000e_set_interrupt_cause(timer->core, 0);
27
- }
33
} else {
28
} else { /* as per intel docs; skip descriptors with null buf addr */
34
trace_e1000e_irq_legacy_notify_postponed();
29
trace_e1000e_rx_null_descriptor();
30
}
31
+ desc_offset += desc_size;
32
+ if (desc_offset >= total_size) {
33
+ is_last = true;
34
+ }
35
36
e1000e_write_rx_descr(core, desc, is_last ? core->rx_pkt : NULL,
37
rss_info, do_ps ? ps_hdr_len : 0, &bastate.written);
38
--
35
--
39
2.7.4
36
2.7.4
40
41
diff view generated by jsdifflib
Deleted patch
1
From: Paolo Bonzini <pbonzini@redhat.com>
2
1
3
"netdev_add help" is causing QEMU to exit because the code that
4
invokes show_netdevs is shared between CLI and HMP processing.
5
Move the check to the callers so that exit(0) remains only
6
in the CLI flow.
7
8
"netdev_add help" is not fixed by this patch; that is left for
9
later work.
10
11
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
12
Signed-off-by: Jason Wang <jasowang@redhat.com>
13
---
14
include/net/net.h | 1 +
15
monitor/hmp-cmds.c | 6 +++++
16
net/net.c | 68 +++++++++++++++++++++++++++---------------------------
17
3 files changed, 41 insertions(+), 34 deletions(-)
18
19
diff --git a/include/net/net.h b/include/net/net.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/net/net.h
22
+++ b/include/net/net.h
23
@@ -XXX,XX +XXX,XX @@ extern const char *host_net_devices[];
24
25
/* from net.c */
26
int net_client_parse(QemuOptsList *opts_list, const char *str);
27
+void show_netdevs(void);
28
int net_init_clients(Error **errp);
29
void net_check_clients(void);
30
void net_cleanup(void);
31
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/monitor/hmp-cmds.c
34
+++ b/monitor/hmp-cmds.c
35
@@ -XXX,XX +XXX,XX @@
36
#include "qemu/option.h"
37
#include "qemu/timer.h"
38
#include "qemu/sockets.h"
39
+#include "qemu/help_option.h"
40
#include "monitor/monitor-internal.h"
41
#include "qapi/error.h"
42
#include "qapi/clone-visitor.h"
43
@@ -XXX,XX +XXX,XX @@ void hmp_netdev_add(Monitor *mon, const QDict *qdict)
44
{
45
Error *err = NULL;
46
QemuOpts *opts;
47
+ const char *type = qdict_get_try_str(qdict, "type");
48
49
+ if (type && is_help_option(type)) {
50
+ show_netdevs();
51
+ return;
52
+ }
53
opts = qemu_opts_from_qdict(qemu_find_opts("netdev"), qdict, &err);
54
if (err) {
55
goto out;
56
diff --git a/net/net.c b/net/net.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/net/net.c
59
+++ b/net/net.c
60
@@ -XXX,XX +XXX,XX @@
61
#include "qemu/config-file.h"
62
#include "qemu/ctype.h"
63
#include "qemu/iov.h"
64
+#include "qemu/qemu-print.h"
65
#include "qemu/main-loop.h"
66
#include "qemu/option.h"
67
#include "qapi/error.h"
68
@@ -XXX,XX +XXX,XX @@ static int net_client_init1(const Netdev *netdev, bool is_netdev, Error **errp)
69
return 0;
70
}
71
72
-static void show_netdevs(void)
73
+void show_netdevs(void)
74
{
75
int idx;
76
const char *available_netdevs[] = {
77
@@ -XXX,XX +XXX,XX @@ static void show_netdevs(void)
78
#endif
79
};
80
81
- printf("Available netdev backend types:\n");
82
+ qemu_printf("Available netdev backend types:\n");
83
for (idx = 0; idx < ARRAY_SIZE(available_netdevs); idx++) {
84
- puts(available_netdevs[idx]);
85
+ qemu_printf("%s\n", available_netdevs[idx]);
86
}
87
}
88
89
@@ -XXX,XX +XXX,XX @@ static int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
90
int ret = -1;
91
Visitor *v = opts_visitor_new(opts);
92
93
- const char *type = qemu_opt_get(opts, "type");
94
-
95
- if (is_netdev && type && is_help_option(type)) {
96
- show_netdevs();
97
- exit(0);
98
- } else {
99
- /* Parse convenience option format ip6-net=fec0::0[/64] */
100
- const char *ip6_net = qemu_opt_get(opts, "ipv6-net");
101
+ /* Parse convenience option format ip6-net=fec0::0[/64] */
102
+ const char *ip6_net = qemu_opt_get(opts, "ipv6-net");
103
104
- if (ip6_net) {
105
- char *prefix_addr;
106
- unsigned long prefix_len = 64; /* Default 64bit prefix length. */
107
+ if (ip6_net) {
108
+ char *prefix_addr;
109
+ unsigned long prefix_len = 64; /* Default 64bit prefix length. */
110
111
- substrings = g_strsplit(ip6_net, "/", 2);
112
- if (!substrings || !substrings[0]) {
113
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "ipv6-net",
114
- "a valid IPv6 prefix");
115
- goto out;
116
- }
117
+ substrings = g_strsplit(ip6_net, "/", 2);
118
+ if (!substrings || !substrings[0]) {
119
+ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "ipv6-net",
120
+ "a valid IPv6 prefix");
121
+ goto out;
122
+ }
123
124
- prefix_addr = substrings[0];
125
+ prefix_addr = substrings[0];
126
127
- /* Handle user-specified prefix length. */
128
- if (substrings[1] &&
129
- qemu_strtoul(substrings[1], NULL, 10, &prefix_len))
130
- {
131
- error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
132
- "ipv6-prefixlen", "a number");
133
- goto out;
134
- }
135
-
136
- qemu_opt_set(opts, "ipv6-prefix", prefix_addr, &error_abort);
137
- qemu_opt_set_number(opts, "ipv6-prefixlen", prefix_len,
138
- &error_abort);
139
- qemu_opt_unset(opts, "ipv6-net");
140
+ /* Handle user-specified prefix length. */
141
+ if (substrings[1] &&
142
+ qemu_strtoul(substrings[1], NULL, 10, &prefix_len))
143
+ {
144
+ error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
145
+ "ipv6-prefixlen", "a number");
146
+ goto out;
147
}
148
+
149
+ qemu_opt_set(opts, "ipv6-prefix", prefix_addr, &error_abort);
150
+ qemu_opt_set_number(opts, "ipv6-prefixlen", prefix_len,
151
+ &error_abort);
152
+ qemu_opt_unset(opts, "ipv6-net");
153
}
154
155
/* Create an ID for -net if the user did not specify one */
156
@@ -XXX,XX +XXX,XX @@ static int net_init_client(void *dummy, QemuOpts *opts, Error **errp)
157
158
static int net_init_netdev(void *dummy, QemuOpts *opts, Error **errp)
159
{
160
+ const char *type = qemu_opt_get(opts, "type");
161
+
162
+ if (type && is_help_option(type)) {
163
+ show_netdevs();
164
+ exit(0);
165
+ }
166
return net_client_init(opts, true, errp);
167
}
168
169
--
170
2.7.4
171
172
diff view generated by jsdifflib
1
From: Yuri Benditovich <yuri.benditovich@daynix.com>
1
From: Eugenio Pérez <eperezma@redhat.com>
2
2
3
https://bugzilla.redhat.com/show_bug.cgi?id=1829272
3
The SVQ vring used idx usually match with the guest visible one, as long
4
When deleting queue pair, purge pending RX packets if any.
4
as all the guest buffers (GPA) maps to exactly one buffer within qemu's
5
Example of problematic flow:
5
VA. However, as we can see in virtqueue_map_desc, a single guest buffer
6
1. Bring up q35 VM with tap (vhost off) and virtio-net or e1000e
6
could map to many buffers in SVQ vring.
7
2. Run ping flood to the VM NIC ( 1 ms interval)
8
3. Hot unplug the NIC device (device_del)
9
During unplug process one or more packets come, the NIC
10
can't receive, tap disables read_poll
11
4. Hot plug the device (device_add) with the same netdev
12
The tap stays with read_poll disabled and does not receive
13
any packets anymore (tap_send never triggered)
14
7
15
Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>
8
Also, its also a mistake to rewind them at the source of migration.
9
Since VirtQueue is able to migrate the inflight descriptors, its
10
responsability of the destination to perform the rewind just in case it
11
cannot report the inflight descriptors to the device.
12
13
This makes easier to migrate between backends or to recover them in
14
vhost devices that support set in flight descriptors.
15
16
Fixes: 6d0b22266633 ("vdpa: Adapt vhost_vdpa_get_vring_base to SVQ")
17
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
16
Signed-off-by: Jason Wang <jasowang@redhat.com>
18
Signed-off-by: Jason Wang <jasowang@redhat.com>
17
---
19
---
18
net/net.c | 12 ++++++++----
20
hw/virtio/vhost-vdpa.c | 24 ++++++++++++------------
19
1 file changed, 8 insertions(+), 4 deletions(-)
21
1 file changed, 12 insertions(+), 12 deletions(-)
20
22
21
diff --git a/net/net.c b/net/net.c
23
diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
22
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
23
--- a/net/net.c
25
--- a/hw/virtio/vhost-vdpa.c
24
+++ b/net/net.c
26
+++ b/hw/virtio/vhost-vdpa.c
25
@@ -XXX,XX +XXX,XX @@ void qemu_del_nic(NICState *nic)
27
@@ -XXX,XX +XXX,XX @@ static int vhost_vdpa_set_vring_base(struct vhost_dev *dev,
26
28
struct vhost_vring_state *ring)
27
qemu_macaddr_set_free(&nic->conf->macaddr);
29
{
28
30
struct vhost_vdpa *v = dev->opaque;
29
- /* If this is a peer NIC and peer has already been deleted, free it now. */
31
+ VirtQueue *vq = virtio_get_queue(dev->vdev, ring->index);
30
- if (nic->peer_deleted) {
32
31
- for (i = 0; i < queues; i++) {
33
+ /*
32
- qemu_free_net_client(qemu_get_subqueue(nic, i)->peer);
34
+ * vhost-vdpa devices does not support in-flight requests. Set all of them
33
+ for (i = 0; i < queues; i++) {
35
+ * as available.
34
+ NetClientState *nc = qemu_get_subqueue(nic, i);
36
+ *
35
+ /* If this is a peer NIC and peer has already been deleted, free it now. */
37
+ * TODO: This is ok for networking, but other kinds of devices might
36
+ if (nic->peer_deleted) {
38
+ * have problems with these retransmissions.
37
+ qemu_free_net_client(nc->peer);
39
+ */
38
+ } else if (nc->peer) {
40
+ while (virtqueue_rewind(vq, 1)) {
39
+ /* if there are RX packets pending, complete them */
41
+ continue;
40
+ qemu_purge_queued_packets(nc->peer);
42
+ }
41
}
43
if (v->shadow_vqs_enabled) {
44
/*
45
* Device vring base was set at device start. SVQ base is handled by
46
@@ -XXX,XX +XXX,XX @@ static int vhost_vdpa_get_vring_base(struct vhost_dev *dev,
47
struct vhost_vring_state *ring)
48
{
49
struct vhost_vdpa *v = dev->opaque;
50
- int vdpa_idx = ring->index - dev->vq_index;
51
int ret;
52
53
if (v->shadow_vqs_enabled) {
54
- VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, vdpa_idx);
55
-
56
- /*
57
- * Setting base as last used idx, so destination will see as available
58
- * all the entries that the device did not use, including the in-flight
59
- * processing ones.
60
- *
61
- * TODO: This is ok for networking, but other kinds of devices might
62
- * have problems with these retransmissions.
63
- */
64
- ring->num = svq->last_used_idx;
65
+ ring->num = virtio_queue_get_last_avail_idx(dev->vdev, ring->index);
66
return 0;
42
}
67
}
43
68
44
--
69
--
45
2.7.4
70
2.7.4
46
71
47
72
diff view generated by jsdifflib
Deleted patch
1
From: yuanjungong <ruc_gongyuanjun@163.com>
2
1
3
Close fd before returning.
4
5
Buglink: https://bugs.launchpad.net/qemu/+bug/1904486
6
7
Signed-off-by: yuanjungong <ruc_gongyuanjun@163.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Jason Wang <jasowang@redhat.com>
10
---
11
net/tap.c | 2 ++
12
1 file changed, 2 insertions(+)
13
14
diff --git a/net/tap.c b/net/tap.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/net/tap.c
17
+++ b/net/tap.c
18
@@ -XXX,XX +XXX,XX @@ int net_init_tap(const Netdev *netdev, const char *name,
19
if (ret < 0) {
20
error_setg_errno(errp, -ret, "%s: Can't use file descriptor %d",
21
name, fd);
22
+ close(fd);
23
return -1;
24
}
25
26
@@ -XXX,XX +XXX,XX @@ int net_init_tap(const Netdev *netdev, const char *name,
27
vhostfdname, vnet_hdr, fd, &err);
28
if (err) {
29
error_propagate(errp, err);
30
+ close(fd);
31
return -1;
32
}
33
} else if (tap->has_fds) {
34
--
35
2.7.4
36
37
diff view generated by jsdifflib
1
From: Keqian Zhu <zhukeqian1@huawei.com>
1
From: Eugenio Pérez <eperezma@redhat.com>
2
2
3
Fixes: 63c4db4c2e6d (net: relocate paths to helpers and scripts)
3
vhost_vdpa_listener_region_del is always deleting the first iova entry
4
Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
4
of the tree, since it's using the needle iova instead of the result's
5
one.
6
7
This was detected using a vga virtual device in the VM using vdpa SVQ.
8
It makes some extra memory adding and deleting, so the wrong one was
9
mapped / unmapped. This was undetected before since all the memory was
10
mappend and unmapped totally without that device, but other conditions
11
could trigger it too:
12
13
* mem_region was with .iova = 0, .translated_addr = (correct GPA).
14
* iova_tree_find_iova returned right result, but does not update
15
mem_region.
16
* iova_tree_remove always removed region with .iova = 0. Right iova were
17
sent to the device.
18
* Next map will fill the first region with .iova = 0, causing a mapping
19
with the same iova and device complains, if the next action is a map.
20
* Next unmap will cause to try to unmap again iova = 0, causing the
21
device to complain that no region was mapped at iova = 0.
22
23
Fixes: 34e3c94edaef ("vdpa: Add custom IOTLB translations to SVQ")
24
Reported-by: Lei Yang <leiyang@redhat.com>
25
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
5
Signed-off-by: Jason Wang <jasowang@redhat.com>
26
Signed-off-by: Jason Wang <jasowang@redhat.com>
6
---
27
---
7
net/tap.c | 3 ++-
28
hw/virtio/vhost-vdpa.c | 2 +-
8
1 file changed, 2 insertions(+), 1 deletion(-)
29
1 file changed, 1 insertion(+), 1 deletion(-)
9
30
10
diff --git a/net/tap.c b/net/tap.c
31
diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
11
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
12
--- a/net/tap.c
33
--- a/hw/virtio/vhost-vdpa.c
13
+++ b/net/tap.c
34
+++ b/hw/virtio/vhost-vdpa.c
14
@@ -XXX,XX +XXX,XX @@ free_fail:
35
@@ -XXX,XX +XXX,XX @@ static void vhost_vdpa_listener_region_del(MemoryListener *listener,
15
script = default_script = get_relocated_path(DEFAULT_NETWORK_SCRIPT);
36
16
}
37
result = vhost_iova_tree_find_iova(v->iova_tree, &mem_region);
17
if (!downscript) {
38
iova = result->iova;
18
- downscript = default_downscript = get_relocated_path(DEFAULT_NETWORK_SCRIPT);
39
- vhost_iova_tree_remove(v->iova_tree, &mem_region);
19
+ downscript = default_downscript =
40
+ vhost_iova_tree_remove(v->iova_tree, result);
20
+ get_relocated_path(DEFAULT_NETWORK_DOWN_SCRIPT);
41
}
21
}
42
vhost_vdpa_iotlb_batch_begin_once(v);
22
43
ret = vhost_vdpa_dma_unmap(v, iova, int128_get64(llsize));
23
if (tap->has_ifname) {
24
--
44
--
25
2.7.4
45
2.7.4
26
46
27
47
diff view generated by jsdifflib