On Wed, Dec 9, 2020 at 2:51 AM <jma...@redhat.com> wrote:
>
> From: Jon Maloy <jma...@redhat.com>
>
> We instantiante struct publication in tipc_nametbl_insert_publ()
> instead of as currently in tipc_service_insert_publ(). This has the
> advantage that we can pass a pointer to the publication struct to
> the next call levels, instead of the numerous individual parameters
> we pass on now. It also gives us a location to keep the contents of
> the additional fields we will introduce in a later commit.
>
> Signed-off-by: Jon Maloy <jma...@redhat.com>
> ---
>  net/tipc/name_table.c | 63 ++++++++++++++++++++++---------------------
>  1 file changed, 32 insertions(+), 31 deletions(-)
>
> diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c
> index c37a4a9c87ca..68e269b49780 100644
> --- a/net/tipc/name_table.c
> +++ b/net/tipc/name_table.c
> @@ -327,49 +327,44 @@ static struct service_range 
> *tipc_service_create_range(struct tipc_service *sc,
>         return sr;
>  }
>
> -static struct publication *tipc_service_insert_publ(struct net *net,
> -                                                   struct tipc_service *sc,
> -                                                   u32 type, u32 lower,
> -                                                   u32 upper, u32 scope,
> -                                                   u32 node, u32 port,
> -                                                   u32 key)
> +static bool tipc_service_insert_publ(struct net *net,
> +                                    struct tipc_service *sc,
> +                                    struct publication *p)
>  {
>         struct tipc_subscription *sub, *tmp;
>         struct service_range *sr;
> -       struct publication *p;
> +       struct publication *_p;
> +       u32 node = p->sk.node;
>         bool first = false;
>
> -       sr = tipc_service_create_range(sc, lower, upper);
> +       sr = tipc_service_create_range(sc, p->sr.lower, p->sr.upper);
>         if (!sr)
>                 goto  err;
>
>         first = list_empty(&sr->all_publ);
>
>         /* Return if the publication already exists */
> -       list_for_each_entry(p, &sr->all_publ, all_publ) {
> -               if (p->key == key && (!p->sk.node || p->sk.node == node))
> -                       return NULL;
> +       list_for_each_entry(_p, &sr->all_publ, all_publ) {
> +               if (_p->key == p->key && (!_p->sk.node || _p->sk.node == 
> node))
> +                       return false;
>         }
>
> -       /* Create and insert publication */
> -       p = tipc_publ_create(type, lower, upper, scope, node, port, key);
> -       if (!p)
> -               goto err;
> -       /* Suppose there shouldn't be a huge gap btw publs i.e. >INT_MAX */
> -       p->id = sc->publ_cnt++;
> -       if (in_own_node(net, node))
> +       if (in_own_node(net, p->sk.node))
>                 list_add(&p->local_publ, &sr->local_publ);
>         list_add(&p->all_publ, &sr->all_publ);
> +       p->id = sc->publ_cnt++;
>
>         /* Any subscriptions waiting for notification?  */
>         list_for_each_entry_safe(sub, tmp, &sc->subscriptions, service_list) {
> -               tipc_sub_report_overlap(sub, p->sr.lower, p->sr.upper, 
> TIPC_PUBLISHED,
> -                                       p->sk.ref, p->sk.node, p->scope, 
> first);
> +               tipc_sub_report_overlap(sub, p->sr.lower, p->sr.upper,
> +                                       TIPC_PUBLISHED, p->sk.ref, p->sk.node,
> +                                       p->scope, first);
>         }
> -       return p;
> +       return true;
>  err:
> -       pr_warn("Failed to bind to %u,%u,%u, no memory\n", type, lower, 
> upper);
> -       return NULL;
> +       pr_warn("Failed to bind to %u,%u,%u, no memory\n",
> +               p->sr.type, p->sr.lower, p->sr.upper);
> +       return false;
>  }
>
>  /**
> @@ -481,6 +476,11 @@ struct publication *tipc_nametbl_insert_publ(struct net 
> *net, u32 type,
>         struct name_table *nt = tipc_name_table(net);
>         struct tipc_service *sc;
>         struct publication *p;
> +       bool res = false;
> +
> +       p = tipc_publ_create(type, lower, upper, scope, node, port, key);
> +       if (!p)
> +               return NULL;
>
>         if (scope > TIPC_NODE_SCOPE || lower > upper) {
>                 pr_debug("Failed to bind illegal {%u,%u,%u} with scope %u\n",
> @@ -490,14 +490,15 @@ struct publication *tipc_nametbl_insert_publ(struct net 
> *net, u32 type,
>         sc = tipc_service_find(net, type);
>         if (!sc)
>                 sc = tipc_service_create(type, &nt->services[hash(type)]);
> -       if (!sc)
> -               return NULL;
> -
> -       spin_lock_bh(&sc->lock);
> -       p = tipc_service_insert_publ(net, sc, type, lower, upper,
> -                                    scope, node, port, key);
> -       spin_unlock_bh(&sc->lock);
> -       return p;
> +       if (sc) {
> +               spin_lock_bh(&sc->lock);
> +               res = tipc_service_insert_publ(net, sc, p);
> +               spin_unlock_bh(&sc->lock);
If move spin_(un)lock_bh into tipc_service_insert_publ(), we can do:

        if (sc && tipc_service_insert_publ(net, sc, p))
                return p;

> +       }
> +       if (res)
> +               return p;
and remove 'bool res = false;' and this 'if'.

> +       kfree(p);
> +       return NULL;
>  }
>
>  struct publication *tipc_nametbl_remove_publ(struct net *net, u32 type,
> --
> 2.28.0
>
>
>
> _______________________________________________
> tipc-discussion mailing list
> tipc-discussion@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/tipc-discussion


_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to