Skip to content

Commit

Permalink
tipc: initiate media type array at compile time
Browse files Browse the repository at this point in the history
Communication media types are abstracted through the struct 'tipc_media',
one per media type. These structs are allocated statically inside their
respective media file.

Furthermore, in order to be able to reach all instances from a central
location, we keep a static array with pointers to these structs. This
array is currently initialized at runtime, under protection of
tipc_net_lock. However, since the contents of the array itself never
changes after initialization, we can just as well initialize it at
compile time and make it 'const', at the same time making it obvious
that no lock protection is needed here.

This commit makes the array constant and removes the redundant lock
protection.

Signed-off-by: Ying Xue <[email protected]>
Reviewed-by: Paul Gortmaker <[email protected]>
Signed-off-by: Jon Maloy <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Jon Paul Maloy authored and davem330 committed Dec 11, 2013
1 parent d77b383 commit 5702dba
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 62 deletions.
63 changes: 16 additions & 47 deletions net/tipc/bearer.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* net/tipc/bearer.c: TIPC bearer code
*
* Copyright (c) 1996-2006, Ericsson AB
* Copyright (c) 1996-2006, 2013, Ericsson AB
* Copyright (c) 2004-2006, 2010-2011, Wind River Systems
* All rights reserved.
*
Expand Down Expand Up @@ -41,8 +41,13 @@

#define MAX_ADDR_STR 60

static struct tipc_media *media_list[MAX_MEDIA];
static u32 media_count;
static struct tipc_media * const media_list[] = {
&eth_media_info,
#ifdef CONFIG_TIPC_MEDIA_IB
&ib_media_info,
#endif
NULL
};

struct tipc_bearer tipc_bearers[MAX_BEARERS];

Expand All @@ -55,11 +60,11 @@ struct tipc_media *tipc_media_find(const char *name)
{
u32 i;

for (i = 0; i < media_count; i++) {
for (i = 0; media_list[i] != NULL; i++) {
if (!strcmp(media_list[i]->name, name))
return media_list[i];
break;
}
return NULL;
return media_list[i];
}

/**
Expand All @@ -69,44 +74,11 @@ static struct tipc_media *media_find_id(u8 type)
{
u32 i;

for (i = 0; i < media_count; i++) {
for (i = 0; media_list[i] != NULL; i++) {
if (media_list[i]->type_id == type)
return media_list[i];
break;
}
return NULL;
}

/**
* tipc_register_media - register a media type
*
* Bearers for this media type must be activated separately at a later stage.
*/
int tipc_register_media(struct tipc_media *m_ptr)
{
int res = -EINVAL;

write_lock_bh(&tipc_net_lock);

if ((strlen(m_ptr->name) + 1) > TIPC_MAX_MEDIA_NAME)
goto exit;
if (m_ptr->priority > TIPC_MAX_LINK_PRI)
goto exit;
if ((m_ptr->tolerance < TIPC_MIN_LINK_TOL) ||
(m_ptr->tolerance > TIPC_MAX_LINK_TOL))
goto exit;
if (media_count >= MAX_MEDIA)
goto exit;
if (tipc_media_find(m_ptr->name) || media_find_id(m_ptr->type_id))
goto exit;

media_list[media_count] = m_ptr;
media_count++;
res = 0;
exit:
write_unlock_bh(&tipc_net_lock);
if (res)
pr_warn("Media <%s> registration error\n", m_ptr->name);
return res;
return media_list[i];
}

/**
Expand Down Expand Up @@ -144,13 +116,11 @@ struct sk_buff *tipc_media_get_names(void)
if (!buf)
return NULL;

read_lock_bh(&tipc_net_lock);
for (i = 0; i < media_count; i++) {
for (i = 0; media_list[i] != NULL; i++) {
tipc_cfg_append_tlv(buf, TIPC_TLV_MEDIA_NAME,
media_list[i]->name,
strlen(media_list[i]->name) + 1);
}
read_unlock_bh(&tipc_net_lock);
return buf;
}

Expand Down Expand Up @@ -247,7 +217,7 @@ struct sk_buff *tipc_bearer_get_names(void)
return NULL;

read_lock_bh(&tipc_net_lock);
for (i = 0; i < media_count; i++) {
for (i = 0; media_list[i] != NULL; i++) {
for (j = 0; j < MAX_BEARERS; j++) {
b_ptr = &tipc_bearers[j];
if (b_ptr->active && (b_ptr->media == media_list[i])) {
Expand Down Expand Up @@ -472,5 +442,4 @@ void tipc_bearer_stop(void)
if (tipc_bearers[i].active)
bearer_disable(&tipc_bearers[i]);
}
media_count = 0;
}
5 changes: 3 additions & 2 deletions net/tipc/bearer.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* net/tipc/bearer.h: Include file for TIPC bearer code
*
* Copyright (c) 1996-2006, Ericsson AB
* Copyright (c) 1996-2006, 2013, Ericsson AB
* Copyright (c) 2005, 2010-2011, Wind River Systems
* All rights reserved.
*
Expand Down Expand Up @@ -157,7 +157,6 @@ extern struct tipc_bearer tipc_bearers[];
/*
* TIPC routines available to supported media types
*/
int tipc_register_media(struct tipc_media *m_ptr);

void tipc_recv_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr);

Expand All @@ -171,10 +170,12 @@ int tipc_disable_bearer(const char *name);
*/
int tipc_eth_media_start(void);
void tipc_eth_media_stop(void);
extern struct tipc_media eth_media_info;

#ifdef CONFIG_TIPC_MEDIA_IB
int tipc_ib_media_start(void);
void tipc_ib_media_stop(void);
extern struct tipc_media ib_media_info;
#else
static inline int tipc_ib_media_start(void) { return 0; }
static inline void tipc_ib_media_stop(void) { return; }
Expand Down
10 changes: 3 additions & 7 deletions net/tipc/eth_media.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* net/tipc/eth_media.c: Ethernet bearer support for TIPC
*
* Copyright (c) 2001-2007, Ericsson AB
* Copyright (c) 2001-2007, 2013, Ericsson AB
* Copyright (c) 2005-2008, 2011-2013, Wind River Systems
* All rights reserved.
*
Expand Down Expand Up @@ -57,7 +57,7 @@ struct eth_media {
struct work_struct cleanup;
};

static struct tipc_media eth_media_info;

static struct eth_media eth_media_array[MAX_ETH_MEDIA];
static int eth_started;

Expand Down Expand Up @@ -315,7 +315,7 @@ static int eth_msg2addr(const struct tipc_bearer *tb_ptr,
/*
* Ethernet media registration info
*/
static struct tipc_media eth_media_info = {
struct tipc_media eth_media_info = {
.send_msg = send_msg,
.enable_media = enable_media,
.disable_media = disable_media,
Expand All @@ -342,10 +342,6 @@ int tipc_eth_media_start(void)
if (eth_started)
return -EINVAL;

res = tipc_register_media(&eth_media_info);
if (res)
return res;

res = register_netdevice_notifier(&notifier);
if (!res)
eth_started = 1;
Expand Down
7 changes: 1 addition & 6 deletions net/tipc/ib_media.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ struct ib_media {
struct work_struct cleanup;
};

static struct tipc_media ib_media_info;
static struct ib_media ib_media_array[MAX_IB_MEDIA];
static int ib_started;

Expand Down Expand Up @@ -311,7 +310,7 @@ static int ib_msg2addr(const struct tipc_bearer *tb_ptr,
/*
* InfiniBand media registration info
*/
static struct tipc_media ib_media_info = {
struct tipc_media ib_media_info = {
.send_msg = send_msg,
.enable_media = enable_media,
.disable_media = disable_media,
Expand All @@ -338,10 +337,6 @@ int tipc_ib_media_start(void)
if (ib_started)
return -EINVAL;

res = tipc_register_media(&ib_media_info);
if (res)
return res;

res = register_netdevice_notifier(&notifier);
if (!res)
ib_started = 1;
Expand Down

0 comments on commit 5702dba

Please sign in to comment.