mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
msix: Assert that specified vector is in range
There were several different ways to deal with the situation where the vector specified for a msix function is out of bound: - early return a function and keep progresssing - propagate the error to the caller - mark msix unusable - assert it is in bound - just ignore An out-of-bound vector should not be specified if the device implementation is correct so let msix functions always assert that the specified vector is in range. An exceptional case is virtio-pci, which allows the guest to configure vectors. For virtio-pci, it is more appropriate to introduce its own checks because it is sometimes too late to check the vector range in msix functions. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Message-Id: <20220829083524.143640-1-akihiko.odaki@daynix.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Yuval Shaia <yuval.shaia.ml@gmail.com> Signed-off-by: Akihiko Odaki <<a href="mailto:akihiko.odaki@daynix.com" target="_blank">akihiko.odaki@daynix.com</a>><br>
This commit is contained in:
parent
3b3112501d
commit
15377f6e79
9 changed files with 74 additions and 107 deletions
|
@ -2110,20 +2110,14 @@ vmxnet3_unuse_msix_vectors(VMXNET3State *s, int num_vectors)
|
|||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
static void
|
||||
vmxnet3_use_msix_vectors(VMXNET3State *s, int num_vectors)
|
||||
{
|
||||
PCIDevice *d = PCI_DEVICE(s);
|
||||
int i;
|
||||
for (i = 0; i < num_vectors; i++) {
|
||||
int res = msix_vector_use(d, i);
|
||||
if (0 > res) {
|
||||
VMW_WRPRN("Failed to use MSI-X vector %d, error %d", i, res);
|
||||
vmxnet3_unuse_msix_vectors(s, i);
|
||||
return false;
|
||||
}
|
||||
msix_vector_use(d, i);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@ -2141,13 +2135,8 @@ vmxnet3_init_msix(VMXNET3State *s)
|
|||
VMW_WRPRN("Failed to initialize MSI-X, error %d", res);
|
||||
s->msix_used = false;
|
||||
} else {
|
||||
if (!vmxnet3_use_msix_vectors(s, VMXNET3_MAX_INTRS)) {
|
||||
VMW_WRPRN("Failed to use MSI-X vectors, error %d", res);
|
||||
msix_uninit(d, &s->msix_bar, &s->msix_bar);
|
||||
s->msix_used = false;
|
||||
} else {
|
||||
s->msix_used = true;
|
||||
}
|
||||
vmxnet3_use_msix_vectors(s, VMXNET3_MAX_INTRS);
|
||||
s->msix_used = true;
|
||||
}
|
||||
return s->msix_used;
|
||||
}
|
||||
|
@ -2412,19 +2401,13 @@ static const VMStateDescription vmstate_vmxnet3_rxq_descr = {
|
|||
static int vmxnet3_post_load(void *opaque, int version_id)
|
||||
{
|
||||
VMXNET3State *s = opaque;
|
||||
PCIDevice *d = PCI_DEVICE(s);
|
||||
|
||||
net_tx_pkt_init(&s->tx_pkt, PCI_DEVICE(s),
|
||||
s->max_tx_frags, s->peer_has_vhdr);
|
||||
net_rx_pkt_init(&s->rx_pkt, s->peer_has_vhdr);
|
||||
|
||||
if (s->msix_used) {
|
||||
if (!vmxnet3_use_msix_vectors(s, VMXNET3_MAX_INTRS)) {
|
||||
VMW_WRPRN("Failed to re-use MSI-X vectors");
|
||||
msix_uninit(d, &s->msix_bar, &s->msix_bar);
|
||||
s->msix_used = false;
|
||||
return -1;
|
||||
}
|
||||
vmxnet3_use_msix_vectors(s, VMXNET3_MAX_INTRS);
|
||||
}
|
||||
|
||||
if (!vmxnet3_validate_queues(s)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue