vdpa: extract vhost_vdpa_net_load_mac from vhost_vdpa_net_load

Since there may be many commands we need to issue to load the NIC
state, let's split them in individual functions

Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Eugenio Pérez 2022-09-06 17:07:15 +02:00 committed by Jason Wang
parent 17fb889f8a
commit f73c0c43ac

View file

@ -365,12 +365,47 @@ static ssize_t vhost_vdpa_net_cvq_add(VhostVDPAState *s, size_t out_len,
return vhost_svq_poll(svq); return vhost_svq_poll(svq);
} }
static ssize_t vhost_vdpa_net_load_cmd(VhostVDPAState *s, uint8_t class,
uint8_t cmd, const void *data,
size_t data_size)
{
const struct virtio_net_ctrl_hdr ctrl = {
.class = class,
.cmd = cmd,
};
assert(data_size < vhost_vdpa_net_cvq_cmd_page_len() - sizeof(ctrl));
memcpy(s->cvq_cmd_out_buffer, &ctrl, sizeof(ctrl));
memcpy(s->cvq_cmd_out_buffer + sizeof(ctrl), data, data_size);
return vhost_vdpa_net_cvq_add(s, sizeof(ctrl) + data_size,
sizeof(virtio_net_ctrl_ack));
}
static int vhost_vdpa_net_load_mac(VhostVDPAState *s, const VirtIONet *n)
{
uint64_t features = n->parent_obj.guest_features;
if (features & BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR)) {
ssize_t dev_written = vhost_vdpa_net_load_cmd(s, VIRTIO_NET_CTRL_MAC,
VIRTIO_NET_CTRL_MAC_ADDR_SET,
n->mac, sizeof(n->mac));
if (unlikely(dev_written < 0)) {
return dev_written;
}
return *s->status != VIRTIO_NET_OK;
}
return 0;
}
static int vhost_vdpa_net_load(NetClientState *nc) static int vhost_vdpa_net_load(NetClientState *nc)
{ {
VhostVDPAState *s = DO_UPCAST(VhostVDPAState, nc, nc); VhostVDPAState *s = DO_UPCAST(VhostVDPAState, nc, nc);
const struct vhost_vdpa *v = &s->vhost_vdpa; struct vhost_vdpa *v = &s->vhost_vdpa;
const VirtIONet *n; const VirtIONet *n;
uint64_t features; int r;
assert(nc->info->type == NET_CLIENT_DRIVER_VHOST_VDPA); assert(nc->info->type == NET_CLIENT_DRIVER_VHOST_VDPA);
@ -379,26 +414,9 @@ static int vhost_vdpa_net_load(NetClientState *nc)
} }
n = VIRTIO_NET(v->dev->vdev); n = VIRTIO_NET(v->dev->vdev);
features = n->parent_obj.guest_features; r = vhost_vdpa_net_load_mac(s, n);
if (features & BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR)) { if (unlikely(r < 0)) {
const struct virtio_net_ctrl_hdr ctrl = { return r;
.class = VIRTIO_NET_CTRL_MAC,
.cmd = VIRTIO_NET_CTRL_MAC_ADDR_SET,
};
char *cursor = s->cvq_cmd_out_buffer;
ssize_t dev_written;
memcpy(cursor, &ctrl, sizeof(ctrl));
cursor += sizeof(ctrl);
memcpy(cursor, n->mac, sizeof(n->mac));
dev_written = vhost_vdpa_net_cvq_add(s, sizeof(ctrl) + sizeof(n->mac),
sizeof(virtio_net_ctrl_ack));
if (unlikely(dev_written < 0)) {
return dev_written;
}
return *s->status != VIRTIO_NET_OK;
} }
return 0; return 0;