aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/bcast.c
diff options
context:
space:
mode:
authorAllan Stephens <allan.stephens@windriver.com>2011-10-24 10:29:26 -0400
committerPaul Gortmaker <paul.gortmaker@windriver.com>2011-12-27 11:33:47 -0500
commitc47e9b918844ab7bb139eada7b085c576ddf0afb (patch)
tree492e8ac4c1191b1c7be865efacc7833ebcb6fff9 /net/tipc/bcast.c
parent945af1c39df00a1e5873e38145432ba752ec49a0 (diff)
tipc: Eliminate dynamic allocation of broadcast link data structures
Creates global variables to hold the broadcast link's pseudo-bearer and pseudo-link structures, rather than allocating them dynamically. There is only a single instance of each structure, and changing over to static allocation allows elimination of code to handle the cases where dynamic allocation was unsuccessful. The memset in the teardown code may look like they aren't used, but the same teardown code is run when there is a non-fatal error at init-time, so that stale data isn't present when the user fixes the cause of the soft error. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Diffstat (limited to 'net/tipc/bcast.c')
-rw-r--r--net/tipc/bcast.c37
1 files changed, 11 insertions, 26 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index 28908f54459e..738cb642d31b 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -98,10 +98,13 @@ struct bclink {
98 struct tipc_node *retransmit_to; 98 struct tipc_node *retransmit_to;
99}; 99};
100 100
101static struct bcbearer bcast_bearer;
102static struct bclink bcast_link;
103
104static struct bcbearer *bcbearer = &bcast_bearer;
105static struct bclink *bclink = &bcast_link;
106static struct link *bcl = &bcast_link.link;
101 107
102static struct bcbearer *bcbearer;
103static struct bclink *bclink;
104static struct link *bcl;
105static DEFINE_SPINLOCK(bc_lock); 108static DEFINE_SPINLOCK(bc_lock);
106 109
107/* broadcast-capable node map */ 110/* broadcast-capable node map */
@@ -752,25 +755,13 @@ int tipc_bclink_set_queue_limits(u32 limit)
752 return 0; 755 return 0;
753} 756}
754 757
755int tipc_bclink_init(void) 758void tipc_bclink_init(void)
756{ 759{
757 bcbearer = kzalloc(sizeof(*bcbearer), GFP_ATOMIC);
758 bclink = kzalloc(sizeof(*bclink), GFP_ATOMIC);
759 if (!bcbearer || !bclink) {
760 warn("Broadcast link creation failed, no memory\n");
761 kfree(bcbearer);
762 bcbearer = NULL;
763 kfree(bclink);
764 bclink = NULL;
765 return -ENOMEM;
766 }
767
768 INIT_LIST_HEAD(&bcbearer->bearer.cong_links); 760 INIT_LIST_HEAD(&bcbearer->bearer.cong_links);
769 bcbearer->bearer.media = &bcbearer->media; 761 bcbearer->bearer.media = &bcbearer->media;
770 bcbearer->media.send_msg = tipc_bcbearer_send; 762 bcbearer->media.send_msg = tipc_bcbearer_send;
771 sprintf(bcbearer->media.name, "tipc-broadcast"); 763 sprintf(bcbearer->media.name, "tipc-broadcast");
772 764
773 bcl = &bclink->link;
774 INIT_LIST_HEAD(&bcl->waiting_ports); 765 INIT_LIST_HEAD(&bcl->waiting_ports);
775 bcl->next_out_no = 1; 766 bcl->next_out_no = 1;
776 spin_lock_init(&bclink->node.lock); 767 spin_lock_init(&bclink->node.lock);
@@ -780,22 +771,16 @@ int tipc_bclink_init(void)
780 bcl->b_ptr = &bcbearer->bearer; 771 bcl->b_ptr = &bcbearer->bearer;
781 bcl->state = WORKING_WORKING; 772 bcl->state = WORKING_WORKING;
782 strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME); 773 strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME);
783
784 return 0;
785} 774}
786 775
787void tipc_bclink_stop(void) 776void tipc_bclink_stop(void)
788{ 777{
789 spin_lock_bh(&bc_lock); 778 spin_lock_bh(&bc_lock);
790 if (bcbearer) { 779 tipc_link_stop(bcl);
791 tipc_link_stop(bcl);
792 bcl = NULL;
793 kfree(bclink);
794 bclink = NULL;
795 kfree(bcbearer);
796 bcbearer = NULL;
797 }
798 spin_unlock_bh(&bc_lock); 780 spin_unlock_bh(&bc_lock);
781
782 memset(bclink, 0, sizeof(*bclink));
783 memset(bcbearer, 0, sizeof(*bcbearer));
799} 784}
800 785
801 786