[ovs-dev,1/5] dpif-netdev: Convert exit latch to flag.
diff mbox series

Message ID 1558621432-13363-2-git-send-email-david.marchand@redhat.com
State Changes Requested
Headers show
Series
  • Quicker pmd threads reloads
Related show

Commit Message

David Marchand May 23, 2019, 2:23 p.m. UTC
No need for a latch here since we don't have to wait.
A simple boolean flag is enough.

The memory order on the reload flag is changed to rel-acq ordering to
serve as a synchronisation point between the pmd threads and the control
thread that asks for termination.

Fixes: e4cfed38b159 ("dpif-netdev: Add poll-mode-device thread.")
Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Eelco Chaudron <echaudro@redhat.com>
---
 lib/dpif-netdev.c | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

---
Changelog since RFC v2:
- removed now unused latch.h inclusion

Changelog since RFC v1:
- added memory ordering on 'reload' atomic to serve as a synchronisation
  point between control thread and pmd threads

Comments

Stokes, Ian June 19, 2019, 1:38 p.m. UTC | #1
On 5/23/2019 3:23 PM, David Marchand wrote:
> No need for a latch here since we don't have to wait.
> A simple boolean flag is enough.
> 
> The memory order on the reload flag is changed to rel-acq ordering to
> serve as a synchronisation point between the pmd threads and the control
> thread that asks for termination.
> 
> Fixes: e4cfed38b159 ("dpif-netdev: Add poll-mode-device thread.")
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Acked-by: Eelco Chaudron <echaudro@redhat.com>

Hi David, this change looks ok to me, tested a number scenarios and did 
not see any breakage. I'm happy to Ack, but will hold off applying until 
Ilya has a chance to look also as he's quite familiar with this area of 
the code base.

Ian

> ---
>   lib/dpif-netdev.c | 14 ++++++--------
>   1 file changed, 6 insertions(+), 8 deletions(-)
> 
> ---
> Changelog since RFC v2:
> - removed now unused latch.h inclusion
> 
> Changelog since RFC v1:
> - added memory ordering on 'reload' atomic to serve as a synchronisation
>    point between control thread and pmd threads
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 5a6f2ab..19d7f7d 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -48,7 +48,6 @@
>   #include "hmapx.h"
>   #include "id-pool.h"
>   #include "ipf.h"
> -#include "latch.h"
>   #include "netdev.h"
>   #include "netdev-provider.h"
>   #include "netdev-vport.h"
> @@ -681,10 +680,10 @@ struct dp_netdev_pmd_thread {
>       /* Current context of the PMD thread. */
>       struct dp_netdev_pmd_thread_ctx ctx;
>   
> -    struct latch exit_latch;        /* For terminating the pmd thread. */
>       struct seq *reload_seq;
>       uint64_t last_reload_seq;
>       atomic_bool reload;             /* Do we need to reload ports? */
> +    atomic_bool exit;               /* For terminating the pmd thread. */
>       pthread_t thread;
>       unsigned core_id;               /* CPU core id of this pmd thread. */
>       int numa_id;                    /* numa node id of this pmd thread. */
> @@ -1756,7 +1755,7 @@ dp_netdev_reload_pmd__(struct dp_netdev_pmd_thread *pmd)
>   
>       ovs_mutex_lock(&pmd->cond_mutex);
>       seq_change(pmd->reload_seq);
> -    atomic_store_relaxed(&pmd->reload, true);
> +    atomic_store_explicit(&pmd->reload, true, memory_order_release);
>       ovs_mutex_cond_wait(&pmd->cond, &pmd->cond_mutex);
>       ovs_mutex_unlock(&pmd->cond_mutex);
>   }
> @@ -5468,7 +5467,7 @@ reload:
>                   emc_cache_slow_sweep(&((pmd->flow_cache).emc_cache));
>               }
>   
> -            atomic_read_relaxed(&pmd->reload, &reload);
> +            atomic_read_explicit(&pmd->reload, &reload, memory_order_acquire);
>               if (reload) {
>                   break;
>               }
> @@ -5479,7 +5478,7 @@ reload:
>       ovs_mutex_unlock(&pmd->perf_stats.stats_mutex);
>   
>       poll_cnt = pmd_load_queues_and_ports(pmd, &poll_list);
> -    exiting = latch_is_set(&pmd->exit_latch);
> +    atomic_read_relaxed(&pmd->exit, &exiting);
>       /* Signal here to make sure the pmd finishes
>        * reloading the updated configuration. */
>       dp_netdev_pmd_reload_done(pmd);
> @@ -5898,7 +5897,7 @@ dp_netdev_configure_pmd(struct dp_netdev_pmd_thread *pmd, struct dp_netdev *dp,
>       pmd->n_output_batches = 0;
>   
>       ovs_refcount_init(&pmd->ref_cnt);
> -    latch_init(&pmd->exit_latch);
> +    atomic_init(&pmd->exit, false);
>       pmd->reload_seq = seq_create();
>       pmd->last_reload_seq = seq_read(pmd->reload_seq);
>       atomic_init(&pmd->reload, false);
> @@ -5945,7 +5944,6 @@ dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd)
>       cmap_destroy(&pmd->classifiers);
>       cmap_destroy(&pmd->flow_table);
>       ovs_mutex_destroy(&pmd->flow_mutex);
> -    latch_destroy(&pmd->exit_latch);
>       seq_destroy(pmd->reload_seq);
>       xpthread_cond_destroy(&pmd->cond);
>       ovs_mutex_destroy(&pmd->cond_mutex);
> @@ -5967,7 +5965,7 @@ dp_netdev_del_pmd(struct dp_netdev *dp, struct dp_netdev_pmd_thread *pmd)
>           pmd_free_static_tx_qid(pmd);
>           ovs_mutex_unlock(&dp->non_pmd_mutex);
>       } else {
> -        latch_set(&pmd->exit_latch);
> +        atomic_store_relaxed(&pmd->exit, true);
>           dp_netdev_reload_pmd__(pmd);
>           xpthread_join(pmd->thread, NULL);
>       }
>
Ilya Maximets June 25, 2019, 1:22 p.m. UTC | #2
On 23.05.2019 17:23, David Marchand wrote:
> No need for a latch here since we don't have to wait.
> A simple boolean flag is enough.
> 
> The memory order on the reload flag is changed to rel-acq ordering to
> serve as a synchronisation point between the pmd threads and the control
> thread that asks for termination.
> 
> Fixes: e4cfed38b159 ("dpif-netdev: Add poll-mode-device thread.")
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> Acked-by: Eelco Chaudron <echaudro@redhat.com>
> ---
>  lib/dpif-netdev.c | 14 ++++++--------
>  1 file changed, 6 insertions(+), 8 deletions(-)
> 
> ---
> Changelog since RFC v2:
> - removed now unused latch.h inclusion
> 
> Changelog since RFC v1:
> - added memory ordering on 'reload' atomic to serve as a synchronisation
>   point between control thread and pmd threads
> 


Acked-by: Ilya Maximets <i.maximets@samsung.com>


> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 5a6f2ab..19d7f7d 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -48,7 +48,6 @@
>  #include "hmapx.h"
>  #include "id-pool.h"
>  #include "ipf.h"
> -#include "latch.h"
>  #include "netdev.h"
>  #include "netdev-provider.h"
>  #include "netdev-vport.h"
> @@ -681,10 +680,10 @@ struct dp_netdev_pmd_thread {
>      /* Current context of the PMD thread. */
>      struct dp_netdev_pmd_thread_ctx ctx;
>  
> -    struct latch exit_latch;        /* For terminating the pmd thread. */
>      struct seq *reload_seq;
>      uint64_t last_reload_seq;
>      atomic_bool reload;             /* Do we need to reload ports? */
> +    atomic_bool exit;               /* For terminating the pmd thread. */
>      pthread_t thread;
>      unsigned core_id;               /* CPU core id of this pmd thread. */
>      int numa_id;                    /* numa node id of this pmd thread. */
> @@ -1756,7 +1755,7 @@ dp_netdev_reload_pmd__(struct dp_netdev_pmd_thread *pmd)
>  
>      ovs_mutex_lock(&pmd->cond_mutex);
>      seq_change(pmd->reload_seq);
> -    atomic_store_relaxed(&pmd->reload, true);
> +    atomic_store_explicit(&pmd->reload, true, memory_order_release);
>      ovs_mutex_cond_wait(&pmd->cond, &pmd->cond_mutex);
>      ovs_mutex_unlock(&pmd->cond_mutex);
>  }
> @@ -5468,7 +5467,7 @@ reload:
>                  emc_cache_slow_sweep(&((pmd->flow_cache).emc_cache));
>              }
>  
> -            atomic_read_relaxed(&pmd->reload, &reload);
> +            atomic_read_explicit(&pmd->reload, &reload, memory_order_acquire);
>              if (reload) {
>                  break;
>              }
> @@ -5479,7 +5478,7 @@ reload:
>      ovs_mutex_unlock(&pmd->perf_stats.stats_mutex);
>  
>      poll_cnt = pmd_load_queues_and_ports(pmd, &poll_list);
> -    exiting = latch_is_set(&pmd->exit_latch);
> +    atomic_read_relaxed(&pmd->exit, &exiting);
>      /* Signal here to make sure the pmd finishes
>       * reloading the updated configuration. */
>      dp_netdev_pmd_reload_done(pmd);
> @@ -5898,7 +5897,7 @@ dp_netdev_configure_pmd(struct dp_netdev_pmd_thread *pmd, struct dp_netdev *dp,
>      pmd->n_output_batches = 0;
>  
>      ovs_refcount_init(&pmd->ref_cnt);
> -    latch_init(&pmd->exit_latch);
> +    atomic_init(&pmd->exit, false);
>      pmd->reload_seq = seq_create();
>      pmd->last_reload_seq = seq_read(pmd->reload_seq);
>      atomic_init(&pmd->reload, false);
> @@ -5945,7 +5944,6 @@ dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd)
>      cmap_destroy(&pmd->classifiers);
>      cmap_destroy(&pmd->flow_table);
>      ovs_mutex_destroy(&pmd->flow_mutex);
> -    latch_destroy(&pmd->exit_latch);
>      seq_destroy(pmd->reload_seq);
>      xpthread_cond_destroy(&pmd->cond);
>      ovs_mutex_destroy(&pmd->cond_mutex);
> @@ -5967,7 +5965,7 @@ dp_netdev_del_pmd(struct dp_netdev *dp, struct dp_netdev_pmd_thread *pmd)
>          pmd_free_static_tx_qid(pmd);
>          ovs_mutex_unlock(&dp->non_pmd_mutex);
>      } else {
> -        latch_set(&pmd->exit_latch);
> +        atomic_store_relaxed(&pmd->exit, true);
>          dp_netdev_reload_pmd__(pmd);
>          xpthread_join(pmd->thread, NULL);
>      }
>

Patch
diff mbox series

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 5a6f2ab..19d7f7d 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -48,7 +48,6 @@ 
 #include "hmapx.h"
 #include "id-pool.h"
 #include "ipf.h"
-#include "latch.h"
 #include "netdev.h"
 #include "netdev-provider.h"
 #include "netdev-vport.h"
@@ -681,10 +680,10 @@  struct dp_netdev_pmd_thread {
     /* Current context of the PMD thread. */
     struct dp_netdev_pmd_thread_ctx ctx;
 
-    struct latch exit_latch;        /* For terminating the pmd thread. */
     struct seq *reload_seq;
     uint64_t last_reload_seq;
     atomic_bool reload;             /* Do we need to reload ports? */
+    atomic_bool exit;               /* For terminating the pmd thread. */
     pthread_t thread;
     unsigned core_id;               /* CPU core id of this pmd thread. */
     int numa_id;                    /* numa node id of this pmd thread. */
@@ -1756,7 +1755,7 @@  dp_netdev_reload_pmd__(struct dp_netdev_pmd_thread *pmd)
 
     ovs_mutex_lock(&pmd->cond_mutex);
     seq_change(pmd->reload_seq);
-    atomic_store_relaxed(&pmd->reload, true);
+    atomic_store_explicit(&pmd->reload, true, memory_order_release);
     ovs_mutex_cond_wait(&pmd->cond, &pmd->cond_mutex);
     ovs_mutex_unlock(&pmd->cond_mutex);
 }
@@ -5468,7 +5467,7 @@  reload:
                 emc_cache_slow_sweep(&((pmd->flow_cache).emc_cache));
             }
 
-            atomic_read_relaxed(&pmd->reload, &reload);
+            atomic_read_explicit(&pmd->reload, &reload, memory_order_acquire);
             if (reload) {
                 break;
             }
@@ -5479,7 +5478,7 @@  reload:
     ovs_mutex_unlock(&pmd->perf_stats.stats_mutex);
 
     poll_cnt = pmd_load_queues_and_ports(pmd, &poll_list);
-    exiting = latch_is_set(&pmd->exit_latch);
+    atomic_read_relaxed(&pmd->exit, &exiting);
     /* Signal here to make sure the pmd finishes
      * reloading the updated configuration. */
     dp_netdev_pmd_reload_done(pmd);
@@ -5898,7 +5897,7 @@  dp_netdev_configure_pmd(struct dp_netdev_pmd_thread *pmd, struct dp_netdev *dp,
     pmd->n_output_batches = 0;
 
     ovs_refcount_init(&pmd->ref_cnt);
-    latch_init(&pmd->exit_latch);
+    atomic_init(&pmd->exit, false);
     pmd->reload_seq = seq_create();
     pmd->last_reload_seq = seq_read(pmd->reload_seq);
     atomic_init(&pmd->reload, false);
@@ -5945,7 +5944,6 @@  dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd)
     cmap_destroy(&pmd->classifiers);
     cmap_destroy(&pmd->flow_table);
     ovs_mutex_destroy(&pmd->flow_mutex);
-    latch_destroy(&pmd->exit_latch);
     seq_destroy(pmd->reload_seq);
     xpthread_cond_destroy(&pmd->cond);
     ovs_mutex_destroy(&pmd->cond_mutex);
@@ -5967,7 +5965,7 @@  dp_netdev_del_pmd(struct dp_netdev *dp, struct dp_netdev_pmd_thread *pmd)
         pmd_free_static_tx_qid(pmd);
         ovs_mutex_unlock(&dp->non_pmd_mutex);
     } else {
-        latch_set(&pmd->exit_latch);
+        atomic_store_relaxed(&pmd->exit, true);
         dp_netdev_reload_pmd__(pmd);
         xpthread_join(pmd->thread, NULL);
     }