Patchwork vfio: Fix BAR->VFIODevice translation in vfio_bar_read/write

login
register
mail settings
Submitter Jan Kiszka
Date Oct. 8, 2012, 10:45 a.m.
Message ID <5072AEB8.8020706@siemens.com>
Download mbox | patch
Permalink /patch/189981/
State New
Headers show

Comments

Jan Kiszka - Oct. 8, 2012, 10:45 a.m.
DO_UPCAST is supposed to translate from the first member of a struct to
that struct, not from arbitrary ones. And it (usually) breaks the build
when neglecting this rule. Use container_of to fix the build breakage
and likely also the runtime behavior.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 hw/vfio_pci.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
Alex Williamson - Oct. 8, 2012, 2:27 p.m.
On Mon, 2012-10-08 at 12:45 +0200, Jan Kiszka wrote:
> DO_UPCAST is supposed to translate from the first member of a struct to
> that struct, not from arbitrary ones. And it (usually) breaks the build
> when neglecting this rule. Use container_of to fix the build breakage
> and likely also the runtime behavior.

It should have warned, but afaict the runtime behavior should have been
the same.  It would have been miraculous if INTx ever got an EOI
otherwise.  I'll apply this to my tree.  Thanks,

Alex


> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
>  hw/vfio_pci.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c
> index a1eeced..d36d50e 100644
> --- a/hw/vfio_pci.c
> +++ b/hw/vfio_pci.c
> @@ -601,7 +601,7 @@ static void vfio_bar_write(void *opaque, target_phys_addr_t addr,
>       * which access will service the interrupt, so we're potentially
>       * getting quite a few host interrupts per guest interrupt.
>       */
> -    vfio_eoi(DO_UPCAST(VFIODevice, bars[bar->nr], bar));
> +    vfio_eoi(container_of(bar, VFIODevice, bars[bar->nr]));
>  }
>  
>  static uint64_t vfio_bar_read(void *opaque,
> @@ -641,7 +641,7 @@ static uint64_t vfio_bar_read(void *opaque,
>              __func__, bar->nr, addr, size, data);
>  
>      /* Same as write above */
> -    vfio_eoi(DO_UPCAST(VFIODevice, bars[bar->nr], bar));
> +    vfio_eoi(container_of(bar, VFIODevice, bars[bar->nr]));
>  
>      return data;
>  }

Patch

diff --git a/hw/vfio_pci.c b/hw/vfio_pci.c
index a1eeced..d36d50e 100644
--- a/hw/vfio_pci.c
+++ b/hw/vfio_pci.c
@@ -601,7 +601,7 @@  static void vfio_bar_write(void *opaque, target_phys_addr_t addr,
      * which access will service the interrupt, so we're potentially
      * getting quite a few host interrupts per guest interrupt.
      */
-    vfio_eoi(DO_UPCAST(VFIODevice, bars[bar->nr], bar));
+    vfio_eoi(container_of(bar, VFIODevice, bars[bar->nr]));
 }
 
 static uint64_t vfio_bar_read(void *opaque,
@@ -641,7 +641,7 @@  static uint64_t vfio_bar_read(void *opaque,
             __func__, bar->nr, addr, size, data);
 
     /* Same as write above */
-    vfio_eoi(DO_UPCAST(VFIODevice, bars[bar->nr], bar));
+    vfio_eoi(container_of(bar, VFIODevice, bars[bar->nr]));
 
     return data;
 }