* [PATCH v3 0/5] virtio-net: Convert feature properties to OnOffAuto @ 2024-07-14 5:11 Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 1/5] qdev-properties: Accept bool for OnOffAuto Akihiko Odaki ` (4 more replies) 0 siblings, 5 replies; 10+ messages in thread From: Akihiko Odaki @ 2024-07-14 5:11 UTC (permalink / raw) To: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Daniel P. Berrangé, Eduardo Habkost Cc: qemu-devel, Akihiko Odaki Some features are not always available, and virtio-net used to disable them when not available even if the corresponding properties were explicitly set to "on". Convert feature properties to OnOffAuto so that the user can explicitly tell QEMU to automatically select the value by setting them "auto". QEMU will give an error if they are set "on". Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- Changes in v3: - Added patch "qdev-properties: Accept bool for OnOffAuto". (Michael S. Tsirkin and Daniel P. Berrangé) - Changed to report errors with ebpf-rss-fds (Daniel P. Berrangé) - Link to v2: https://lore.kernel.org/r/20240708-auto-v2-0-f4908b953f05@daynix.com Changes in v2: - Added patch "virtio-net: Remove fallback from ebpf-rss-fds". - Added a compatibility property. - Corrected property type name. - Link to v1: https://lore.kernel.org/r/20240428-auto-v1-0-7b012216a120@daynix.com --- Akihiko Odaki (5): qdev-properties: Accept bool for OnOffAuto qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() virtio-net: Convert feature properties to OnOffAuto virtio-net: Report RSS warning at device realization virtio-net: Remove fallback from ebpf-rss-fds include/hw/qdev-properties.h | 18 +++ include/hw/virtio/virtio-net.h | 3 +- hw/core/machine.c | 1 + hw/core/qdev-properties.c | 83 +++++++++++- hw/net/virtio-net.c | 290 ++++++++++++++++++++++++----------------- 5 files changed, 274 insertions(+), 121 deletions(-) --- base-commit: f2cb4026fccfe073f84a4b440e41d3ed0c3134f6 change-id: 20240428-auto-be0dc010dda5 Best regards, -- Akihiko Odaki <akihiko.odaki@daynix.com> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 1/5] qdev-properties: Accept bool for OnOffAuto 2024-07-14 5:11 [PATCH v3 0/5] virtio-net: Convert feature properties to OnOffAuto Akihiko Odaki @ 2024-07-14 5:11 ` Akihiko Odaki 2024-07-15 11:38 ` Daniel P. Berrangé 2024-07-14 5:11 ` [PATCH v3 2/5] qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() Akihiko Odaki ` (3 subsequent siblings) 4 siblings, 1 reply; 10+ messages in thread From: Akihiko Odaki @ 2024-07-14 5:11 UTC (permalink / raw) To: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Daniel P. Berrangé, Eduardo Habkost Cc: qemu-devel, Akihiko Odaki Accept bool literals for OnOffAuto properties for consistency with bool properties. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- hw/core/qdev-properties.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index 86a583574dd0..f0a270bb4f61 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -491,6 +491,21 @@ const PropertyInfo qdev_prop_string = { .set = set_string, }; +static void set_on_off_auto(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + Property *prop = opaque; + int *ptr = object_field_prop_ptr(obj, prop); + bool value; + + if (visit_type_bool(v, name, &value, NULL)) { + *ptr = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; + return; + } + + qdev_propinfo_set_enum(obj, v, name, opaque, errp); +} + /* --- on/off/auto --- */ const PropertyInfo qdev_prop_on_off_auto = { @@ -498,7 +513,7 @@ const PropertyInfo qdev_prop_on_off_auto = { .description = "on/off/auto", .enum_table = &OnOffAuto_lookup, .get = qdev_propinfo_get_enum, - .set = qdev_propinfo_set_enum, + .set = set_on_off_auto, .set_default_value = qdev_propinfo_set_default_value_enum, }; -- 2.45.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/5] qdev-properties: Accept bool for OnOffAuto 2024-07-14 5:11 ` [PATCH v3 1/5] qdev-properties: Accept bool for OnOffAuto Akihiko Odaki @ 2024-07-15 11:38 ` Daniel P. Berrangé 2024-07-16 6:11 ` Akihiko Odaki 0 siblings, 1 reply; 10+ messages in thread From: Daniel P. Berrangé @ 2024-07-15 11:38 UTC (permalink / raw) To: Akihiko Odaki Cc: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Eduardo Habkost, qemu-devel On Sun, Jul 14, 2024 at 02:11:01PM +0900, Akihiko Odaki wrote: > Accept bool literals for OnOffAuto properties for consistency with bool > properties. > > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> > --- > hw/core/qdev-properties.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > index 86a583574dd0..f0a270bb4f61 100644 > --- a/hw/core/qdev-properties.c > +++ b/hw/core/qdev-properties.c > @@ -491,6 +491,21 @@ const PropertyInfo qdev_prop_string = { > .set = set_string, > }; > > +static void set_on_off_auto(Object *obj, Visitor *v, const char *name, > + void *opaque, Error **errp) > +{ > + Property *prop = opaque; > + int *ptr = object_field_prop_ptr(obj, prop); > + bool value; > + > + if (visit_type_bool(v, name, &value, NULL)) { > + *ptr = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; > + return; > + } > + > + qdev_propinfo_set_enum(obj, v, name, opaque, errp); > +} IMHO this is highly undesirable. It is adding redundant new syntax across countless places in QEMU that use OnOffAuto. > + > /* --- on/off/auto --- */ > > const PropertyInfo qdev_prop_on_off_auto = { > @@ -498,7 +513,7 @@ const PropertyInfo qdev_prop_on_off_auto = { > .description = "on/off/auto", > .enum_table = &OnOffAuto_lookup, > .get = qdev_propinfo_get_enum, > - .set = qdev_propinfo_set_enum, > + .set = set_on_off_auto, > .set_default_value = qdev_propinfo_set_default_value_enum, > }; > > > -- > 2.45.2 > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/5] qdev-properties: Accept bool for OnOffAuto 2024-07-15 11:38 ` Daniel P. Berrangé @ 2024-07-16 6:11 ` Akihiko Odaki 0 siblings, 0 replies; 10+ messages in thread From: Akihiko Odaki @ 2024-07-16 6:11 UTC (permalink / raw) To: Daniel P. Berrangé Cc: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Eduardo Habkost, qemu-devel On 2024/07/15 20:38, Daniel P. Berrangé wrote: > On Sun, Jul 14, 2024 at 02:11:01PM +0900, Akihiko Odaki wrote: >> Accept bool literals for OnOffAuto properties for consistency with bool >> properties. >> >> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> >> --- >> hw/core/qdev-properties.c | 17 ++++++++++++++++- >> 1 file changed, 16 insertions(+), 1 deletion(-) >> >> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c >> index 86a583574dd0..f0a270bb4f61 100644 >> --- a/hw/core/qdev-properties.c >> +++ b/hw/core/qdev-properties.c >> @@ -491,6 +491,21 @@ const PropertyInfo qdev_prop_string = { >> .set = set_string, >> }; >> >> +static void set_on_off_auto(Object *obj, Visitor *v, const char *name, >> + void *opaque, Error **errp) >> +{ >> + Property *prop = opaque; >> + int *ptr = object_field_prop_ptr(obj, prop); >> + bool value; >> + >> + if (visit_type_bool(v, name, &value, NULL)) { >> + *ptr = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; >> + return; >> + } >> + >> + qdev_propinfo_set_enum(obj, v, name, opaque, errp); >> +} > > IMHO this is highly undesirable. It is adding redundant new syntax > across countless places in QEMU that use OnOffAuto. We already embrace the redundant syntax for bool properties and do not say it is deprecated. This is the most consistent way of handling on/off I came up with. Regards, Akihiko Odaki ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 2/5] qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() 2024-07-14 5:11 [PATCH v3 0/5] virtio-net: Convert feature properties to OnOffAuto Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 1/5] qdev-properties: Accept bool for OnOffAuto Akihiko Odaki @ 2024-07-14 5:11 ` Akihiko Odaki 2024-07-15 11:47 ` Daniel P. Berrangé 2024-07-14 5:11 ` [PATCH v3 3/5] virtio-net: Convert feature properties to OnOffAuto Akihiko Odaki ` (2 subsequent siblings) 4 siblings, 1 reply; 10+ messages in thread From: Akihiko Odaki @ 2024-07-14 5:11 UTC (permalink / raw) To: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Daniel P. Berrangé, Eduardo Habkost Cc: qemu-devel, Akihiko Odaki DEFINE_PROP_ON_OFF_AUTO_BIT64() corresponds to DEFINE_PROP_ON_OFF_AUTO() as DEFINE_PROP_BIT64() corresponds to DEFINE_PROP_BOOL(). The difference is that DEFINE_PROP_ON_OFF_AUTO_BIT64() exposes OnOffAuto instead of bool. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- include/hw/qdev-properties.h | 18 ++++++++++++ hw/core/qdev-properties.c | 66 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h index 09aa04ca1e27..afec53a48470 100644 --- a/include/hw/qdev-properties.h +++ b/include/hw/qdev-properties.h @@ -43,11 +43,22 @@ struct PropertyInfo { ObjectPropertyRelease *release; }; +/** + * struct OnOffAutoBit64 - OnOffAuto storage with 64 elements. + * @on_bits: Bitmap of elements with "on". + * @auto_bits: Bitmap of elements with "auto". + */ +typedef struct OnOffAutoBit64 { + uint64_t on_bits; + uint64_t auto_bits; +} OnOffAutoBit64; + /*** qdev-properties.c ***/ extern const PropertyInfo qdev_prop_bit; extern const PropertyInfo qdev_prop_bit64; +extern const PropertyInfo qdev_prop_on_off_auto_bit64; extern const PropertyInfo qdev_prop_bool; extern const PropertyInfo qdev_prop_enum; extern const PropertyInfo qdev_prop_uint8; @@ -100,6 +111,13 @@ extern const PropertyInfo qdev_prop_link; .set_default = true, \ .defval.u = (bool)_defval) +#define DEFINE_PROP_ON_OFF_AUTO_BIT64(_name, _state, _field, _bit, _defval) \ + DEFINE_PROP(_name, _state, _field, qdev_prop_on_off_auto_bit64, \ + OnOffAutoBit64, \ + .bitnr = (_bit), \ + .set_default = true, \ + .defval.i = (OnOffAuto)_defval) + #define DEFINE_PROP_BOOL(_name, _state, _field, _defval) \ DEFINE_PROP(_name, _state, _field, qdev_prop_bool, bool, \ .set_default = true, \ diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index f0a270bb4f61..cc76ff0dfae6 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -187,7 +187,8 @@ const PropertyInfo qdev_prop_bit = { static uint64_t qdev_get_prop_mask64(Property *prop) { - assert(prop->info == &qdev_prop_bit64); + assert(prop->info == &qdev_prop_bit64 || + prop->info == &qdev_prop_on_off_auto_bit64); return 0x1ull << prop->bitnr; } @@ -232,6 +233,69 @@ const PropertyInfo qdev_prop_bit64 = { .set_default_value = set_default_value_bool, }; +static void prop_get_on_off_auto_bit64(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + Property *prop = opaque; + OnOffAutoBit64 *p = object_field_prop_ptr(obj, prop); + int value; + uint64_t mask = qdev_get_prop_mask64(prop); + + if (p->auto_bits & mask) { + value = ON_OFF_AUTO_AUTO; + } else if (p->on_bits & mask) { + value = ON_OFF_AUTO_ON; + } else { + value = ON_OFF_AUTO_OFF; + } + + visit_type_enum(v, name, &value, &OnOffAuto_lookup, errp); +} + +static void prop_set_on_off_auto_bit64(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + Property *prop = opaque; + OnOffAutoBit64 *p = object_field_prop_ptr(obj, prop); + bool bool_value; + int value; + uint64_t mask = qdev_get_prop_mask64(prop); + + if (visit_type_bool(v, name, &bool_value, NULL)) { + value = bool_value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; + } else if (!visit_type_enum(v, name, &value, &OnOffAuto_lookup, errp)) { + return; + } + + switch (value) { + case ON_OFF_AUTO_AUTO: + p->on_bits &= ~mask; + p->auto_bits |= mask; + break; + + case ON_OFF_AUTO_ON: + p->on_bits |= mask; + p->auto_bits &= ~mask; + break; + + case ON_OFF_AUTO_OFF: + p->on_bits &= ~mask; + p->auto_bits &= ~mask; + break; + } +} + +const PropertyInfo qdev_prop_on_off_auto_bit64 = { + .name = "OnOffAuto", + .description = "on/off/auto", + .enum_table = &OnOffAuto_lookup, + .get = prop_get_on_off_auto_bit64, + .set = prop_set_on_off_auto_bit64, + .set_default_value = qdev_propinfo_set_default_value_enum, +}; + /* --- bool --- */ static void get_bool(Object *obj, Visitor *v, const char *name, void *opaque, -- 2.45.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/5] qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() 2024-07-14 5:11 ` [PATCH v3 2/5] qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() Akihiko Odaki @ 2024-07-15 11:47 ` Daniel P. Berrangé 2024-07-16 6:23 ` Akihiko Odaki 0 siblings, 1 reply; 10+ messages in thread From: Daniel P. Berrangé @ 2024-07-15 11:47 UTC (permalink / raw) To: Akihiko Odaki Cc: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Eduardo Habkost, qemu-devel On Sun, Jul 14, 2024 at 02:11:02PM +0900, Akihiko Odaki wrote: > DEFINE_PROP_ON_OFF_AUTO_BIT64() corresponds to DEFINE_PROP_ON_OFF_AUTO() > as DEFINE_PROP_BIT64() corresponds to DEFINE_PROP_BOOL(). The difference > is that DEFINE_PROP_ON_OFF_AUTO_BIT64() exposes OnOffAuto instead of > bool. IMHO this shouldn't be implemented in terms of On/Off auto, as it is misleadingly accepting much more than PROP_ON_OFF accepts. Rather it should be just DEFINE_PROP_AUTO_BIT64, implemented in terms of 'bool', with an extra 'auto' value. With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/5] qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() 2024-07-15 11:47 ` Daniel P. Berrangé @ 2024-07-16 6:23 ` Akihiko Odaki 0 siblings, 0 replies; 10+ messages in thread From: Akihiko Odaki @ 2024-07-16 6:23 UTC (permalink / raw) To: Daniel P. Berrangé Cc: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Eduardo Habkost, qemu-devel On 2024/07/15 20:47, Daniel P. Berrangé wrote: > On Sun, Jul 14, 2024 at 02:11:02PM +0900, Akihiko Odaki wrote: >> DEFINE_PROP_ON_OFF_AUTO_BIT64() corresponds to DEFINE_PROP_ON_OFF_AUTO() >> as DEFINE_PROP_BIT64() corresponds to DEFINE_PROP_BOOL(). The difference >> is that DEFINE_PROP_ON_OFF_AUTO_BIT64() exposes OnOffAuto instead of >> bool. > > IMHO this shouldn't be implemented in terms of On/Off auto, > as it is misleadingly accepting much more than PROP_ON_OFF > accepts. Rather it should be just DEFINE_PROP_AUTO_BIT64, > implemented in terms of 'bool', with an extra 'auto' value. I defined it in a way consistent with DEFINE_PROP_ON_OFF_AUTO(). A union of 'bool' and 'auto' would have a behavior somewhat inconsistent with DEFINE_PROP_ON_OFF_AUTO(). Regards, Akihiko Odaki ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 3/5] virtio-net: Convert feature properties to OnOffAuto 2024-07-14 5:11 [PATCH v3 0/5] virtio-net: Convert feature properties to OnOffAuto Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 1/5] qdev-properties: Accept bool for OnOffAuto Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 2/5] qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() Akihiko Odaki @ 2024-07-14 5:11 ` Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 4/5] virtio-net: Report RSS warning at device realization Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 5/5] virtio-net: Remove fallback from ebpf-rss-fds Akihiko Odaki 4 siblings, 0 replies; 10+ messages in thread From: Akihiko Odaki @ 2024-07-14 5:11 UTC (permalink / raw) To: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Daniel P. Berrangé, Eduardo Habkost Cc: qemu-devel, Akihiko Odaki Some features are not always available, and virtio-net used to disable them when not available even if the corresponding properties were explicitly set to "on". Convert feature properties to OnOffAuto so that the user can explicitly tell QEMU to automatically select the value by setting them "auto". QEMU will give an error if they are set "on". Convert "on" to "auto" when using an old machine for compatbility. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- include/hw/virtio/virtio-net.h | 3 +- hw/core/machine.c | 1 + hw/net/virtio-net.c | 254 +++++++++++++++++++++++++---------------- 3 files changed, 161 insertions(+), 97 deletions(-) diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h index 060c23c04d2d..cfa87f739248 100644 --- a/include/hw/virtio/virtio-net.h +++ b/include/hw/virtio/virtio-net.h @@ -178,7 +178,7 @@ struct VirtIONet { uint32_t has_vnet_hdr; size_t host_hdr_len; size_t guest_hdr_len; - uint64_t host_features; + OnOffAutoBit64 host_features; uint32_t rsc_timeout; uint8_t rsc4_enabled; uint8_t rsc6_enabled; @@ -218,6 +218,7 @@ struct VirtIONet { /* primary failover device is hidden*/ bool failover_primary_hidden; bool failover; + bool force_features_auto; DeviceListener primary_listener; QDict *primary_opts; bool primary_opts_from_json; diff --git a/hw/core/machine.c b/hw/core/machine.c index f4cba6496c84..783d3e5695d8 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -39,6 +39,7 @@ GlobalProperty hw_compat_9_0[] = { {"scsi-disk-base", "migrate-emulated-scsi-request", "false" }, {"vfio-pci", "skip-vsc-check", "false" }, { "virtio-pci", "x-pcie-pm-no-soft-reset", "off" }, + { TYPE_VIRTIO_NET, "x-force-features-auto", "on" }, }; const size_t hw_compat_9_0_len = G_N_ELEMENTS(hw_compat_9_0); diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 8f3097270869..bd285921d507 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -750,58 +750,101 @@ static void virtio_net_set_queue_pairs(VirtIONet *n) static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue); +static bool virtio_net_clear_features(OnOffAutoBit64 *features, + uint64_t clear_bits, + const char *reason, Error **errp) +{ + if (features->on_bits & clear_bits) { + error_setg(errp, "%s", reason); + return false; + } + + features->auto_bits &= ~clear_bits; + + return true; +} + static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features, Error **errp) { VirtIONet *n = VIRTIO_NET(vdev); NetClientState *nc = qemu_get_queue(n->nic); - - /* Firstly sync all virtio-net possible supported features */ - features |= n->host_features; - - virtio_add_feature(&features, VIRTIO_NET_F_MAC); - - if (!peer_has_vnet_hdr(n)) { - virtio_clear_feature(&features, VIRTIO_NET_F_CSUM); - virtio_clear_feature(&features, VIRTIO_NET_F_HOST_TSO4); - virtio_clear_feature(&features, VIRTIO_NET_F_HOST_TSO6); - virtio_clear_feature(&features, VIRTIO_NET_F_HOST_ECN); - - virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_CSUM); - virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_TSO4); - virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_TSO6); - virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_ECN); - - virtio_clear_feature(&features, VIRTIO_NET_F_HOST_USO); - virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO4); - virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO6); - - virtio_clear_feature(&features, VIRTIO_NET_F_HASH_REPORT); - } - - if (!peer_has_vnet_hdr(n) || !peer_has_ufo(n)) { - virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_UFO); - virtio_clear_feature(&features, VIRTIO_NET_F_HOST_UFO); - } - - if (!peer_has_uso(n)) { - virtio_clear_feature(&features, VIRTIO_NET_F_HOST_USO); - virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO4); - virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_USO6); + OnOffAutoBit64 on_off_auto_features = n->host_features; + + if (n->force_features_auto) { + on_off_auto_features.auto_bits |= on_off_auto_features.on_bits; + on_off_auto_features.on_bits = 0; + } + + on_off_auto_features.on_bits |= features; + virtio_add_feature(&on_off_auto_features.auto_bits, VIRTIO_NET_F_MAC); + + if (!((peer_has_vnet_hdr(n) || + virtio_net_clear_features(&on_off_auto_features, + BIT_ULL(VIRTIO_NET_F_CSUM) | + BIT_ULL(VIRTIO_NET_F_HOST_TSO4) | + BIT_ULL(VIRTIO_NET_F_HOST_TSO6) | + BIT_ULL(VIRTIO_NET_F_HOST_ECN) | + BIT_ULL(VIRTIO_NET_F_GUEST_UFO) | + BIT_ULL(VIRTIO_NET_F_GUEST_CSUM) | + BIT_ULL(VIRTIO_NET_F_GUEST_TSO4) | + BIT_ULL(VIRTIO_NET_F_GUEST_TSO6) | + BIT_ULL(VIRTIO_NET_F_GUEST_ECN) | + BIT_ULL(VIRTIO_NET_F_HOST_UFO) | + BIT_ULL(VIRTIO_NET_F_HOST_USO) | + BIT_ULL(VIRTIO_NET_F_GUEST_USO4) | + BIT_ULL(VIRTIO_NET_F_GUEST_USO6) | + BIT_ULL(VIRTIO_NET_F_HASH_REPORT), + "A requested feature requires the peer to support virtio-net headers.", + errp)) && + (peer_has_ufo(n) || + virtio_net_clear_features(&on_off_auto_features, + BIT_ULL(VIRTIO_NET_F_GUEST_UFO) | + BIT_ULL(VIRTIO_NET_F_HOST_UFO), + "UFO is on but the peer does not support it.", + errp)) && + (peer_has_uso(n) || + virtio_net_clear_features(&on_off_auto_features, + BIT_ULL(VIRTIO_NET_F_HOST_USO) | + BIT_ULL(VIRTIO_NET_F_GUEST_USO4) | + BIT_ULL(VIRTIO_NET_F_GUEST_USO6), + "USO is on but the peer does not support it.", + errp)) && + (virtio_has_feature(on_off_auto_features.on_bits | + on_off_auto_features.auto_bits, + VIRTIO_NET_F_CTRL_VQ) || + virtio_net_clear_features(&on_off_auto_features, + BIT_ULL(VIRTIO_NET_F_GUEST_ANNOUNCE), + "guest_announce is on but ctrl_vq is off.", + errp)))) { + return 0; } if (!get_vhost_net(nc->peer)) { - return features; + if (!ebpf_rss_is_loaded(&n->ebpf_rss)) { + virtio_clear_feature(&on_off_auto_features.auto_bits, + VIRTIO_NET_F_RSS); + } + + return on_off_auto_features.on_bits | on_off_auto_features.auto_bits; } - if (!ebpf_rss_is_loaded(&n->ebpf_rss)) { - virtio_clear_feature(&features, VIRTIO_NET_F_RSS); + if (!ebpf_rss_is_loaded(&n->ebpf_rss) && + !virtio_net_clear_features(&on_off_auto_features, + BIT_ULL(VIRTIO_NET_F_RSS), + "Both RSS and vhost are on but eBPF is unavailable; fix eBPF or disable RSS.", + errp)) { + return 0; } - features = vhost_net_get_features(get_vhost_net(nc->peer), features); + features = vhost_net_get_features(get_vhost_net(nc->peer), + on_off_auto_features.on_bits | + on_off_auto_features.auto_bits); vdev->backend_features = features; if (n->mtu_bypass_backend && - (n->host_features & 1ULL << VIRTIO_NET_F_MTU)) { + virtio_has_feature(on_off_auto_features.on_bits | + on_off_auto_features.auto_bits, + VIRTIO_NET_F_MTU)) { features |= (1ULL << VIRTIO_NET_F_MTU); } @@ -820,6 +863,12 @@ static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features, virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_ANNOUNCE); } + if ((features & on_off_auto_features.on_bits) != + on_off_auto_features.on_bits) { + error_setg(errp, "A requested feature is incompatible with vhost."); + return 0; + } + return features; } @@ -3592,7 +3641,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) int i; if (n->net_conf.mtu) { - n->host_features |= (1ULL << VIRTIO_NET_F_MTU); + n->host_features.on_bits |= (1ULL << VIRTIO_NET_F_MTU); } if (n->net_conf.duplex_str) { @@ -3604,7 +3653,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) error_setg(errp, "'duplex' must be 'half' or 'full'"); return; } - n->host_features |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); + n->host_features.on_bits |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); } else { n->net_conf.duplex = DUPLEX_UNKNOWN; } @@ -3614,7 +3663,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) return; } if (n->net_conf.speed >= 0) { - n->host_features |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); + n->host_features.on_bits |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); } if (n->failover) { @@ -3623,10 +3672,12 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) device_listener_register(&n->primary_listener); migration_add_notifier(&n->migration_state, virtio_net_migration_state_notifier); - n->host_features |= (1ULL << VIRTIO_NET_F_STANDBY); + n->host_features.on_bits |= (1ULL << VIRTIO_NET_F_STANDBY); } - virtio_net_set_config_size(n, n->host_features); + virtio_net_set_config_size(n, + n->host_features.on_bits | + n->host_features.auto_bits); virtio_init(vdev, VIRTIO_ID_NET, n->config_size); /* @@ -3753,7 +3804,9 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) net_rx_pkt_init(&n->rx_pkt); - if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) { + if (virtio_has_feature(n->host_features.on_bits | + n->host_features.auto_bits, + VIRTIO_NET_F_RSS)) { virtio_net_load_ebpf(n); } } @@ -3764,7 +3817,9 @@ static void virtio_net_device_unrealize(DeviceState *dev) VirtIONet *n = VIRTIO_NET(dev); int i, max_queue_pairs; - if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) { + if (virtio_has_feature(n->host_features.on_bits | + n->host_features.auto_bits, + VIRTIO_NET_F_RSS)) { virtio_net_unload_ebpf(n); } @@ -3908,53 +3963,58 @@ static const VMStateDescription vmstate_virtio_net = { }; static Property virtio_net_properties[] = { - DEFINE_PROP_BIT64("csum", VirtIONet, host_features, - VIRTIO_NET_F_CSUM, true), - DEFINE_PROP_BIT64("guest_csum", VirtIONet, host_features, - VIRTIO_NET_F_GUEST_CSUM, true), - DEFINE_PROP_BIT64("gso", VirtIONet, host_features, VIRTIO_NET_F_GSO, true), - DEFINE_PROP_BIT64("guest_tso4", VirtIONet, host_features, - VIRTIO_NET_F_GUEST_TSO4, true), - DEFINE_PROP_BIT64("guest_tso6", VirtIONet, host_features, - VIRTIO_NET_F_GUEST_TSO6, true), - DEFINE_PROP_BIT64("guest_ecn", VirtIONet, host_features, - VIRTIO_NET_F_GUEST_ECN, true), - DEFINE_PROP_BIT64("guest_ufo", VirtIONet, host_features, - VIRTIO_NET_F_GUEST_UFO, true), - DEFINE_PROP_BIT64("guest_announce", VirtIONet, host_features, - VIRTIO_NET_F_GUEST_ANNOUNCE, true), - DEFINE_PROP_BIT64("host_tso4", VirtIONet, host_features, - VIRTIO_NET_F_HOST_TSO4, true), - DEFINE_PROP_BIT64("host_tso6", VirtIONet, host_features, - VIRTIO_NET_F_HOST_TSO6, true), - DEFINE_PROP_BIT64("host_ecn", VirtIONet, host_features, - VIRTIO_NET_F_HOST_ECN, true), - DEFINE_PROP_BIT64("host_ufo", VirtIONet, host_features, - VIRTIO_NET_F_HOST_UFO, true), - DEFINE_PROP_BIT64("mrg_rxbuf", VirtIONet, host_features, - VIRTIO_NET_F_MRG_RXBUF, true), - DEFINE_PROP_BIT64("status", VirtIONet, host_features, - VIRTIO_NET_F_STATUS, true), - DEFINE_PROP_BIT64("ctrl_vq", VirtIONet, host_features, - VIRTIO_NET_F_CTRL_VQ, true), - DEFINE_PROP_BIT64("ctrl_rx", VirtIONet, host_features, - VIRTIO_NET_F_CTRL_RX, true), - DEFINE_PROP_BIT64("ctrl_vlan", VirtIONet, host_features, - VIRTIO_NET_F_CTRL_VLAN, true), - DEFINE_PROP_BIT64("ctrl_rx_extra", VirtIONet, host_features, - VIRTIO_NET_F_CTRL_RX_EXTRA, true), - DEFINE_PROP_BIT64("ctrl_mac_addr", VirtIONet, host_features, - VIRTIO_NET_F_CTRL_MAC_ADDR, true), - DEFINE_PROP_BIT64("ctrl_guest_offloads", VirtIONet, host_features, - VIRTIO_NET_F_CTRL_GUEST_OFFLOADS, true), - DEFINE_PROP_BIT64("mq", VirtIONet, host_features, VIRTIO_NET_F_MQ, false), - DEFINE_PROP_BIT64("rss", VirtIONet, host_features, - VIRTIO_NET_F_RSS, false), - DEFINE_PROP_BIT64("hash", VirtIONet, host_features, - VIRTIO_NET_F_HASH_REPORT, false), + DEFINE_PROP_ON_OFF_AUTO_BIT64("csum", VirtIONet, host_features, + VIRTIO_NET_F_CSUM, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("guest_csum", VirtIONet, host_features, + VIRTIO_NET_F_GUEST_CSUM, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("gso", VirtIONet, host_features, + VIRTIO_NET_F_GSO, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("guest_tso4", VirtIONet, host_features, + VIRTIO_NET_F_GUEST_TSO4, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("guest_tso6", VirtIONet, host_features, + VIRTIO_NET_F_GUEST_TSO6, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("guest_ecn", VirtIONet, host_features, + VIRTIO_NET_F_GUEST_ECN, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("guest_ufo", VirtIONet, host_features, + VIRTIO_NET_F_GUEST_UFO, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("guest_announce", VirtIONet, host_features, + VIRTIO_NET_F_GUEST_ANNOUNCE, + ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("host_tso4", VirtIONet, host_features, + VIRTIO_NET_F_HOST_TSO4, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("host_tso6", VirtIONet, host_features, + VIRTIO_NET_F_HOST_TSO6, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("host_ecn", VirtIONet, host_features, + VIRTIO_NET_F_HOST_ECN, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("host_ufo", VirtIONet, host_features, + VIRTIO_NET_F_HOST_UFO, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("mrg_rxbuf", VirtIONet, host_features, + VIRTIO_NET_F_MRG_RXBUF, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("status", VirtIONet, host_features, + VIRTIO_NET_F_STATUS, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("ctrl_vq", VirtIONet, host_features, + VIRTIO_NET_F_CTRL_VQ, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("ctrl_rx", VirtIONet, host_features, + VIRTIO_NET_F_CTRL_RX, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("ctrl_vlan", VirtIONet, host_features, + VIRTIO_NET_F_CTRL_VLAN, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("ctrl_rx_extra", VirtIONet, host_features, + VIRTIO_NET_F_CTRL_RX_EXTRA, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("ctrl_mac_addr", VirtIONet, host_features, + VIRTIO_NET_F_CTRL_MAC_ADDR, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("ctrl_guest_offloads", VirtIONet, + host_features, + VIRTIO_NET_F_CTRL_GUEST_OFFLOADS, + ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("mq", VirtIONet, host_features, + VIRTIO_NET_F_MQ, ON_OFF_AUTO_OFF), + DEFINE_PROP_ON_OFF_AUTO_BIT64("rss", VirtIONet, host_features, + VIRTIO_NET_F_RSS, ON_OFF_AUTO_OFF), + DEFINE_PROP_ON_OFF_AUTO_BIT64("hash", VirtIONet, host_features, + VIRTIO_NET_F_HASH_REPORT, ON_OFF_AUTO_OFF), DEFINE_PROP_ARRAY("ebpf-rss-fds", VirtIONet, nr_ebpf_rss_fds, ebpf_rss_fds, qdev_prop_string, char*), - DEFINE_PROP_BIT64("guest_rsc_ext", VirtIONet, host_features, + DEFINE_PROP_BIT64("guest_rsc_ext", VirtIONet, host_features.on_bits, VIRTIO_NET_F_RSC_EXT, false), DEFINE_PROP_UINT32("rsc_interval", VirtIONet, rsc_timeout, VIRTIO_NET_RSC_DEFAULT_INTERVAL), @@ -3973,12 +4033,14 @@ static Property virtio_net_properties[] = { DEFINE_PROP_INT32("speed", VirtIONet, net_conf.speed, SPEED_UNKNOWN), DEFINE_PROP_STRING("duplex", VirtIONet, net_conf.duplex_str), DEFINE_PROP_BOOL("failover", VirtIONet, failover, false), - DEFINE_PROP_BIT64("guest_uso4", VirtIONet, host_features, - VIRTIO_NET_F_GUEST_USO4, true), - DEFINE_PROP_BIT64("guest_uso6", VirtIONet, host_features, - VIRTIO_NET_F_GUEST_USO6, true), - DEFINE_PROP_BIT64("host_uso", VirtIONet, host_features, - VIRTIO_NET_F_HOST_USO, true), + DEFINE_PROP_BOOL("x-force-features-auto", VirtIONet, force_features_auto, + false), + DEFINE_PROP_ON_OFF_AUTO_BIT64("guest_uso4", VirtIONet, host_features, + VIRTIO_NET_F_GUEST_USO4, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("guest_uso6", VirtIONet, host_features, + VIRTIO_NET_F_GUEST_USO6, ON_OFF_AUTO_AUTO), + DEFINE_PROP_ON_OFF_AUTO_BIT64("host_uso", VirtIONet, host_features, + VIRTIO_NET_F_HOST_USO, ON_OFF_AUTO_AUTO), DEFINE_PROP_END_OF_LIST(), }; -- 2.45.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 4/5] virtio-net: Report RSS warning at device realization 2024-07-14 5:11 [PATCH v3 0/5] virtio-net: Convert feature properties to OnOffAuto Akihiko Odaki ` (2 preceding siblings ...) 2024-07-14 5:11 ` [PATCH v3 3/5] virtio-net: Convert feature properties to OnOffAuto Akihiko Odaki @ 2024-07-14 5:11 ` Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 5/5] virtio-net: Remove fallback from ebpf-rss-fds Akihiko Odaki 4 siblings, 0 replies; 10+ messages in thread From: Akihiko Odaki @ 2024-07-14 5:11 UTC (permalink / raw) To: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Daniel P. Berrangé, Eduardo Habkost Cc: qemu-devel, Akihiko Odaki Warning about RSS fallback at device realization allows the user to notice the configuration problem early. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- hw/net/virtio-net.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index bd285921d507..e779ba2df428 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -822,6 +822,10 @@ static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features, if (!get_vhost_net(nc->peer)) { if (!ebpf_rss_is_loaded(&n->ebpf_rss)) { + if (on_off_auto_features.on_bits & VIRTIO_NET_F_RSS) { + warn_report("Can't load eBPF RSS - fallback to software RSS"); + } + virtio_clear_feature(&on_off_auto_features.auto_bits, VIRTIO_NET_F_RSS); } @@ -1332,16 +1336,10 @@ static void virtio_net_detach_epbf_rss(VirtIONet *n) static void virtio_net_commit_rss_config(VirtIONet *n) { if (n->rss_data.enabled) { - n->rss_data.enabled_software_rss = n->rss_data.populate_hash; + n->rss_data.enabled_software_rss = n->rss_data.populate_hash || + !virtio_net_attach_epbf_rss(n); if (n->rss_data.populate_hash) { virtio_net_detach_epbf_rss(n); - } else if (!virtio_net_attach_epbf_rss(n)) { - if (get_vhost_net(qemu_get_queue(n->nic)->peer)) { - warn_report("Can't load eBPF RSS for vhost"); - } else { - warn_report("Can't load eBPF RSS - fallback to software RSS"); - n->rss_data.enabled_software_rss = true; - } } trace_virtio_net_rss_enable(n->rss_data.hash_types, -- 2.45.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 5/5] virtio-net: Remove fallback from ebpf-rss-fds 2024-07-14 5:11 [PATCH v3 0/5] virtio-net: Convert feature properties to OnOffAuto Akihiko Odaki ` (3 preceding siblings ...) 2024-07-14 5:11 ` [PATCH v3 4/5] virtio-net: Report RSS warning at device realization Akihiko Odaki @ 2024-07-14 5:11 ` Akihiko Odaki 4 siblings, 0 replies; 10+ messages in thread From: Akihiko Odaki @ 2024-07-14 5:11 UTC (permalink / raw) To: Jason Wang, Dmitry Fleytman, Sriram Yagnaraman, Michael S. Tsirkin, Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione, Andrew Melnychenko, Yuri Benditovich, Paolo Bonzini, Daniel P. Berrangé, Eduardo Habkost Cc: qemu-devel, Akihiko Odaki If ebpf-rss-fds is specified but we fail to use, we should not fall back to loading eBPF programs by ourselves as such makes the situation complicated. Suggested-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> --- hw/net/virtio-net.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index e779ba2df428..2f0a4f2aabf7 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -1361,21 +1361,21 @@ static void virtio_net_disable_rss(VirtIONet *n) virtio_net_commit_rss_config(n); } -static bool virtio_net_load_ebpf_fds(VirtIONet *n) +static bool virtio_net_load_ebpf_fds(VirtIONet *n, Error **errp) { int fds[EBPF_RSS_MAX_FDS] = { [0 ... EBPF_RSS_MAX_FDS - 1] = -1}; int ret = true; int i = 0; if (n->nr_ebpf_rss_fds != EBPF_RSS_MAX_FDS) { - warn_report("Expected %d file descriptors but got %d", - EBPF_RSS_MAX_FDS, n->nr_ebpf_rss_fds); + error_setg(errp, "Expected %d file descriptors but got %d", + EBPF_RSS_MAX_FDS, n->nr_ebpf_rss_fds); return false; } for (i = 0; i < n->nr_ebpf_rss_fds; i++) { fds[i] = monitor_fd_param(monitor_cur(), n->ebpf_rss_fds[i], - &error_warn); + errp); if (fds[i] < 0) { ret = false; goto exit; @@ -1394,17 +1394,11 @@ exit: return ret; } -static bool virtio_net_load_ebpf(VirtIONet *n) +static bool virtio_net_load_ebpf(VirtIONet *n, Error **errp) { - bool ret = false; - - if (virtio_net_attach_ebpf_to_backend(n->nic, -1)) { - if (!(n->ebpf_rss_fds && virtio_net_load_ebpf_fds(n))) { - ret = ebpf_rss_load(&n->ebpf_rss); - } - } - - return ret; + return virtio_net_attach_ebpf_to_backend(n->nic, -1) && + (n->ebpf_rss_fds ? virtio_net_load_ebpf_fds(n, errp) : + ebpf_rss_load(&n->ebpf_rss)); } static void virtio_net_unload_ebpf(VirtIONet *n) @@ -3805,7 +3799,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) if (virtio_has_feature(n->host_features.on_bits | n->host_features.auto_bits, VIRTIO_NET_F_RSS)) { - virtio_net_load_ebpf(n); + virtio_net_load_ebpf(n, errp); } } -- 2.45.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-07-16 6:24 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-07-14 5:11 [PATCH v3 0/5] virtio-net: Convert feature properties to OnOffAuto Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 1/5] qdev-properties: Accept bool for OnOffAuto Akihiko Odaki 2024-07-15 11:38 ` Daniel P. Berrangé 2024-07-16 6:11 ` Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 2/5] qdev-properties: Add DEFINE_PROP_ON_OFF_AUTO_BIT64() Akihiko Odaki 2024-07-15 11:47 ` Daniel P. Berrangé 2024-07-16 6:23 ` Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 3/5] virtio-net: Convert feature properties to OnOffAuto Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 4/5] virtio-net: Report RSS warning at device realization Akihiko Odaki 2024-07-14 5:11 ` [PATCH v3 5/5] virtio-net: Remove fallback from ebpf-rss-fds Akihiko Odaki
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).