Skip to content

Commit

Permalink
tipc: make dist queue pernet
Browse files Browse the repository at this point in the history
Nametable updates received from the network that cannot be applied
immediately are placed on a defer queue. This queue is global to the
TIPC module, which might cause problems when using TIPC in containers.
To prevent nametable updates from escaping into the wrong namespace,
we make the queue pernet instead.

Signed-off-by: Erik Hugne <[email protected]>
Signed-off-by: Jon Maloy <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Hugne authored and davem330 committed Apr 11, 2016
1 parent ebf4dc2 commit 541726a
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 9 deletions.
1 change: 1 addition & 0 deletions net/tipc/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ static int __net_init tipc_init_net(struct net *net)
if (err)
goto out_nametbl;

INIT_LIST_HEAD(&tn->dist_queue);
err = tipc_topsrv_start(net);
if (err)
goto out_subscr;
Expand Down
3 changes: 3 additions & 0 deletions net/tipc/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ struct tipc_net {
spinlock_t nametbl_lock;
struct name_table *nametbl;

/* Name dist queue */
struct list_head dist_queue;

/* Topology subscription server */
struct tipc_server *topsrv;
atomic_t subscription_count;
Expand Down
16 changes: 7 additions & 9 deletions net/tipc/name_distr.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,6 @@

int sysctl_tipc_named_timeout __read_mostly = 2000;

/**
* struct tipc_dist_queue - queue holding deferred name table updates
*/
static struct list_head tipc_dist_queue = LIST_HEAD_INIT(tipc_dist_queue);

struct distr_queue_item {
struct distr_item i;
u32 dtype;
Expand Down Expand Up @@ -279,9 +274,11 @@ static bool tipc_update_nametbl(struct net *net, struct distr_item *i,
* tipc_named_add_backlog - add a failed name table update to the backlog
*
*/
static void tipc_named_add_backlog(struct distr_item *i, u32 type, u32 node)
static void tipc_named_add_backlog(struct net *net, struct distr_item *i,
u32 type, u32 node)
{
struct distr_queue_item *e;
struct tipc_net *tn = net_generic(net, tipc_net_id);
unsigned long now = get_jiffies_64();

e = kzalloc(sizeof(*e), GFP_ATOMIC);
Expand All @@ -291,7 +288,7 @@ static void tipc_named_add_backlog(struct distr_item *i, u32 type, u32 node)
e->node = node;
e->expires = now + msecs_to_jiffies(sysctl_tipc_named_timeout);
memcpy(e, i, sizeof(*i));
list_add_tail(&e->next, &tipc_dist_queue);
list_add_tail(&e->next, &tn->dist_queue);
}

/**
Expand All @@ -301,10 +298,11 @@ static void tipc_named_add_backlog(struct distr_item *i, u32 type, u32 node)
void tipc_named_process_backlog(struct net *net)
{
struct distr_queue_item *e, *tmp;
struct tipc_net *tn = net_generic(net, tipc_net_id);
char addr[16];
unsigned long now = get_jiffies_64();

list_for_each_entry_safe(e, tmp, &tipc_dist_queue, next) {
list_for_each_entry_safe(e, tmp, &tn->dist_queue, next) {
if (time_after(e->expires, now)) {
if (!tipc_update_nametbl(net, &e->i, e->node, e->dtype))
continue;
Expand Down Expand Up @@ -344,7 +342,7 @@ void tipc_named_rcv(struct net *net, struct sk_buff_head *inputq)
node = msg_orignode(msg);
while (count--) {
if (!tipc_update_nametbl(net, item, node, mtype))
tipc_named_add_backlog(item, mtype, node);
tipc_named_add_backlog(net, item, mtype, node);
item++;
}
kfree_skb(skb);
Expand Down

0 comments on commit 541726a

Please sign in to comment.