This change mitigates software faults issued by some versions of the
linux kernel vfio-pci driver when VF PCI BARs are used without setting
the memory enable bit in the PCI configuration. This problem is
mentionned in https://lkml.org/lkml/2020/6/25/628
Change-Id: Idc177be4a5adb6ee467b4dd8f055f133ff267fe1
Type: improvement
Signed-off-by: Mohammed Hawari <mohammed@hawari.fr>
clib_error_t *error;
int flags = MAP_SHARED;
u64 size = 0, offset = 0;
clib_error_t *error;
int flags = MAP_SHARED;
u64 size = 0, offset = 0;
pci_log_debug (vm, p, "map region %u to va %p", bar, addr);
pci_log_debug (vm, p, "map region %u to va %p", bar, addr);
+ if ((error = vlib_pci_read_config_u16 (vm, h, 4, &command)))
+ return error;
+
+ if (!(command & PCI_COMMAND_MEMORY))
+ {
+ pci_log_debug (vm, p, "setting memory enable bit");
+ command |= PCI_COMMAND_MEMORY;
+ if ((error = vlib_pci_write_config_u16 (vm, h, 4, &command)))
+ return error;
+ }
+
if ((error = vlib_pci_region (vm, h, bar, &fd, &size, &offset)))
return error;
if ((error = vlib_pci_region (vm, h, bar, &fd, &size, &offset)))
return error;