Skip to content

Commit f41647e

Browse files
Devesh Sharmadledford
Devesh Sharma
authored andcommitted
RDMA/be2net: Remove open and close entry points
Recently Dough Ledford reported a deadlock happening between ocrdma-load sequence and NetworkManager service issueing "open" on be2net interface. The deadlock happens when any be2net hook (e.g. open/close) is called in parallel to insmod ocrdma.ko. A. be2net is sending administrative open/close event to ocrdma holding device_list_mutex. It does this from ndo_open/ndo_stop hooks of be2net. So sequence of locks is rtnl_lock---> device_list lock B. When new ocrdma roce device gets registered, infiniband stack now takes rtnl_lock in ib_register_device() in GID initialization routines. So sequence of locks in this path is device_list lock ---> rtnl_lock. This improper locking sequence causes deadlock. In order to resolve the above deadlock condition, ocrdma intorduced a patch to stop listening to administrative open/close events generated from be2net driver. It now depends on link-state-change async-event generated from CNA. This change leaves behind dead code which used to generate administrative open/close events. This patch cleans-up all that dead code from be2net. Reported-by: Doug Ledford <dledford@redhat.com> CC: Sathya Perla <sathya.perla@avagotech.com> Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com> Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com> Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
1 parent 10a214d commit f41647e

File tree

4 files changed

+1
-45
lines changed

4 files changed

+1
-45
lines changed

drivers/net/ethernet/emulex/benet/be.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -848,8 +848,6 @@ void be_roce_dev_remove(struct be_adapter *);
848848
/*
849849
* internal function to open-close roce device during ifup-ifdown.
850850
*/
851-
void be_roce_dev_open(struct be_adapter *);
852-
void be_roce_dev_close(struct be_adapter *);
853851
void be_roce_dev_shutdown(struct be_adapter *);
854852

855853
#endif /* BE_H */

drivers/net/ethernet/emulex/benet/be_main.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3432,8 +3432,6 @@ static int be_close(struct net_device *netdev)
34323432

34333433
be_disable_if_filters(adapter);
34343434

3435-
be_roce_dev_close(adapter);
3436-
34373435
if (adapter->flags & BE_FLAGS_NAPI_ENABLED) {
34383436
for_all_evt_queues(adapter, eqo, i) {
34393437
napi_disable(&eqo->napi);
@@ -3601,8 +3599,6 @@ static int be_open(struct net_device *netdev)
36013599
be_link_status_update(adapter, link_status);
36023600

36033601
netif_tx_start_all_queues(netdev);
3604-
be_roce_dev_open(adapter);
3605-
36063602
#ifdef CONFIG_BE2NET_VXLAN
36073603
if (skyhawk_chip(adapter))
36083604
vxlan_get_rx_port(netdev);

drivers/net/ethernet/emulex/benet/be_roce.c

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -116,40 +116,6 @@ void be_roce_dev_remove(struct be_adapter *adapter)
116116
}
117117
}
118118

119-
static void _be_roce_dev_open(struct be_adapter *adapter)
120-
{
121-
if (ocrdma_drv && adapter->ocrdma_dev &&
122-
ocrdma_drv->state_change_handler)
123-
ocrdma_drv->state_change_handler(adapter->ocrdma_dev,
124-
BE_DEV_UP);
125-
}
126-
127-
void be_roce_dev_open(struct be_adapter *adapter)
128-
{
129-
if (be_roce_supported(adapter)) {
130-
mutex_lock(&be_adapter_list_lock);
131-
_be_roce_dev_open(adapter);
132-
mutex_unlock(&be_adapter_list_lock);
133-
}
134-
}
135-
136-
static void _be_roce_dev_close(struct be_adapter *adapter)
137-
{
138-
if (ocrdma_drv && adapter->ocrdma_dev &&
139-
ocrdma_drv->state_change_handler)
140-
ocrdma_drv->state_change_handler(adapter->ocrdma_dev,
141-
BE_DEV_DOWN);
142-
}
143-
144-
void be_roce_dev_close(struct be_adapter *adapter)
145-
{
146-
if (be_roce_supported(adapter)) {
147-
mutex_lock(&be_adapter_list_lock);
148-
_be_roce_dev_close(adapter);
149-
mutex_unlock(&be_adapter_list_lock);
150-
}
151-
}
152-
153119
void be_roce_dev_shutdown(struct be_adapter *adapter)
154120
{
155121
if (be_roce_supported(adapter)) {
@@ -177,8 +143,6 @@ int be_roce_register_driver(struct ocrdma_driver *drv)
177143

178144
_be_roce_dev_add(dev);
179145
netdev = dev->netdev;
180-
if (netif_running(netdev) && netif_oper_up(netdev))
181-
_be_roce_dev_open(dev);
182146
}
183147
mutex_unlock(&be_adapter_list_lock);
184148
return 0;

drivers/net/ethernet/emulex/benet/be_roce.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ struct ocrdma_driver {
6060
void (*state_change_handler) (struct ocrdma_dev *, u32 new_state);
6161
};
6262

63-
enum {
64-
BE_DEV_UP = 0,
65-
BE_DEV_DOWN = 1,
63+
enum be_roce_event {
6664
BE_DEV_SHUTDOWN = 2
6765
};
6866

0 commit comments

Comments
 (0)