On Wed, Dec 9, 2020 at 2:51 AM <[email protected]> wrote:
>
> From: Jon Maloy <[email protected]>
>
> We reduce the signature of tipc_find_service() and
> tipc_create_service(). The reason for doing this might not
> be obvious, but we plan to let struct tipc_uaddr contain
> information that is relevant for these functions in a later
> commit.
>
> Signed-off-by: Jon Maloy <[email protected]>
> ---
> net/tipc/name_table.c | 58 ++++++++++++++++++++++++++-----------------
> net/tipc/name_table.h | 2 +-
> net/tipc/socket.c | 2 +-
> 3 files changed, 37 insertions(+), 25 deletions(-)
>
> diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c
> index 57abed74d0d9..554a006d7c0d 100644
> --- a/net/tipc/name_table.c
> +++ b/net/tipc/name_table.c
> @@ -255,20 +255,25 @@ static struct publication *tipc_publ_create(struct
> tipc_uaddr *ua,
> *
> * Allocates a single range structure and sets it to all 0's.
> */
> -static struct tipc_service *tipc_service_create(u32 type, struct hlist_head
> *hd)
> +static struct tipc_service *tipc_service_create(struct net *net,
> + struct tipc_uaddr *ua)
is that too much to pass 'ua' pointer if only 'type' is being used here?
> {
> - struct tipc_service *service = kzalloc(sizeof(*service), GFP_ATOMIC);
> + struct name_table *nt = tipc_name_table(net);
> + struct tipc_service *service;
> + struct hlist_head *hd;
>
> + service = kzalloc(sizeof(*service), GFP_ATOMIC);
> if (!service) {
> pr_warn("Service creation failed, no memory\n");
> return NULL;
> }
>
> spin_lock_init(&service->lock);
> - service->type = type;
> + service->type = ua->sr.type;
> service->ranges = RB_ROOT;
> INIT_HLIST_NODE(&service->service_list);
> INIT_LIST_HEAD(&service->subscriptions);
> + hd = &nt->services[hash(ua->sr.type)];
> hlist_add_head_rcu(&service->service_list, hd);
> return service;
> }
> @@ -453,15 +458,16 @@ static void tipc_service_subscribe(struct tipc_service
> *service,
> }
> }
>
> -static struct tipc_service *tipc_service_find(struct net *net, u32 type)
> +static struct tipc_service *tipc_service_find(struct net *net,
> + struct tipc_uaddr *ua)
> {
> struct name_table *nt = tipc_name_table(net);
> struct hlist_head *service_head;
> struct tipc_service *service;
>
> - service_head = &nt->services[hash(type)];
> + service_head = &nt->services[hash(ua->sr.type)];
> hlist_for_each_entry_rcu(service, service_head, service_list) {
> - if (service->type == type)
> + if (service->type == ua->sr.type)
> return service;
> }
> return NULL;
> @@ -472,7 +478,6 @@ struct publication *tipc_nametbl_insert_publ(struct net
> *net,
> struct tipc_socket_addr *sk,
> u32 key)
> {
> - struct name_table *nt = tipc_name_table(net);
> struct tipc_service *sc;
> struct publication *p;
> u32 type = ua->sr.type;
> @@ -487,9 +492,9 @@ struct publication *tipc_nametbl_insert_publ(struct net
> *net,
> type, ua->sr.lower, ua->sr.upper, sk->node);
> return NULL;
> }
> - sc = tipc_service_find(net, type);
> + sc = tipc_service_find(net, ua);
> if (!sc)
> - sc = tipc_service_create(type, &nt->services[hash(type)]);
> + sc = tipc_service_create(net, ua);
> if (sc) {
> spin_lock_bh(&sc->lock);
> res = tipc_service_insert_publ(net, sc, p);
> @@ -512,7 +517,7 @@ struct publication *tipc_nametbl_remove_publ(struct net
> *net,
> struct tipc_service *sc;
> bool last;
>
> - sc = tipc_service_find(net, ua->sr.type);
> + sc = tipc_service_find(net, ua);
> if (!sc)
> return NULL;
>
> @@ -585,7 +590,7 @@ bool tipc_nametbl_lookup_anycast(struct net *net,
> return true;
>
> rcu_read_lock();
> - sc = tipc_service_find(net, ua->sr.type);
> + sc = tipc_service_find(net, ua);
> if (unlikely(!sc))
> goto exit;
>
> @@ -638,7 +643,7 @@ bool tipc_nametbl_lookup_group(struct net *net, struct
> tipc_uaddr *ua,
>
> *dstcnt = 0;
> rcu_read_lock();
> - sc = tipc_service_find(net, ua->sa.type);
> + sc = tipc_service_find(net, ua);
> if (unlikely(!sc))
> goto exit;
>
> @@ -682,7 +687,7 @@ void tipc_nametbl_lookup_mcast_sockets(struct net *net,
> struct tipc_uaddr *ua,
> u32 scope = ua->scope;
>
> rcu_read_lock();
> - sc = tipc_service_find(net, ua->sr.type);
> + sc = tipc_service_find(net, ua);
> if (!sc)
> goto exit;
>
> @@ -711,7 +716,7 @@ void tipc_nametbl_lookup_mcast_nodes(struct net *net,
> struct tipc_uaddr *ua,
> struct publication *p;
>
> rcu_read_lock();
> - sc = tipc_service_find(net, ua->sr.type);
> + sc = tipc_service_find(net, ua);
> if (!sc)
> goto exit;
>
> @@ -729,7 +734,7 @@ void tipc_nametbl_lookup_mcast_nodes(struct net *net,
> struct tipc_uaddr *ua,
> /* tipc_nametbl_build_group - build list of communication group members
> */
> void tipc_nametbl_build_group(struct net *net, struct tipc_group *grp,
> - u32 type, u32 scope)
> + struct tipc_uaddr *ua)
> {
> struct service_range *sr;
> struct tipc_service *sc;
> @@ -737,7 +742,7 @@ void tipc_nametbl_build_group(struct net *net, struct
> tipc_group *grp,
> struct rb_node *n;
>
> rcu_read_lock();
> - sc = tipc_service_find(net, type);
> + sc = tipc_service_find(net, ua);
> if (!sc)
> goto exit;
>
> @@ -745,9 +750,10 @@ void tipc_nametbl_build_group(struct net *net, struct
> tipc_group *grp,
> for (n = rb_first(&sc->ranges); n; n = rb_next(n)) {
> sr = container_of(n, struct service_range, tree_node);
> list_for_each_entry(p, &sr->all_publ, all_publ) {
> - if (p->scope != scope)
> + if (p->scope != ua->scope)
> continue;
> - tipc_group_add_member(grp, p->sk.node, p->sk.ref,
> p->sr.lower);
> + tipc_group_add_member(grp, p->sk.node, p->sk.ref,
> + p->sr.lower);
> }
> }
> spin_unlock_bh(&sc->lock);
> @@ -829,17 +835,18 @@ void tipc_nametbl_withdraw(struct net *net, struct
> tipc_uaddr *ua,
> */
> bool tipc_nametbl_subscribe(struct tipc_subscription *sub)
> {
> - struct name_table *nt = tipc_name_table(sub->net);
> struct tipc_net *tn = tipc_net(sub->net);
> struct tipc_subscr *s = &sub->evt.s;
> u32 type = tipc_sub_read(s, seq.type);
> struct tipc_service *sc;
> + struct tipc_uaddr ua;
> bool res = true;
>
> + tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_NODE_SCOPE, type, 0, 0);
> spin_lock_bh(&tn->nametbl_lock);
> - sc = tipc_service_find(sub->net, type);
> + sc = tipc_service_find(sub->net, &ua);
> if (!sc)
> - sc = tipc_service_create(type, &nt->services[hash(type)]);
> + sc = tipc_service_create(sub->net, &ua);
> if (sc) {
> spin_lock_bh(&sc->lock);
> tipc_service_subscribe(sc, sub);
> @@ -864,9 +871,11 @@ void tipc_nametbl_unsubscribe(struct tipc_subscription
> *sub)
> struct tipc_subscr *s = &sub->evt.s;
> u32 type = tipc_sub_read(s, seq.type);
> struct tipc_service *sc;
> + struct tipc_uaddr ua;
>
> + tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_NODE_SCOPE, type, 0, 0);
> spin_lock_bh(&tn->nametbl_lock);
> - sc = tipc_service_find(sub->net, type);
> + sc = tipc_service_find(sub->net, &ua);
> if (!sc)
> goto exit;
>
> @@ -1058,6 +1067,7 @@ static int tipc_nl_service_list(struct net *net, struct
> tipc_nl_msg *msg,
> struct tipc_net *tn = tipc_net(net);
> struct tipc_service *service = NULL;
> struct hlist_head *head;
> + struct tipc_uaddr ua;
> int err;
> int i;
>
> @@ -1071,7 +1081,9 @@ static int tipc_nl_service_list(struct net *net, struct
> tipc_nl_msg *msg,
>
> if (*last_type ||
> (!i && *last_key && (*last_lower == *last_key))) {
> - service = tipc_service_find(net, *last_type);
> + tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_NODE_SCOPE,
> + *last_type, *last_lower, *last_lower);
> + service = tipc_service_find(net, &ua);
> if (!service)
> return -EPIPE;
> } else {
> diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h
> index 909eaf706553..5b8102e70f3b 100644
> --- a/net/tipc/name_table.h
> +++ b/net/tipc/name_table.h
> @@ -121,7 +121,7 @@ bool tipc_nametbl_lookup_group(struct net *net, struct
> tipc_uaddr *ua,
> struct list_head *dsts, int *dstcnt,
> u32 exclude, bool mcast);
> void tipc_nametbl_build_group(struct net *net, struct tipc_group *grp,
> - u32 type, u32 domain);
> + struct tipc_uaddr *ua);
> struct publication *tipc_nametbl_publish(struct net *net, struct tipc_uaddr
> *ua,
> struct tipc_socket_addr *sk, u32
> key);
> void tipc_nametbl_withdraw(struct net *net, struct tipc_uaddr *ua,
> diff --git a/net/tipc/socket.c b/net/tipc/socket.c
> index a349160a5ae4..8f1083d3859d 100644
> --- a/net/tipc/socket.c
> +++ b/net/tipc/socket.c
> @@ -3073,9 +3073,9 @@ static int tipc_sk_join(struct tipc_sock *tsk, struct
> tipc_group_req *mreq)
> msg_set_lookup_scope(hdr, mreq->scope);
> msg_set_nametype(hdr, mreq->type);
> msg_set_dest_droppable(hdr, true);
> - tipc_nametbl_build_group(net, grp, mreq->type, mreq->scope);
> tipc_uaddr(&ua, TIPC_SERVICE_RANGE, mreq->scope,
> mreq->type, mreq->instance, mreq->instance);
> + tipc_nametbl_build_group(net, grp, &ua);
> rc = tipc_sk_publish(tsk, &ua);
> if (rc) {
> tipc_group_delete(net, grp);
> --
> 2.28.0
>
>
>
> _______________________________________________
> tipc-discussion mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/tipc-discussion
_______________________________________________
tipc-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tipc-discussion