提交 9a2ba823 编写于 作者: C Cornelia Huck 提交者: Michael S. Tsirkin

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: NCornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
上级 b1506132
...@@ -109,13 +109,13 @@ static const int *vhost_net_get_feature_bits(struct vhost_net *net) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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); ...@@ -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); ...@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册