| .. | .. |
|---|
| 122 | 122 | #define J1939_CAN_ID CAN_EFF_FLAG |
|---|
| 123 | 123 | #define J1939_CAN_MASK (CAN_EFF_FLAG | CAN_RTR_FLAG) |
|---|
| 124 | 124 | |
|---|
| 125 | | -static DEFINE_SPINLOCK(j1939_netdev_lock); |
|---|
| 125 | +static DEFINE_MUTEX(j1939_netdev_lock); |
|---|
| 126 | 126 | |
|---|
| 127 | 127 | static struct j1939_priv *j1939_priv_create(struct net_device *ndev) |
|---|
| 128 | 128 | { |
|---|
| .. | .. |
|---|
| 216 | 216 | j1939_can_rx_unregister(priv); |
|---|
| 217 | 217 | j1939_ecu_unmap_all(priv); |
|---|
| 218 | 218 | j1939_priv_set(priv->ndev, NULL); |
|---|
| 219 | | - spin_unlock(&j1939_netdev_lock); |
|---|
| 219 | + mutex_unlock(&j1939_netdev_lock); |
|---|
| 220 | 220 | } |
|---|
| 221 | 221 | |
|---|
| 222 | 222 | /* get pointer to priv without increasing ref counter */ |
|---|
| .. | .. |
|---|
| 244 | 244 | { |
|---|
| 245 | 245 | struct j1939_priv *priv; |
|---|
| 246 | 246 | |
|---|
| 247 | | - spin_lock(&j1939_netdev_lock); |
|---|
| 247 | + mutex_lock(&j1939_netdev_lock); |
|---|
| 248 | 248 | priv = j1939_priv_get_by_ndev_locked(ndev); |
|---|
| 249 | | - spin_unlock(&j1939_netdev_lock); |
|---|
| 249 | + mutex_unlock(&j1939_netdev_lock); |
|---|
| 250 | 250 | |
|---|
| 251 | 251 | return priv; |
|---|
| 252 | 252 | } |
|---|
| .. | .. |
|---|
| 256 | 256 | struct j1939_priv *priv, *priv_new; |
|---|
| 257 | 257 | int ret; |
|---|
| 258 | 258 | |
|---|
| 259 | | - spin_lock(&j1939_netdev_lock); |
|---|
| 259 | + mutex_lock(&j1939_netdev_lock); |
|---|
| 260 | 260 | priv = j1939_priv_get_by_ndev_locked(ndev); |
|---|
| 261 | 261 | if (priv) { |
|---|
| 262 | 262 | kref_get(&priv->rx_kref); |
|---|
| 263 | | - spin_unlock(&j1939_netdev_lock); |
|---|
| 263 | + mutex_unlock(&j1939_netdev_lock); |
|---|
| 264 | 264 | return priv; |
|---|
| 265 | 265 | } |
|---|
| 266 | | - spin_unlock(&j1939_netdev_lock); |
|---|
| 266 | + mutex_unlock(&j1939_netdev_lock); |
|---|
| 267 | 267 | |
|---|
| 268 | 268 | priv = j1939_priv_create(ndev); |
|---|
| 269 | 269 | if (!priv) |
|---|
| .. | .. |
|---|
| 273 | 273 | spin_lock_init(&priv->j1939_socks_lock); |
|---|
| 274 | 274 | INIT_LIST_HEAD(&priv->j1939_socks); |
|---|
| 275 | 275 | |
|---|
| 276 | | - spin_lock(&j1939_netdev_lock); |
|---|
| 276 | + mutex_lock(&j1939_netdev_lock); |
|---|
| 277 | 277 | priv_new = j1939_priv_get_by_ndev_locked(ndev); |
|---|
| 278 | 278 | if (priv_new) { |
|---|
| 279 | 279 | /* Someone was faster than us, use their priv and roll |
|---|
| 280 | 280 | * back our's. |
|---|
| 281 | 281 | */ |
|---|
| 282 | 282 | kref_get(&priv_new->rx_kref); |
|---|
| 283 | | - spin_unlock(&j1939_netdev_lock); |
|---|
| 283 | + mutex_unlock(&j1939_netdev_lock); |
|---|
| 284 | 284 | dev_put(ndev); |
|---|
| 285 | 285 | kfree(priv); |
|---|
| 286 | 286 | return priv_new; |
|---|
| 287 | 287 | } |
|---|
| 288 | 288 | j1939_priv_set(ndev, priv); |
|---|
| 289 | | - spin_unlock(&j1939_netdev_lock); |
|---|
| 290 | 289 | |
|---|
| 291 | 290 | ret = j1939_can_rx_register(priv); |
|---|
| 292 | 291 | if (ret < 0) |
|---|
| 293 | 292 | goto out_priv_put; |
|---|
| 294 | 293 | |
|---|
| 294 | + mutex_unlock(&j1939_netdev_lock); |
|---|
| 295 | 295 | return priv; |
|---|
| 296 | 296 | |
|---|
| 297 | 297 | out_priv_put: |
|---|
| 298 | 298 | j1939_priv_set(ndev, NULL); |
|---|
| 299 | + mutex_unlock(&j1939_netdev_lock); |
|---|
| 300 | + |
|---|
| 299 | 301 | dev_put(ndev); |
|---|
| 300 | 302 | kfree(priv); |
|---|
| 301 | 303 | |
|---|
| .. | .. |
|---|
| 304 | 306 | |
|---|
| 305 | 307 | void j1939_netdev_stop(struct j1939_priv *priv) |
|---|
| 306 | 308 | { |
|---|
| 307 | | - kref_put_lock(&priv->rx_kref, __j1939_rx_release, &j1939_netdev_lock); |
|---|
| 309 | + kref_put_mutex(&priv->rx_kref, __j1939_rx_release, &j1939_netdev_lock); |
|---|
| 308 | 310 | j1939_priv_put(priv); |
|---|
| 309 | 311 | } |
|---|
| 310 | 312 | |
|---|