[ovs-dev] [PATCH] dpif: allow adding ukeys for same flow by different pmds

Ilya Maximets i.maximets at samsung.com
Thu Aug 6 07:54:42 UTC 2015


ping.

On 30.07.2015 18:29, Ilya Maximets wrote:
> In multiqueue mode several pmd threads may process one
> port, but different queues. Flow doesn't depend on queue.
> 
> So, while miss upcall processing, all threads (except first
> for that port) will receive error = ENOSPC due to
> ukey_install failure. Therefore they will not add the flow
> to flow_table and will not insert it to exact match cache.
> 
> As a result all threads (except first for that port) will
> always execute a miss.
> 
> Fix that by comparing ukeys not only by ufids but also
> by pmd_ids.
> 
> Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
> ---
>  ofproto/ofproto-dpif-upcall.c | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
> index 440f9e9..38e03c5 100644
> --- a/ofproto/ofproto-dpif-upcall.c
> +++ b/ofproto/ofproto-dpif-upcall.c
> @@ -286,7 +286,8 @@ static bool ukey_install_start(struct udpif *, struct udpif_key *ukey);
>  static bool ukey_install_finish(struct udpif_key *ukey, int error);
>  static bool ukey_install(struct udpif *udpif, struct udpif_key *ukey);
>  static struct udpif_key *ukey_lookup(struct udpif *udpif,
> -                                     const ovs_u128 *ufid);
> +                                     const ovs_u128 *ufid,
> +                                     const unsigned pmd_id);
>  static int ukey_acquire(struct udpif *, const struct dpif_flow *,
>                          struct udpif_key **result, int *error);
>  static void ukey_delete__(struct udpif_key *);
> @@ -1141,7 +1142,8 @@ process_upcall(struct udpif *udpif, struct upcall *upcall,
>              }
>              if (actions_len == 0) {
>                  /* Lookup actions in userspace cache. */
> -                struct udpif_key *ukey = ukey_lookup(udpif, upcall->ufid);
> +                struct udpif_key *ukey = ukey_lookup(udpif, upcall->ufid,
> +                                                     upcall->pmd_id);
>                  if (ukey) {
>                      actions = ukey->actions->data;
>                      actions_len = ukey->actions->size;
> @@ -1324,14 +1326,14 @@ get_ufid_hash(const ovs_u128 *ufid)
>  }
>  
>  static struct udpif_key *
> -ukey_lookup(struct udpif *udpif, const ovs_u128 *ufid)
> +ukey_lookup(struct udpif *udpif, const ovs_u128 *ufid, const unsigned pmd_id)
>  {
>      struct udpif_key *ukey;
>      int idx = get_ufid_hash(ufid) % N_UMAPS;
>      struct cmap *cmap = &udpif->ukeys[idx].cmap;
>  
>      CMAP_FOR_EACH_WITH_HASH (ukey, cmap_node, get_ufid_hash(ufid), cmap) {
> -        if (ovs_u128_equals(&ukey->ufid, ufid)) {
> +        if (ovs_u128_equals(&ukey->ufid, ufid) && ukey->pmd_id == pmd_id) {
>              return ukey;
>          }
>      }
> @@ -1488,7 +1490,7 @@ ukey_install_start(struct udpif *udpif, struct udpif_key *new_ukey)
>      idx = new_ukey->hash % N_UMAPS;
>      umap = &udpif->ukeys[idx];
>      ovs_mutex_lock(&umap->mutex);
> -    old_ukey = ukey_lookup(udpif, &new_ukey->ufid);
> +    old_ukey = ukey_lookup(udpif, &new_ukey->ufid, new_ukey->pmd_id);
>      if (old_ukey) {
>          /* Uncommon case: A ukey is already installed with the same UFID. */
>          if (old_ukey->key_len == new_ukey->key_len
> @@ -1570,7 +1572,7 @@ ukey_acquire(struct udpif *udpif, const struct dpif_flow *flow,
>      struct udpif_key *ukey;
>      int retval;
>  
> -    ukey = ukey_lookup(udpif, &flow->ufid);
> +    ukey = ukey_lookup(udpif, &flow->ufid, flow->pmd_id);
>      if (ukey) {
>          retval = ovs_mutex_trylock(&ukey->mutex);
>      } else {
> 



More information about the dev mailing list