|
From: Tung Q. N. <tun...@de...> - 2021-01-27 09:29:53
|
Hi Jon,
Just one minor comment for this patch (marked with [Tung]").
Best regards,
Tung Nguyen
-----Original Message-----
From: jm...@re... <jm...@re...>
Sent: Wednesday, December 9, 2020 1:50 AM
To: tip...@li...
Cc: Tung Quang Nguyen <tun...@de...>; Hoang Huu Le <hoa...@de...>; Tuong Tong Lien <tuo...@de...>; jm...@re...; ma...@do...; xi...@re...; yin...@wi...; par...@gm...
Subject: [net-next 02/16] tipc: move creation of publication item one level up in call chain
From: Jon Maloy <jm...@re...>
We instantiante struct publication in tipc_nametbl_insert_publ()
[Tung]: typo. instantiante/Instantiate.
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 <jm...@re...>
---
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 (res)
+ return p;
+ kfree(p);
+ return NULL;
}
struct publication *tipc_nametbl_remove_publ(struct net *net, u32 type,
--
2.28.0
|