vhost: 64 bit features
Make sure that all vhost interfaces use 64 bit features, as the virtio core does, and make sure to use ULL everywhere possible to be on the safe side. Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
b150613200
commit
9a2ba82302
|
@ -109,13 +109,13 @@ static const int *vhost_net_get_feature_bits(struct vhost_net *net)
|
||||||
return feature_bits;
|
return feature_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned vhost_net_get_features(struct vhost_net *net, unsigned features)
|
uint64_t vhost_net_get_features(struct vhost_net *net, uint64_t features)
|
||||||
{
|
{
|
||||||
return vhost_get_features(&net->dev, vhost_net_get_feature_bits(net),
|
return vhost_get_features(&net->dev, vhost_net_get_feature_bits(net),
|
||||||
features);
|
features);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhost_net_ack_features(struct vhost_net *net, unsigned features)
|
void vhost_net_ack_features(struct vhost_net *net, uint64_t features)
|
||||||
{
|
{
|
||||||
net->dev.acked_features = net->dev.backend_features;
|
net->dev.acked_features = net->dev.backend_features;
|
||||||
vhost_ack_features(&net->dev, vhost_net_get_feature_bits(net), features);
|
vhost_ack_features(&net->dev, vhost_net_get_feature_bits(net), features);
|
||||||
|
@ -149,7 +149,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
net->dev.backend_features = qemu_has_vnet_hdr(options->net_backend)
|
net->dev.backend_features = qemu_has_vnet_hdr(options->net_backend)
|
||||||
? 0 : (1 << VHOST_NET_F_VIRTIO_NET_HDR);
|
? 0 : (1ULL << VHOST_NET_F_VIRTIO_NET_HDR);
|
||||||
net->backend = r;
|
net->backend = r;
|
||||||
} else {
|
} else {
|
||||||
net->dev.backend_features = 0;
|
net->dev.backend_features = 0;
|
||||||
|
@ -169,7 +169,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
|
||||||
if (backend_kernel) {
|
if (backend_kernel) {
|
||||||
if (!qemu_has_vnet_hdr_len(options->net_backend,
|
if (!qemu_has_vnet_hdr_len(options->net_backend,
|
||||||
sizeof(struct virtio_net_hdr_mrg_rxbuf))) {
|
sizeof(struct virtio_net_hdr_mrg_rxbuf))) {
|
||||||
net->dev.features &= ~(1 << VIRTIO_NET_F_MRG_RXBUF);
|
net->dev.features &= ~(1ULL << VIRTIO_NET_F_MRG_RXBUF);
|
||||||
}
|
}
|
||||||
if (~net->dev.features & net->dev.backend_features) {
|
if (~net->dev.features & net->dev.backend_features) {
|
||||||
fprintf(stderr, "vhost lacks feature mask %" PRIu64
|
fprintf(stderr, "vhost lacks feature mask %" PRIu64
|
||||||
|
@ -433,11 +433,11 @@ void vhost_net_cleanup(struct vhost_net *net)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned vhost_net_get_features(struct vhost_net *net, unsigned features)
|
uint64_t vhost_net_get_features(struct vhost_net *net, uint64_t features)
|
||||||
{
|
{
|
||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
void vhost_net_ack_features(struct vhost_net *net, unsigned features)
|
void vhost_net_ack_features(struct vhost_net *net, uint64_t features)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -590,7 +590,7 @@ static int vhost_dev_set_features(struct vhost_dev *dev, bool enable_log)
|
||||||
uint64_t features = dev->acked_features;
|
uint64_t features = dev->acked_features;
|
||||||
int r;
|
int r;
|
||||||
if (enable_log) {
|
if (enable_log) {
|
||||||
features |= 0x1 << VHOST_F_LOG_ALL;
|
features |= 0x1ULL << VHOST_F_LOG_ALL;
|
||||||
}
|
}
|
||||||
r = dev->vhost_ops->vhost_call(dev, VHOST_SET_FEATURES, &features);
|
r = dev->vhost_ops->vhost_call(dev, VHOST_SET_FEATURES, &features);
|
||||||
return r < 0 ? -errno : 0;
|
return r < 0 ? -errno : 0;
|
||||||
|
@ -899,7 +899,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
|
||||||
.priority = 10
|
.priority = 10
|
||||||
};
|
};
|
||||||
hdev->migration_blocker = NULL;
|
hdev->migration_blocker = NULL;
|
||||||
if (!(hdev->features & (0x1 << VHOST_F_LOG_ALL))) {
|
if (!(hdev->features & (0x1ULL << VHOST_F_LOG_ALL))) {
|
||||||
error_setg(&hdev->migration_blocker,
|
error_setg(&hdev->migration_blocker,
|
||||||
"Migration disabled: vhost lacks VHOST_F_LOG_ALL feature.");
|
"Migration disabled: vhost lacks VHOST_F_LOG_ALL feature.");
|
||||||
migrate_add_blocker(hdev->migration_blocker);
|
migrate_add_blocker(hdev->migration_blocker);
|
||||||
|
@ -1042,12 +1042,12 @@ void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n,
|
||||||
assert(r >= 0);
|
assert(r >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned vhost_get_features(struct vhost_dev *hdev, const int *feature_bits,
|
uint64_t vhost_get_features(struct vhost_dev *hdev, const int *feature_bits,
|
||||||
unsigned features)
|
uint64_t features)
|
||||||
{
|
{
|
||||||
const int *bit = feature_bits;
|
const int *bit = feature_bits;
|
||||||
while (*bit != VHOST_INVALID_FEATURE_BIT) {
|
while (*bit != VHOST_INVALID_FEATURE_BIT) {
|
||||||
unsigned bit_mask = (1 << *bit);
|
uint64_t bit_mask = (1ULL << *bit);
|
||||||
if (!(hdev->features & bit_mask)) {
|
if (!(hdev->features & bit_mask)) {
|
||||||
features &= ~bit_mask;
|
features &= ~bit_mask;
|
||||||
}
|
}
|
||||||
|
@ -1057,11 +1057,11 @@ unsigned vhost_get_features(struct vhost_dev *hdev, const int *feature_bits,
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits,
|
void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits,
|
||||||
unsigned features)
|
uint64_t features)
|
||||||
{
|
{
|
||||||
const int *bit = feature_bits;
|
const int *bit = feature_bits;
|
||||||
while (*bit != VHOST_INVALID_FEATURE_BIT) {
|
while (*bit != VHOST_INVALID_FEATURE_BIT) {
|
||||||
unsigned bit_mask = (1 << *bit);
|
uint64_t bit_mask = (1ULL << *bit);
|
||||||
if (features & bit_mask) {
|
if (features & bit_mask) {
|
||||||
hdev->acked_features |= bit_mask;
|
hdev->acked_features |= bit_mask;
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,8 +78,8 @@ bool vhost_virtqueue_pending(struct vhost_dev *hdev, int n);
|
||||||
*/
|
*/
|
||||||
void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n,
|
void vhost_virtqueue_mask(struct vhost_dev *hdev, VirtIODevice *vdev, int n,
|
||||||
bool mask);
|
bool mask);
|
||||||
unsigned vhost_get_features(struct vhost_dev *hdev, const int *feature_bits,
|
uint64_t vhost_get_features(struct vhost_dev *hdev, const int *feature_bits,
|
||||||
unsigned features);
|
uint64_t features);
|
||||||
void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits,
|
void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits,
|
||||||
unsigned features);
|
uint64_t features);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -22,8 +22,8 @@ void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs, int total_queues);
|
||||||
|
|
||||||
void vhost_net_cleanup(VHostNetState *net);
|
void vhost_net_cleanup(VHostNetState *net);
|
||||||
|
|
||||||
unsigned vhost_net_get_features(VHostNetState *net, unsigned features);
|
uint64_t vhost_net_get_features(VHostNetState *net, uint64_t features);
|
||||||
void vhost_net_ack_features(VHostNetState *net, unsigned features);
|
void vhost_net_ack_features(VHostNetState *net, uint64_t features);
|
||||||
|
|
||||||
bool vhost_net_virtqueue_pending(VHostNetState *net, int n);
|
bool vhost_net_virtqueue_pending(VHostNetState *net, int n);
|
||||||
void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
|
void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
|
||||||
|
|
Loading…
Reference in a new issue