From: Gautam Dawar <1924603@bugs.launchpad.net>
To: qemu-devel@nongnu.org
Subject: [Bug 1924603] [NEW] Incorrect feature negotiation for vhost-vdpa netdevice
Date: Thu, 15 Apr 2021 18:15:26 -0000 [thread overview]
Message-ID: <161851052657.18499.4390060645724242620.malonedeb@wampee.canonical.com> (raw)
Public bug reported:
QEMU cmdline:
=============
./x86_64-softmmu/qemu-system-x86_64 -machine accel=kvm -m 2G -hda /gautam/centos75_1.qcow2 -name gautam,process=gautam -enable-kvm -netdev vhost-vdpa,id=mynet0,vhostdev=/dev/vhost-vdpa-0 -device virtio-net-pci,netdev=mynet0,mac=02:AA:BB:DD:00:20,disable-modern=off,page-per-vq=on -cpu host --nographic
Host OS:
========
Linux kernel 5.11 running on x86 host
Guest OS:
==========
CentOS 7.5
Root cause analysis:
=====================
For vhost-vdpa netdevice, the feature negotiation results in sending the
superset of features received from device in call to get_features vdpa
ops callback.
During the feature-negotiation phase, the acknowledged feature bits are
initialized with backend_features and then checked for supported
feature bits in vhost_ack_features():
void vhost_net_ack_features(struct vhost_net *net, uint64_t features)
{
net->dev.acked_features = net->dev.backend_features;
vhost_ack_features(&net->dev, vhost_net_get_feature_bits(net), features);
}
The vhost_ack_features() function just builds up on the dev.acked_features and never trims it down:
void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits, uint64_t features)
{ const int *bit = feature_bits;
while (*bit != VHOST_INVALID_FEATURE_BIT) {
uint64_t bit_mask = (1ULL << *bit);
if (features & bit_mask)
hdev->acked_features |= bit_mask;
bit++;
}
}
Because of this hdev->acked_features is always minimally equal to the
value of device features and this is the value that is passed to the
device in set_features callback:
static int vhost_dev_set_features(struct vhost_dev *dev, bool enable_log)
{
uint64_t *features = dev->acked_features;
.....
r = dev->vhost_ops->*vhost_set_features*(dev, features);
}
** Affects: qemu
Importance: Undecided
Status: New
** Tags: v5.1.0
** Tags added: v5.1.0
--
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1924603
Title:
Incorrect feature negotiation for vhost-vdpa netdevice
Status in QEMU:
New
Bug description:
QEMU cmdline:
=============
./x86_64-softmmu/qemu-system-x86_64 -machine accel=kvm -m 2G -hda /gautam/centos75_1.qcow2 -name gautam,process=gautam -enable-kvm -netdev vhost-vdpa,id=mynet0,vhostdev=/dev/vhost-vdpa-0 -device virtio-net-pci,netdev=mynet0,mac=02:AA:BB:DD:00:20,disable-modern=off,page-per-vq=on -cpu host --nographic
Host OS:
========
Linux kernel 5.11 running on x86 host
Guest OS:
==========
CentOS 7.5
Root cause analysis:
=====================
For vhost-vdpa netdevice, the feature negotiation results in sending
the superset of features received from device in call to get_features
vdpa ops callback.
During the feature-negotiation phase, the acknowledged feature bits
are initialized with backend_features and then checked for supported
feature bits in vhost_ack_features():
void vhost_net_ack_features(struct vhost_net *net, uint64_t features)
{
net->dev.acked_features = net->dev.backend_features;
vhost_ack_features(&net->dev, vhost_net_get_feature_bits(net), features);
}
The vhost_ack_features() function just builds up on the dev.acked_features and never trims it down:
void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits, uint64_t features)
{ const int *bit = feature_bits;
while (*bit != VHOST_INVALID_FEATURE_BIT) {
uint64_t bit_mask = (1ULL << *bit);
if (features & bit_mask)
hdev->acked_features |= bit_mask;
bit++;
}
}
Because of this hdev->acked_features is always minimally equal to the
value of device features and this is the value that is passed to the
device in set_features callback:
static int vhost_dev_set_features(struct vhost_dev *dev, bool enable_log)
{
uint64_t *features = dev->acked_features;
.....
r = dev->vhost_ops->*vhost_set_features*(dev, features);
}
To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1924603/+subscriptions
next reply other threads:[~2021-04-15 18:28 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-15 18:15 Gautam Dawar [this message]
2021-04-15 18:17 ` [Bug 1924603] Re: Incorrect feature negotiation for vhost-vdpa netdevice Gautam Dawar
2021-05-13 8:09 ` Gautam Dawar
2021-05-15 9:40 ` Thomas Huth
2021-05-17 18:33 ` Thomas Huth
2021-05-18 8:11 ` Gautam Dawar
2021-05-18 10:06 ` Thomas Huth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=161851052657.18499.4390060645724242620.malonedeb@wampee.canonical.com \
--to=1924603@bugs.launchpad.net \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.