@@ -1939,8 +1939,9 @@ static int do_hard_reset(struct ibmvnic_adapter *adapter,
1939
1939
static struct ibmvnic_rwi * get_next_rwi (struct ibmvnic_adapter * adapter )
1940
1940
{
1941
1941
struct ibmvnic_rwi * rwi ;
1942
+ unsigned long flags ;
1942
1943
1943
- mutex_lock (& adapter -> rwi_lock );
1944
+ spin_lock_irqsave (& adapter -> rwi_lock , flags );
1944
1945
1945
1946
if (!list_empty (& adapter -> rwi_list )) {
1946
1947
rwi = list_first_entry (& adapter -> rwi_list , struct ibmvnic_rwi ,
@@ -1950,7 +1951,7 @@ static struct ibmvnic_rwi *get_next_rwi(struct ibmvnic_adapter *adapter)
1950
1951
rwi = NULL ;
1951
1952
}
1952
1953
1953
- mutex_unlock (& adapter -> rwi_lock );
1954
+ spin_unlock_irqrestore (& adapter -> rwi_lock , flags );
1954
1955
return rwi ;
1955
1956
}
1956
1957
@@ -2025,6 +2026,7 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter,
2025
2026
struct list_head * entry , * tmp_entry ;
2026
2027
struct ibmvnic_rwi * rwi , * tmp ;
2027
2028
struct net_device * netdev = adapter -> netdev ;
2029
+ unsigned long flags ;
2028
2030
int ret ;
2029
2031
2030
2032
if (adapter -> state == VNIC_REMOVING ||
@@ -2041,21 +2043,21 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter,
2041
2043
goto err ;
2042
2044
}
2043
2045
2044
- mutex_lock (& adapter -> rwi_lock );
2046
+ spin_lock_irqsave (& adapter -> rwi_lock , flags );
2045
2047
2046
2048
list_for_each (entry , & adapter -> rwi_list ) {
2047
2049
tmp = list_entry (entry , struct ibmvnic_rwi , list );
2048
2050
if (tmp -> reset_reason == reason ) {
2049
2051
netdev_dbg (netdev , "Skipping matching reset\n" );
2050
- mutex_unlock (& adapter -> rwi_lock );
2052
+ spin_unlock_irqrestore (& adapter -> rwi_lock , flags );
2051
2053
ret = EBUSY ;
2052
2054
goto err ;
2053
2055
}
2054
2056
}
2055
2057
2056
2058
rwi = kzalloc (sizeof (* rwi ), GFP_KERNEL );
2057
2059
if (!rwi ) {
2058
- mutex_unlock (& adapter -> rwi_lock );
2060
+ spin_unlock_irqrestore (& adapter -> rwi_lock , flags );
2059
2061
ibmvnic_close (netdev );
2060
2062
ret = ENOMEM ;
2061
2063
goto err ;
@@ -2069,7 +2071,7 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter,
2069
2071
}
2070
2072
rwi -> reset_reason = reason ;
2071
2073
list_add_tail (& rwi -> list , & adapter -> rwi_list );
2072
- mutex_unlock (& adapter -> rwi_lock );
2074
+ spin_unlock_irqrestore (& adapter -> rwi_lock , flags );
2073
2075
adapter -> resetting = true;
2074
2076
netdev_dbg (adapter -> netdev , "Scheduling reset (reason %d)\n" , reason );
2075
2077
schedule_work (& adapter -> ibmvnic_reset );
@@ -4759,7 +4761,7 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
4759
4761
4760
4762
INIT_WORK (& adapter -> ibmvnic_reset , __ibmvnic_reset );
4761
4763
INIT_LIST_HEAD (& adapter -> rwi_list );
4762
- mutex_init (& adapter -> rwi_lock );
4764
+ spin_lock_init (& adapter -> rwi_lock );
4763
4765
adapter -> resetting = false;
4764
4766
4765
4767
adapter -> mac_change_pending = false;
0 commit comments