diff mbox

[qemu,v13,13/16] spapr_iommu: Remove need_vfio flag from sPAPRTCETable

Message ID 1456823441-46757-14-git-send-email-aik@ozlabs.ru
State New
Headers show

Commit Message

Alexey Kardashevskiy March 1, 2016, 9:10 a.m. UTC
sPAPRTCETable has a need_vfio flag which is passed to
kvmppc_create_spapr_tce() and controls whether to create a guest view
table in KVM as this depends on the host kernel ability to accelerate
H_PUT_TCE for VFIO devices. We would set this flag at the moment
when sPAPRTCETable is created in spapr_tce_new_table() and
use when the table is allocated in spapr_tce_table_realize().

Now we explicitly enable/disable DMA windows via spapr_tce_table_enable()
and spapr_tce_table_disable() and can pass this flag directly without
caching it in sPAPRTCETable.

This removes the flag. This should cause no behavioural change.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 hw/ppc/spapr_iommu.c   | 13 +++++--------
 include/hw/ppc/spapr.h |  1 -
 2 files changed, 5 insertions(+), 9 deletions(-)

Comments

David Gibson March 3, 2016, 6:38 a.m. UTC | #1
On Tue, Mar 01, 2016 at 08:10:38PM +1100, Alexey Kardashevskiy wrote:
> sPAPRTCETable has a need_vfio flag which is passed to
> kvmppc_create_spapr_tce() and controls whether to create a guest view
> table in KVM as this depends on the host kernel ability to accelerate
> H_PUT_TCE for VFIO devices. We would set this flag at the moment
> when sPAPRTCETable is created in spapr_tce_new_table() and
> use when the table is allocated in spapr_tce_table_realize().
> 
> Now we explicitly enable/disable DMA windows via spapr_tce_table_enable()
> and spapr_tce_table_disable() and can pass this flag directly without
> caching it in sPAPRTCETable.
> 
> This removes the flag. This should cause no behavioural change.
> 
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

> ---
>  hw/ppc/spapr_iommu.c   | 13 +++++--------
>  include/hw/ppc/spapr.h |  1 -
>  2 files changed, 5 insertions(+), 9 deletions(-)
> 
> diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
> index 4c52cf4..8aa2238 100644
> --- a/hw/ppc/spapr_iommu.c
> +++ b/hw/ppc/spapr_iommu.c
> @@ -210,8 +210,9 @@ void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio)
>  {
>      size_t table_size = tcet->nb_table * sizeof(uint64_t);
>      void *newtable;
> +    bool tcet_can_vfio = tcet->fd < 0;
>  
> -    if (need_vfio == tcet->need_vfio) {
> +    if (need_vfio == tcet_can_vfio) {
>          /* Nothing to do */
>          return;
>      }
> @@ -222,8 +223,6 @@ void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio)
>          return;
>      }
>  
> -    tcet->need_vfio = true;
> -
>      if (tcet->fd < 0) {
>          /* Table is already in userspace, nothing to be do */
>          return;
> @@ -261,7 +260,7 @@ sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn)
>      return tcet;
>  }
>  
> -static void spapr_tce_table_do_enable(sPAPRTCETable *tcet)
> +static void spapr_tce_table_do_enable(sPAPRTCETable *tcet, bool need_vfio)
>  {
>      if (!tcet->nb_table) {
>          return;
> @@ -271,7 +270,7 @@ static void spapr_tce_table_do_enable(sPAPRTCETable *tcet)
>                                          tcet->page_shift,
>                                          tcet->nb_table,
>                                          &tcet->fd,
> -                                        tcet->need_vfio);
> +                                        need_vfio);
>  
>      memory_region_set_size(&tcet->iommu,
>                             (uint64_t)tcet->nb_table << tcet->page_shift);
> @@ -291,9 +290,8 @@ void spapr_tce_table_enable(sPAPRTCETable *tcet,
>      tcet->bus_offset = bus_offset;
>      tcet->page_shift = page_shift;
>      tcet->nb_table = nb_table;
> -    tcet->need_vfio = need_vfio;
>  
> -    spapr_tce_table_do_enable(tcet);
> +    spapr_tce_table_do_enable(tcet, need_vfio);
>  }
>  
>  void spapr_tce_table_disable(sPAPRTCETable *tcet)
> @@ -312,7 +310,6 @@ void spapr_tce_table_disable(sPAPRTCETable *tcet)
>      tcet->bus_offset = 0;
>      tcet->page_shift = 0;
>      tcet->nb_table = 0;
> -    tcet->need_vfio = false;
>  }
>  
>  static void spapr_tce_table_unrealize(DeviceState *dev, Error **errp)
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index 5d2f8f4..505cb3a 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -546,7 +546,6 @@ struct sPAPRTCETable {
>      uint32_t page_shift;
>      uint64_t *table;
>      bool bypass;
> -    bool need_vfio;
>      int fd;
>      MemoryRegion root, iommu;
>      struct VIOsPAPRDevice *vdev; /* for @bypass migration compatibility only */
diff mbox

Patch

diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index 4c52cf4..8aa2238 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -210,8 +210,9 @@  void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio)
 {
     size_t table_size = tcet->nb_table * sizeof(uint64_t);
     void *newtable;
+    bool tcet_can_vfio = tcet->fd < 0;
 
-    if (need_vfio == tcet->need_vfio) {
+    if (need_vfio == tcet_can_vfio) {
         /* Nothing to do */
         return;
     }
@@ -222,8 +223,6 @@  void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio)
         return;
     }
 
-    tcet->need_vfio = true;
-
     if (tcet->fd < 0) {
         /* Table is already in userspace, nothing to be do */
         return;
@@ -261,7 +260,7 @@  sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn)
     return tcet;
 }
 
-static void spapr_tce_table_do_enable(sPAPRTCETable *tcet)
+static void spapr_tce_table_do_enable(sPAPRTCETable *tcet, bool need_vfio)
 {
     if (!tcet->nb_table) {
         return;
@@ -271,7 +270,7 @@  static void spapr_tce_table_do_enable(sPAPRTCETable *tcet)
                                         tcet->page_shift,
                                         tcet->nb_table,
                                         &tcet->fd,
-                                        tcet->need_vfio);
+                                        need_vfio);
 
     memory_region_set_size(&tcet->iommu,
                            (uint64_t)tcet->nb_table << tcet->page_shift);
@@ -291,9 +290,8 @@  void spapr_tce_table_enable(sPAPRTCETable *tcet,
     tcet->bus_offset = bus_offset;
     tcet->page_shift = page_shift;
     tcet->nb_table = nb_table;
-    tcet->need_vfio = need_vfio;
 
-    spapr_tce_table_do_enable(tcet);
+    spapr_tce_table_do_enable(tcet, need_vfio);
 }
 
 void spapr_tce_table_disable(sPAPRTCETable *tcet)
@@ -312,7 +310,6 @@  void spapr_tce_table_disable(sPAPRTCETable *tcet)
     tcet->bus_offset = 0;
     tcet->page_shift = 0;
     tcet->nb_table = 0;
-    tcet->need_vfio = false;
 }
 
 static void spapr_tce_table_unrealize(DeviceState *dev, Error **errp)
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 5d2f8f4..505cb3a 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -546,7 +546,6 @@  struct sPAPRTCETable {
     uint32_t page_shift;
     uint64_t *table;
     bool bypass;
-    bool need_vfio;
     int fd;
     MemoryRegion root, iommu;
     struct VIOsPAPRDevice *vdev; /* for @bypass migration compatibility only */