tipc: remove bearer_lock from tipc_bearer struct
After the earlier commits ("tipc: remove 'links' list from
tipc_bearer struct") and ("tipc: introduce new spinlock to protect
struct link_req"), there is no longer any need to protect struct
link_req or or any link list by use of bearer_lock. Furthermore,
we have eliminated the need for using bearer_lock during downcalls
(send) from the link to the bearer, since we have ensured that
bearers always have a longer life cycle that their associated links,
and always contain valid data.
So, the only need now for a lock protecting bearers is for guaranteeing
consistency of the bearer list itself. For this, it is sufficient, at
least for the time being, to continue applying 'net_lock´ in write mode.
By removing bearer_lock we also pre-empt introduction of issue b) descibed
in the previous commit "tipc: remove 'links' list from tipc_bearer struct":
"b) When the outer protection from net_lock is gone, taking
    bearer_lock and node_lock in opposite order of method 1) and 2)
    will become an obvious deadlock hazard".
Therefore, we now eliminate the bearer_lock spinlock.
Signed-off-by: Ying Xue <ying.xue@windriver.com>
Reviewed-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
	
	
This commit is contained in:
		
					parent
					
						
							
								7d33939f47
							
						
					
				
			
			
				commit
				
					
						a83045292d
					
				
			
		
					 3 changed files with 4 additions and 18 deletions
				
			
		| 
						 | 
					@ -785,7 +785,6 @@ void tipc_bclink_init(void)
 | 
				
			||||||
	bcl->owner = &bclink->node;
 | 
						bcl->owner = &bclink->node;
 | 
				
			||||||
	bcl->max_pkt = MAX_PKT_DEFAULT_MCAST;
 | 
						bcl->max_pkt = MAX_PKT_DEFAULT_MCAST;
 | 
				
			||||||
	tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT);
 | 
						tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT);
 | 
				
			||||||
	spin_lock_init(&bcbearer->bearer.lock);
 | 
					 | 
				
			||||||
	bcl->b_ptr = &bcbearer->bearer;
 | 
						bcl->b_ptr = &bcbearer->bearer;
 | 
				
			||||||
	bcl->state = WORKING_WORKING;
 | 
						bcl->state = WORKING_WORKING;
 | 
				
			||||||
	strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME);
 | 
						strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -327,7 +327,6 @@ restart:
 | 
				
			||||||
	b_ptr->net_plane = bearer_id + 'A';
 | 
						b_ptr->net_plane = bearer_id + 'A';
 | 
				
			||||||
	b_ptr->active = 1;
 | 
						b_ptr->active = 1;
 | 
				
			||||||
	b_ptr->priority = priority;
 | 
						b_ptr->priority = priority;
 | 
				
			||||||
	spin_lock_init(&b_ptr->lock);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res = tipc_disc_create(b_ptr, &b_ptr->bcast_addr, disc_domain);
 | 
						res = tipc_disc_create(b_ptr, &b_ptr->bcast_addr, disc_domain);
 | 
				
			||||||
	if (res) {
 | 
						if (res) {
 | 
				
			||||||
| 
						 | 
					@ -351,9 +350,7 @@ static int tipc_reset_bearer(struct tipc_bearer *b_ptr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	read_lock_bh(&tipc_net_lock);
 | 
						read_lock_bh(&tipc_net_lock);
 | 
				
			||||||
	pr_info("Resetting bearer <%s>\n", b_ptr->name);
 | 
						pr_info("Resetting bearer <%s>\n", b_ptr->name);
 | 
				
			||||||
	spin_lock_bh(&b_ptr->lock);
 | 
					 | 
				
			||||||
	tipc_link_reset_list(b_ptr->identity);
 | 
						tipc_link_reset_list(b_ptr->identity);
 | 
				
			||||||
	spin_unlock_bh(&b_ptr->lock);
 | 
					 | 
				
			||||||
	read_unlock_bh(&tipc_net_lock);
 | 
						read_unlock_bh(&tipc_net_lock);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -365,19 +362,12 @@ static int tipc_reset_bearer(struct tipc_bearer *b_ptr)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void bearer_disable(struct tipc_bearer *b_ptr, bool shutting_down)
 | 
					static void bearer_disable(struct tipc_bearer *b_ptr, bool shutting_down)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct tipc_link_req *temp_req;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pr_info("Disabling bearer <%s>\n", b_ptr->name);
 | 
						pr_info("Disabling bearer <%s>\n", b_ptr->name);
 | 
				
			||||||
	spin_lock_bh(&b_ptr->lock);
 | 
					 | 
				
			||||||
	b_ptr->media->disable_media(b_ptr);
 | 
						b_ptr->media->disable_media(b_ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tipc_link_delete_list(b_ptr->identity, shutting_down);
 | 
						tipc_link_delete_list(b_ptr->identity, shutting_down);
 | 
				
			||||||
	temp_req = b_ptr->link_req;
 | 
						if (b_ptr->link_req)
 | 
				
			||||||
	b_ptr->link_req = NULL;
 | 
							tipc_disc_delete(b_ptr->link_req);
 | 
				
			||||||
	spin_unlock_bh(&b_ptr->lock);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (temp_req)
 | 
					 | 
				
			||||||
		tipc_disc_delete(temp_req);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	memset(b_ptr, 0, sizeof(struct tipc_bearer));
 | 
						memset(b_ptr, 0, sizeof(struct tipc_bearer));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,10 +107,8 @@ struct tipc_media {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * struct tipc_bearer - Generic TIPC bearer structure
 | 
					 * struct tipc_bearer - Generic TIPC bearer structure
 | 
				
			||||||
 * @dev: ptr to associated network device
 | 
					 * @media_ptr: pointer to additional media-specific information about bearer
 | 
				
			||||||
 * @usr_handle: pointer to additional media-specific information about bearer
 | 
					 | 
				
			||||||
 * @mtu: max packet size bearer can support
 | 
					 * @mtu: max packet size bearer can support
 | 
				
			||||||
 * @lock: spinlock for controlling access to bearer
 | 
					 | 
				
			||||||
 * @addr: media-specific address associated with bearer
 | 
					 * @addr: media-specific address associated with bearer
 | 
				
			||||||
 * @name: bearer name (format = media:interface)
 | 
					 * @name: bearer name (format = media:interface)
 | 
				
			||||||
 * @media: ptr to media structure associated with bearer
 | 
					 * @media: ptr to media structure associated with bearer
 | 
				
			||||||
| 
						 | 
					@ -133,7 +131,6 @@ struct tipc_bearer {
 | 
				
			||||||
	u32 mtu;				/* initalized by media */
 | 
						u32 mtu;				/* initalized by media */
 | 
				
			||||||
	struct tipc_media_addr addr;		/* initalized by media */
 | 
						struct tipc_media_addr addr;		/* initalized by media */
 | 
				
			||||||
	char name[TIPC_MAX_BEARER_NAME];
 | 
						char name[TIPC_MAX_BEARER_NAME];
 | 
				
			||||||
	spinlock_t lock;
 | 
					 | 
				
			||||||
	struct tipc_media *media;
 | 
						struct tipc_media *media;
 | 
				
			||||||
	struct tipc_media_addr bcast_addr;
 | 
						struct tipc_media_addr bcast_addr;
 | 
				
			||||||
	u32 priority;
 | 
						u32 priority;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue