[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH master/v1.0.x] ivshmem: add missing msix calls
From: |
Andreas Färber |
Subject: |
Re: [Qemu-devel] [PATCH master/v1.0.x] ivshmem: add missing msix calls |
Date: |
Sun, 15 Jan 2012 19:15:55 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20111220 Thunderbird/9.0 |
Am 13.01.2012 23:43, schrieb Cam Macdonell:
> Can this patch be merged, please?
You need to cc qemu-stable if you want it backported to v1.0.x once applied.
Andreas
> On Mon, Dec 5, 2011 at 12:48 PM, Michael S. Tsirkin <address@hidden> wrote:
>> ivshmem used msix but didn't call it on either reset or
>> config write paths. This used to partically work since
>> guests don't use all of msi-x configuration fields,
>> and reset is rarely used, but the patch 'msix: track function masked
>> in pci device state' broke that. Fix by adding appropriate calls.
>>
>> Signed-off-by: Michael S. Tsirkin <address@hidden>
>> Reported-by: Cam Macdonell <address@hidden>
>> Tested-by: Cam Macdonell <address@hidden>
>>
>> ---
>>
>> Please apply the following to both master
>> and 1.0 stable branch. Thanks!
>>
>> diff --git a/hw/ivshmem.c b/hw/ivshmem.c
>> index 242fbea..c58f4d3 100644
>> --- a/hw/ivshmem.c
>> +++ b/hw/ivshmem.c
>> @@ -500,11 +500,29 @@ static void ivshmem_read(void *opaque, const uint8_t *
>> buf, int flags)
>> return;
>> }
>>
>> +/* Select the MSI-X vectors used by device.
>> + * ivshmem maps events to vectors statically, so
>> + * we just enable all vectors on init and after reset. */
>> +static void ivshmem_use_msix(IVShmemState * s)
>> +{
>> + int i;
>> +
>> + if (!msix_present(&s->dev)) {
>> + return;
>> + }
>> +
>> + for (i = 0; i < s->vectors; i++) {
>> + msix_vector_use(&s->dev, i);
>> + }
>> +}
>> +
>> static void ivshmem_reset(DeviceState *d)
>> {
>> IVShmemState *s = DO_UPCAST(IVShmemState, dev.qdev, d);
>>
>> s->intrstatus = 0;
>> + msix_reset(&s->dev);
>> + ivshmem_use_msix(s);
>> return;
>> }
>>
>> @@ -535,12 +553,8 @@ static uint64_t ivshmem_get_size(IVShmemState * s) {
>> return value;
>> }
>>
>> -static void ivshmem_setup_msi(IVShmemState * s) {
>> -
>> - int i;
>> -
>> - /* allocate the MSI-X vectors */
>> -
>> +static void ivshmem_setup_msi(IVShmemState * s)
>> +{
>> memory_region_init(&s->msix_bar, "ivshmem-msix", 4096);
>> if (!msix_init(&s->dev, s->vectors, &s->msix_bar, 1, 0)) {
>> pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY,
>> @@ -551,13 +565,10 @@ static void ivshmem_setup_msi(IVShmemState * s) {
>> exit(1);
>> }
>>
>> - /* 'activate' the vectors */
>> - for (i = 0; i < s->vectors; i++) {
>> - msix_vector_use(&s->dev, i);
>> - }
>> -
>> /* allocate Qemu char devices for receiving interrupts */
>> s->eventfd_table = g_malloc0(s->vectors * sizeof(EventfdEntry));
>> +
>> + ivshmem_use_msix(s);
>> }
>>
>> static void ivshmem_save(QEMUFile* f, void *opaque)
>> @@ -610,6 +621,13 @@ static int ivshmem_load(QEMUFile* f, void *opaque, int
>> version_id)
>> return 0;
>> }
>>
>> +static void ivshmem_write_config(PCIDevice *pci_dev, uint32_t address,
>> + uint32_t val, int len)
>> +{
>> + pci_default_write_config(pci_dev, address, val, len);
>> + msix_write_config(pci_dev, address, val, len);
>> +}
>> +
>> static int pci_ivshmem_init(PCIDevice *dev)
>> {
>> IVShmemState *s = DO_UPCAST(IVShmemState, dev, dev);
>> @@ -734,6 +752,8 @@ static int pci_ivshmem_init(PCIDevice *dev)
>>
>> }
>>
>> + s->dev.config_write = ivshmem_write_config;
>> +
>> return 0;
>> }
>>
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg