Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink

Partially revert commit b71724147e73 ("be2net: replace polling with
sleeping in the FW completion path") w.r.t mcc mutex it introduces and the
use of usleep_range. The be2net be_ndo_bridge_getlink() callback is
called with rcu_read_lock, so this code has been broken for a long time.
Both the mutex_lock and the usleep_range can cause the issue Ian Kumlien
reported[1]. The call path is:
be_ndo_bridge_getlink -> be_cmd_get_hsw_config -> be_mcc_notify_wait ->
be_mcc_wait_compl -> usleep_range()

[1] https://lore.kernel.org/netdev/CAA85sZveppNgEVa_FD+qhOMtG_AavK9_mFiU+jWrMtXmwqefGA@mail.gmail.com/

Tested-by: Ian Kumlien <ian.kumlien@gmail.com>
Fixes: b71724147e73 ("be2net: replace polling with sleeping in the FW completion path")
Signed-off-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/20250227164129.1201164-1-razor@blackwall.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Nikolay Aleksandrov and committed by
Paolo Abeni
1a82d19c 64e6a754

+100 -101
+1 -1
drivers/net/ethernet/emulex/benet/be.h
··· 562 562 struct be_dma_mem mbox_mem_alloced; 563 563 564 564 struct be_mcc_obj mcc_obj; 565 - struct mutex mcc_lock; /* For serializing mcc cmds to BE card */ 565 + spinlock_t mcc_lock; /* For serializing mcc cmds to BE card */ 566 566 spinlock_t mcc_cq_lock; 567 567 568 568 u16 cfg_num_rx_irqs; /* configured via set-channels */
+98 -99
drivers/net/ethernet/emulex/benet/be_cmds.c
··· 575 575 /* Wait till no more pending mcc requests are present */ 576 576 static int be_mcc_wait_compl(struct be_adapter *adapter) 577 577 { 578 - #define mcc_timeout 12000 /* 12s timeout */ 578 + #define mcc_timeout 120000 /* 12s timeout */ 579 579 int i, status = 0; 580 580 struct be_mcc_obj *mcc_obj = &adapter->mcc_obj; 581 581 ··· 589 589 590 590 if (atomic_read(&mcc_obj->q.used) == 0) 591 591 break; 592 - usleep_range(500, 1000); 592 + udelay(100); 593 593 } 594 594 if (i == mcc_timeout) { 595 595 dev_err(&adapter->pdev->dev, "FW not responding\n"); ··· 866 866 static int be_cmd_lock(struct be_adapter *adapter) 867 867 { 868 868 if (use_mcc(adapter)) { 869 - mutex_lock(&adapter->mcc_lock); 869 + spin_lock_bh(&adapter->mcc_lock); 870 870 return 0; 871 871 } else { 872 872 return mutex_lock_interruptible(&adapter->mbox_lock); ··· 877 877 static void be_cmd_unlock(struct be_adapter *adapter) 878 878 { 879 879 if (use_mcc(adapter)) 880 - return mutex_unlock(&adapter->mcc_lock); 880 + return spin_unlock_bh(&adapter->mcc_lock); 881 881 else 882 882 return mutex_unlock(&adapter->mbox_lock); 883 883 } ··· 1047 1047 struct be_cmd_req_mac_query *req; 1048 1048 int status; 1049 1049 1050 - mutex_lock(&adapter->mcc_lock); 1050 + spin_lock_bh(&adapter->mcc_lock); 1051 1051 1052 1052 wrb = wrb_from_mccq(adapter); 1053 1053 if (!wrb) { ··· 1076 1076 } 1077 1077 1078 1078 err: 1079 - mutex_unlock(&adapter->mcc_lock); 1079 + spin_unlock_bh(&adapter->mcc_lock); 1080 1080 return status; 1081 1081 } 1082 1082 ··· 1088 1088 struct be_cmd_req_pmac_add *req; 1089 1089 int status; 1090 1090 1091 - mutex_lock(&adapter->mcc_lock); 1091 + spin_lock_bh(&adapter->mcc_lock); 1092 1092 1093 1093 wrb = wrb_from_mccq(adapter); 1094 1094 if (!wrb) { ··· 1113 1113 } 1114 1114 1115 1115 err: 1116 - mutex_unlock(&adapter->mcc_lock); 1116 + spin_unlock_bh(&adapter->mcc_lock); 1117 1117 1118 1118 if (base_status(status) == MCC_STATUS_UNAUTHORIZED_REQUEST) 1119 1119 status = -EPERM; ··· 1131 1131 if (pmac_id == -1) 1132 1132 return 0; 1133 1133 1134 - mutex_lock(&adapter->mcc_lock); 1134 + spin_lock_bh(&adapter->mcc_lock); 1135 1135 1136 1136 wrb = wrb_from_mccq(adapter); 1137 1137 if (!wrb) { ··· 1151 1151 status = be_mcc_notify_wait(adapter); 1152 1152 1153 1153 err: 1154 - mutex_unlock(&adapter->mcc_lock); 1154 + spin_unlock_bh(&adapter->mcc_lock); 1155 1155 return status; 1156 1156 } 1157 1157 ··· 1414 1414 struct be_dma_mem *q_mem = &rxq->dma_mem; 1415 1415 int status; 1416 1416 1417 - mutex_lock(&adapter->mcc_lock); 1417 + spin_lock_bh(&adapter->mcc_lock); 1418 1418 1419 1419 wrb = wrb_from_mccq(adapter); 1420 1420 if (!wrb) { ··· 1444 1444 } 1445 1445 1446 1446 err: 1447 - mutex_unlock(&adapter->mcc_lock); 1447 + spin_unlock_bh(&adapter->mcc_lock); 1448 1448 return status; 1449 1449 } 1450 1450 ··· 1508 1508 struct be_cmd_req_q_destroy *req; 1509 1509 int status; 1510 1510 1511 - mutex_lock(&adapter->mcc_lock); 1511 + spin_lock_bh(&adapter->mcc_lock); 1512 1512 1513 1513 wrb = wrb_from_mccq(adapter); 1514 1514 if (!wrb) { ··· 1525 1525 q->created = false; 1526 1526 1527 1527 err: 1528 - mutex_unlock(&adapter->mcc_lock); 1528 + spin_unlock_bh(&adapter->mcc_lock); 1529 1529 return status; 1530 1530 } 1531 1531 ··· 1593 1593 struct be_cmd_req_hdr *hdr; 1594 1594 int status = 0; 1595 1595 1596 - mutex_lock(&adapter->mcc_lock); 1596 + spin_lock_bh(&adapter->mcc_lock); 1597 1597 1598 1598 wrb = wrb_from_mccq(adapter); 1599 1599 if (!wrb) { ··· 1621 1621 adapter->stats_cmd_sent = true; 1622 1622 1623 1623 err: 1624 - mutex_unlock(&adapter->mcc_lock); 1624 + spin_unlock_bh(&adapter->mcc_lock); 1625 1625 return status; 1626 1626 } 1627 1627 ··· 1637 1637 CMD_SUBSYSTEM_ETH)) 1638 1638 return -EPERM; 1639 1639 1640 - mutex_lock(&adapter->mcc_lock); 1640 + spin_lock_bh(&adapter->mcc_lock); 1641 1641 1642 1642 wrb = wrb_from_mccq(adapter); 1643 1643 if (!wrb) { ··· 1660 1660 adapter->stats_cmd_sent = true; 1661 1661 1662 1662 err: 1663 - mutex_unlock(&adapter->mcc_lock); 1663 + spin_unlock_bh(&adapter->mcc_lock); 1664 1664 return status; 1665 1665 } 1666 1666 ··· 1697 1697 struct be_cmd_req_link_status *req; 1698 1698 int status; 1699 1699 1700 - mutex_lock(&adapter->mcc_lock); 1700 + spin_lock_bh(&adapter->mcc_lock); 1701 1701 1702 1702 if (link_status) 1703 1703 *link_status = LINK_DOWN; ··· 1736 1736 } 1737 1737 1738 1738 err: 1739 - mutex_unlock(&adapter->mcc_lock); 1739 + spin_unlock_bh(&adapter->mcc_lock); 1740 1740 return status; 1741 1741 } 1742 1742 ··· 1747 1747 struct be_cmd_req_get_cntl_addnl_attribs *req; 1748 1748 int status = 0; 1749 1749 1750 - mutex_lock(&adapter->mcc_lock); 1750 + spin_lock_bh(&adapter->mcc_lock); 1751 1751 1752 1752 wrb = wrb_from_mccq(adapter); 1753 1753 if (!wrb) { ··· 1762 1762 1763 1763 status = be_mcc_notify(adapter); 1764 1764 err: 1765 - mutex_unlock(&adapter->mcc_lock); 1765 + spin_unlock_bh(&adapter->mcc_lock); 1766 1766 return status; 1767 1767 } 1768 1768 ··· 1811 1811 if (!get_fat_cmd.va) 1812 1812 return -ENOMEM; 1813 1813 1814 - mutex_lock(&adapter->mcc_lock); 1814 + spin_lock_bh(&adapter->mcc_lock); 1815 1815 1816 1816 while (total_size) { 1817 1817 buf_size = min(total_size, (u32)60 * 1024); ··· 1849 1849 log_offset += buf_size; 1850 1850 } 1851 1851 err: 1852 + spin_unlock_bh(&adapter->mcc_lock); 1852 1853 dma_free_coherent(&adapter->pdev->dev, get_fat_cmd.size, 1853 1854 get_fat_cmd.va, get_fat_cmd.dma); 1854 - mutex_unlock(&adapter->mcc_lock); 1855 1855 return status; 1856 1856 } 1857 1857 ··· 1862 1862 struct be_cmd_req_get_fw_version *req; 1863 1863 int status; 1864 1864 1865 - mutex_lock(&adapter->mcc_lock); 1865 + spin_lock_bh(&adapter->mcc_lock); 1866 1866 1867 1867 wrb = wrb_from_mccq(adapter); 1868 1868 if (!wrb) { ··· 1885 1885 sizeof(adapter->fw_on_flash)); 1886 1886 } 1887 1887 err: 1888 - mutex_unlock(&adapter->mcc_lock); 1888 + spin_unlock_bh(&adapter->mcc_lock); 1889 1889 return status; 1890 1890 } 1891 1891 ··· 1899 1899 struct be_cmd_req_modify_eq_delay *req; 1900 1900 int status = 0, i; 1901 1901 1902 - mutex_lock(&adapter->mcc_lock); 1902 + spin_lock_bh(&adapter->mcc_lock); 1903 1903 1904 1904 wrb = wrb_from_mccq(adapter); 1905 1905 if (!wrb) { ··· 1922 1922 1923 1923 status = be_mcc_notify(adapter); 1924 1924 err: 1925 - mutex_unlock(&adapter->mcc_lock); 1925 + spin_unlock_bh(&adapter->mcc_lock); 1926 1926 return status; 1927 1927 } 1928 1928 ··· 1949 1949 struct be_cmd_req_vlan_config *req; 1950 1950 int status; 1951 1951 1952 - mutex_lock(&adapter->mcc_lock); 1952 + spin_lock_bh(&adapter->mcc_lock); 1953 1953 1954 1954 wrb = wrb_from_mccq(adapter); 1955 1955 if (!wrb) { ··· 1971 1971 1972 1972 status = be_mcc_notify_wait(adapter); 1973 1973 err: 1974 - mutex_unlock(&adapter->mcc_lock); 1974 + spin_unlock_bh(&adapter->mcc_lock); 1975 1975 return status; 1976 1976 } 1977 1977 ··· 1982 1982 struct be_cmd_req_rx_filter *req = mem->va; 1983 1983 int status; 1984 1984 1985 - mutex_lock(&adapter->mcc_lock); 1985 + spin_lock_bh(&adapter->mcc_lock); 1986 1986 1987 1987 wrb = wrb_from_mccq(adapter); 1988 1988 if (!wrb) { ··· 2015 2015 2016 2016 status = be_mcc_notify_wait(adapter); 2017 2017 err: 2018 - mutex_unlock(&adapter->mcc_lock); 2018 + spin_unlock_bh(&adapter->mcc_lock); 2019 2019 return status; 2020 2020 } 2021 2021 ··· 2046 2046 CMD_SUBSYSTEM_COMMON)) 2047 2047 return -EPERM; 2048 2048 2049 - mutex_lock(&adapter->mcc_lock); 2049 + spin_lock_bh(&adapter->mcc_lock); 2050 2050 2051 2051 wrb = wrb_from_mccq(adapter); 2052 2052 if (!wrb) { ··· 2066 2066 status = be_mcc_notify_wait(adapter); 2067 2067 2068 2068 err: 2069 - mutex_unlock(&adapter->mcc_lock); 2069 + spin_unlock_bh(&adapter->mcc_lock); 2070 2070 2071 2071 if (base_status(status) == MCC_STATUS_FEATURE_NOT_SUPPORTED) 2072 2072 return -EOPNOTSUPP; ··· 2085 2085 CMD_SUBSYSTEM_COMMON)) 2086 2086 return -EPERM; 2087 2087 2088 - mutex_lock(&adapter->mcc_lock); 2088 + spin_lock_bh(&adapter->mcc_lock); 2089 2089 2090 2090 wrb = wrb_from_mccq(adapter); 2091 2091 if (!wrb) { ··· 2108 2108 } 2109 2109 2110 2110 err: 2111 - mutex_unlock(&adapter->mcc_lock); 2111 + spin_unlock_bh(&adapter->mcc_lock); 2112 2112 return status; 2113 2113 } 2114 2114 ··· 2189 2189 if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS)) 2190 2190 return 0; 2191 2191 2192 - mutex_lock(&adapter->mcc_lock); 2192 + spin_lock_bh(&adapter->mcc_lock); 2193 2193 2194 2194 wrb = wrb_from_mccq(adapter); 2195 2195 if (!wrb) { ··· 2214 2214 2215 2215 status = be_mcc_notify_wait(adapter); 2216 2216 err: 2217 - mutex_unlock(&adapter->mcc_lock); 2217 + spin_unlock_bh(&adapter->mcc_lock); 2218 2218 return status; 2219 2219 } 2220 2220 ··· 2226 2226 struct be_cmd_req_enable_disable_beacon *req; 2227 2227 int status; 2228 2228 2229 - mutex_lock(&adapter->mcc_lock); 2229 + spin_lock_bh(&adapter->mcc_lock); 2230 2230 2231 2231 wrb = wrb_from_mccq(adapter); 2232 2232 if (!wrb) { ··· 2247 2247 status = be_mcc_notify_wait(adapter); 2248 2248 2249 2249 err: 2250 - mutex_unlock(&adapter->mcc_lock); 2250 + spin_unlock_bh(&adapter->mcc_lock); 2251 2251 return status; 2252 2252 } 2253 2253 ··· 2258 2258 struct be_cmd_req_get_beacon_state *req; 2259 2259 int status; 2260 2260 2261 - mutex_lock(&adapter->mcc_lock); 2261 + spin_lock_bh(&adapter->mcc_lock); 2262 2262 2263 2263 wrb = wrb_from_mccq(adapter); 2264 2264 if (!wrb) { ··· 2282 2282 } 2283 2283 2284 2284 err: 2285 - mutex_unlock(&adapter->mcc_lock); 2285 + spin_unlock_bh(&adapter->mcc_lock); 2286 2286 return status; 2287 2287 } 2288 2288 ··· 2306 2306 return -ENOMEM; 2307 2307 } 2308 2308 2309 - mutex_lock(&adapter->mcc_lock); 2309 + spin_lock_bh(&adapter->mcc_lock); 2310 2310 2311 2311 wrb = wrb_from_mccq(adapter); 2312 2312 if (!wrb) { ··· 2328 2328 memcpy(data, resp->page_data + off, len); 2329 2329 } 2330 2330 err: 2331 - mutex_unlock(&adapter->mcc_lock); 2331 + spin_unlock_bh(&adapter->mcc_lock); 2332 2332 dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma); 2333 2333 return status; 2334 2334 } ··· 2345 2345 void *ctxt = NULL; 2346 2346 int status; 2347 2347 2348 - mutex_lock(&adapter->mcc_lock); 2348 + spin_lock_bh(&adapter->mcc_lock); 2349 2349 adapter->flash_status = 0; 2350 2350 2351 2351 wrb = wrb_from_mccq(adapter); ··· 2387 2387 if (status) 2388 2388 goto err_unlock; 2389 2389 2390 - mutex_unlock(&adapter->mcc_lock); 2390 + spin_unlock_bh(&adapter->mcc_lock); 2391 2391 2392 2392 if (!wait_for_completion_timeout(&adapter->et_cmd_compl, 2393 2393 msecs_to_jiffies(60000))) ··· 2406 2406 return status; 2407 2407 2408 2408 err_unlock: 2409 - mutex_unlock(&adapter->mcc_lock); 2409 + spin_unlock_bh(&adapter->mcc_lock); 2410 2410 return status; 2411 2411 } 2412 2412 ··· 2460 2460 struct be_mcc_wrb *wrb; 2461 2461 int status; 2462 2462 2463 - mutex_lock(&adapter->mcc_lock); 2463 + spin_lock_bh(&adapter->mcc_lock); 2464 2464 2465 2465 wrb = wrb_from_mccq(adapter); 2466 2466 if (!wrb) { ··· 2478 2478 2479 2479 status = be_mcc_notify_wait(adapter); 2480 2480 err: 2481 - mutex_unlock(&adapter->mcc_lock); 2481 + spin_unlock_bh(&adapter->mcc_lock); 2482 2482 return status; 2483 2483 } 2484 2484 ··· 2491 2491 struct lancer_cmd_resp_read_object *resp; 2492 2492 int status; 2493 2493 2494 - mutex_lock(&adapter->mcc_lock); 2494 + spin_lock_bh(&adapter->mcc_lock); 2495 2495 2496 2496 wrb = wrb_from_mccq(adapter); 2497 2497 if (!wrb) { ··· 2525 2525 } 2526 2526 2527 2527 err_unlock: 2528 - mutex_unlock(&adapter->mcc_lock); 2528 + spin_unlock_bh(&adapter->mcc_lock); 2529 2529 return status; 2530 2530 } 2531 2531 ··· 2537 2537 struct be_cmd_write_flashrom *req; 2538 2538 int status; 2539 2539 2540 - mutex_lock(&adapter->mcc_lock); 2540 + spin_lock_bh(&adapter->mcc_lock); 2541 2541 adapter->flash_status = 0; 2542 2542 2543 2543 wrb = wrb_from_mccq(adapter); ··· 2562 2562 if (status) 2563 2563 goto err_unlock; 2564 2564 2565 - mutex_unlock(&adapter->mcc_lock); 2565 + spin_unlock_bh(&adapter->mcc_lock); 2566 2566 2567 2567 if (!wait_for_completion_timeout(&adapter->et_cmd_compl, 2568 2568 msecs_to_jiffies(40000))) ··· 2573 2573 return status; 2574 2574 2575 2575 err_unlock: 2576 - mutex_unlock(&adapter->mcc_lock); 2576 + spin_unlock_bh(&adapter->mcc_lock); 2577 2577 return status; 2578 2578 } 2579 2579 ··· 2584 2584 struct be_mcc_wrb *wrb; 2585 2585 int status; 2586 2586 2587 - mutex_lock(&adapter->mcc_lock); 2587 + spin_lock_bh(&adapter->mcc_lock); 2588 2588 2589 2589 wrb = wrb_from_mccq(adapter); 2590 2590 if (!wrb) { ··· 2611 2611 memcpy(flashed_crc, req->crc, 4); 2612 2612 2613 2613 err: 2614 - mutex_unlock(&adapter->mcc_lock); 2614 + spin_unlock_bh(&adapter->mcc_lock); 2615 2615 return status; 2616 2616 } 2617 2617 ··· 3217 3217 struct be_cmd_req_acpi_wol_magic_config *req; 3218 3218 int status; 3219 3219 3220 - mutex_lock(&adapter->mcc_lock); 3220 + spin_lock_bh(&adapter->mcc_lock); 3221 3221 3222 3222 wrb = wrb_from_mccq(adapter); 3223 3223 if (!wrb) { ··· 3234 3234 status = be_mcc_notify_wait(adapter); 3235 3235 3236 3236 err: 3237 - mutex_unlock(&adapter->mcc_lock); 3237 + spin_unlock_bh(&adapter->mcc_lock); 3238 3238 return status; 3239 3239 } 3240 3240 ··· 3249 3249 CMD_SUBSYSTEM_LOWLEVEL)) 3250 3250 return -EPERM; 3251 3251 3252 - mutex_lock(&adapter->mcc_lock); 3252 + spin_lock_bh(&adapter->mcc_lock); 3253 3253 3254 3254 wrb = wrb_from_mccq(adapter); 3255 3255 if (!wrb) { ··· 3272 3272 if (status) 3273 3273 goto err_unlock; 3274 3274 3275 - mutex_unlock(&adapter->mcc_lock); 3275 + spin_unlock_bh(&adapter->mcc_lock); 3276 3276 3277 3277 if (!wait_for_completion_timeout(&adapter->et_cmd_compl, 3278 3278 msecs_to_jiffies(SET_LB_MODE_TIMEOUT))) ··· 3281 3281 return status; 3282 3282 3283 3283 err_unlock: 3284 - mutex_unlock(&adapter->mcc_lock); 3284 + spin_unlock_bh(&adapter->mcc_lock); 3285 3285 return status; 3286 3286 } 3287 3287 ··· 3298 3298 CMD_SUBSYSTEM_LOWLEVEL)) 3299 3299 return -EPERM; 3300 3300 3301 - mutex_lock(&adapter->mcc_lock); 3301 + spin_lock_bh(&adapter->mcc_lock); 3302 3302 3303 3303 wrb = wrb_from_mccq(adapter); 3304 3304 if (!wrb) { ··· 3324 3324 if (status) 3325 3325 goto err; 3326 3326 3327 - mutex_unlock(&adapter->mcc_lock); 3327 + spin_unlock_bh(&adapter->mcc_lock); 3328 3328 3329 3329 wait_for_completion(&adapter->et_cmd_compl); 3330 3330 resp = embedded_payload(wrb); ··· 3332 3332 3333 3333 return status; 3334 3334 err: 3335 - mutex_unlock(&adapter->mcc_lock); 3335 + spin_unlock_bh(&adapter->mcc_lock); 3336 3336 return status; 3337 3337 } 3338 3338 ··· 3348 3348 CMD_SUBSYSTEM_LOWLEVEL)) 3349 3349 return -EPERM; 3350 3350 3351 - mutex_lock(&adapter->mcc_lock); 3351 + spin_lock_bh(&adapter->mcc_lock); 3352 3352 3353 3353 wrb = wrb_from_mccq(adapter); 3354 3354 if (!wrb) { ··· 3382 3382 } 3383 3383 3384 3384 err: 3385 - mutex_unlock(&adapter->mcc_lock); 3385 + spin_unlock_bh(&adapter->mcc_lock); 3386 3386 return status; 3387 3387 } 3388 3388 ··· 3393 3393 struct be_cmd_req_seeprom_read *req; 3394 3394 int status; 3395 3395 3396 - mutex_lock(&adapter->mcc_lock); 3396 + spin_lock_bh(&adapter->mcc_lock); 3397 3397 3398 3398 wrb = wrb_from_mccq(adapter); 3399 3399 if (!wrb) { ··· 3409 3409 status = be_mcc_notify_wait(adapter); 3410 3410 3411 3411 err: 3412 - mutex_unlock(&adapter->mcc_lock); 3412 + spin_unlock_bh(&adapter->mcc_lock); 3413 3413 return status; 3414 3414 } 3415 3415 ··· 3424 3424 CMD_SUBSYSTEM_COMMON)) 3425 3425 return -EPERM; 3426 3426 3427 - mutex_lock(&adapter->mcc_lock); 3427 + spin_lock_bh(&adapter->mcc_lock); 3428 3428 3429 3429 wrb = wrb_from_mccq(adapter); 3430 3430 if (!wrb) { ··· 3469 3469 } 3470 3470 dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma); 3471 3471 err: 3472 - mutex_unlock(&adapter->mcc_lock); 3472 + spin_unlock_bh(&adapter->mcc_lock); 3473 3473 return status; 3474 3474 } 3475 3475 ··· 3479 3479 struct be_cmd_req_set_qos *req; 3480 3480 int status; 3481 3481 3482 - mutex_lock(&adapter->mcc_lock); 3482 + spin_lock_bh(&adapter->mcc_lock); 3483 3483 3484 3484 wrb = wrb_from_mccq(adapter); 3485 3485 if (!wrb) { ··· 3499 3499 status = be_mcc_notify_wait(adapter); 3500 3500 3501 3501 err: 3502 - mutex_unlock(&adapter->mcc_lock); 3502 + spin_unlock_bh(&adapter->mcc_lock); 3503 3503 return status; 3504 3504 } 3505 3505 ··· 3611 3611 struct be_cmd_req_get_fn_privileges *req; 3612 3612 int status; 3613 3613 3614 - mutex_lock(&adapter->mcc_lock); 3614 + spin_lock_bh(&adapter->mcc_lock); 3615 3615 3616 3616 wrb = wrb_from_mccq(adapter); 3617 3617 if (!wrb) { ··· 3643 3643 } 3644 3644 3645 3645 err: 3646 - mutex_unlock(&adapter->mcc_lock); 3646 + spin_unlock_bh(&adapter->mcc_lock); 3647 3647 return status; 3648 3648 } 3649 3649 ··· 3655 3655 struct be_cmd_req_set_fn_privileges *req; 3656 3656 int status; 3657 3657 3658 - mutex_lock(&adapter->mcc_lock); 3658 + spin_lock_bh(&adapter->mcc_lock); 3659 3659 3660 3660 wrb = wrb_from_mccq(adapter); 3661 3661 if (!wrb) { ··· 3675 3675 3676 3676 status = be_mcc_notify_wait(adapter); 3677 3677 err: 3678 - mutex_unlock(&adapter->mcc_lock); 3678 + spin_unlock_bh(&adapter->mcc_lock); 3679 3679 return status; 3680 3680 } 3681 3681 ··· 3707 3707 return -ENOMEM; 3708 3708 } 3709 3709 3710 - mutex_lock(&adapter->mcc_lock); 3710 + spin_lock_bh(&adapter->mcc_lock); 3711 3711 3712 3712 wrb = wrb_from_mccq(adapter); 3713 3713 if (!wrb) { ··· 3771 3771 } 3772 3772 3773 3773 out: 3774 - mutex_unlock(&adapter->mcc_lock); 3774 + spin_unlock_bh(&adapter->mcc_lock); 3775 3775 dma_free_coherent(&adapter->pdev->dev, get_mac_list_cmd.size, 3776 3776 get_mac_list_cmd.va, get_mac_list_cmd.dma); 3777 3777 return status; ··· 3831 3831 if (!cmd.va) 3832 3832 return -ENOMEM; 3833 3833 3834 - mutex_lock(&adapter->mcc_lock); 3834 + spin_lock_bh(&adapter->mcc_lock); 3835 3835 3836 3836 wrb = wrb_from_mccq(adapter); 3837 3837 if (!wrb) { ··· 3853 3853 3854 3854 err: 3855 3855 dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma); 3856 - mutex_unlock(&adapter->mcc_lock); 3856 + spin_unlock_bh(&adapter->mcc_lock); 3857 3857 return status; 3858 3858 } 3859 3859 ··· 3889 3889 CMD_SUBSYSTEM_COMMON)) 3890 3890 return -EPERM; 3891 3891 3892 - mutex_lock(&adapter->mcc_lock); 3892 + spin_lock_bh(&adapter->mcc_lock); 3893 3893 3894 3894 wrb = wrb_from_mccq(adapter); 3895 3895 if (!wrb) { ··· 3930 3930 status = be_mcc_notify_wait(adapter); 3931 3931 3932 3932 err: 3933 - mutex_unlock(&adapter->mcc_lock); 3933 + spin_unlock_bh(&adapter->mcc_lock); 3934 3934 return status; 3935 3935 } 3936 3936 ··· 3944 3944 int status; 3945 3945 u16 vid; 3946 3946 3947 - mutex_lock(&adapter->mcc_lock); 3947 + spin_lock_bh(&adapter->mcc_lock); 3948 3948 3949 3949 wrb = wrb_from_mccq(adapter); 3950 3950 if (!wrb) { ··· 3991 3991 } 3992 3992 3993 3993 err: 3994 - mutex_unlock(&adapter->mcc_lock); 3994 + spin_unlock_bh(&adapter->mcc_lock); 3995 3995 return status; 3996 3996 } 3997 3997 ··· 4190 4190 struct be_cmd_req_set_ext_fat_caps *req; 4191 4191 int status; 4192 4192 4193 - mutex_lock(&adapter->mcc_lock); 4193 + spin_lock_bh(&adapter->mcc_lock); 4194 4194 4195 4195 wrb = wrb_from_mccq(adapter); 4196 4196 if (!wrb) { ··· 4206 4206 4207 4207 status = be_mcc_notify_wait(adapter); 4208 4208 err: 4209 - mutex_unlock(&adapter->mcc_lock); 4209 + spin_unlock_bh(&adapter->mcc_lock); 4210 4210 return status; 4211 4211 } 4212 4212 ··· 4684 4684 if (iface == 0xFFFFFFFF) 4685 4685 return -1; 4686 4686 4687 - mutex_lock(&adapter->mcc_lock); 4687 + spin_lock_bh(&adapter->mcc_lock); 4688 4688 4689 4689 wrb = wrb_from_mccq(adapter); 4690 4690 if (!wrb) { ··· 4701 4701 4702 4702 status = be_mcc_notify_wait(adapter); 4703 4703 err: 4704 - mutex_unlock(&adapter->mcc_lock); 4704 + spin_unlock_bh(&adapter->mcc_lock); 4705 4705 return status; 4706 4706 } 4707 4707 ··· 4735 4735 struct be_cmd_resp_get_iface_list *resp; 4736 4736 int status; 4737 4737 4738 - mutex_lock(&adapter->mcc_lock); 4738 + spin_lock_bh(&adapter->mcc_lock); 4739 4739 4740 4740 wrb = wrb_from_mccq(adapter); 4741 4741 if (!wrb) { ··· 4756 4756 } 4757 4757 4758 4758 err: 4759 - mutex_unlock(&adapter->mcc_lock); 4759 + spin_unlock_bh(&adapter->mcc_lock); 4760 4760 return status; 4761 4761 } 4762 4762 ··· 4850 4850 if (BEx_chip(adapter)) 4851 4851 return 0; 4852 4852 4853 - mutex_lock(&adapter->mcc_lock); 4853 + spin_lock_bh(&adapter->mcc_lock); 4854 4854 4855 4855 wrb = wrb_from_mccq(adapter); 4856 4856 if (!wrb) { ··· 4868 4868 req->enable = 1; 4869 4869 status = be_mcc_notify_wait(adapter); 4870 4870 err: 4871 - mutex_unlock(&adapter->mcc_lock); 4871 + spin_unlock_bh(&adapter->mcc_lock); 4872 4872 return status; 4873 4873 } 4874 4874 ··· 4941 4941 u32 link_config = 0; 4942 4942 int status; 4943 4943 4944 - mutex_lock(&adapter->mcc_lock); 4944 + spin_lock_bh(&adapter->mcc_lock); 4945 4945 4946 4946 wrb = wrb_from_mccq(adapter); 4947 4947 if (!wrb) { ··· 4969 4969 4970 4970 status = be_mcc_notify_wait(adapter); 4971 4971 err: 4972 - mutex_unlock(&adapter->mcc_lock); 4972 + spin_unlock_bh(&adapter->mcc_lock); 4973 4973 return status; 4974 4974 } 4975 4975 ··· 5000 5000 struct be_mcc_wrb *wrb; 5001 5001 int status; 5002 5002 5003 - if (mutex_lock_interruptible(&adapter->mcc_lock)) 5004 - return -1; 5003 + spin_lock_bh(&adapter->mcc_lock); 5005 5004 5006 5005 wrb = wrb_from_mccq(adapter); 5007 5006 if (!wrb) { ··· 5038 5039 dev_info(&adapter->pdev->dev, 5039 5040 "Adapter does not support HW error recovery\n"); 5040 5041 5041 - mutex_unlock(&adapter->mcc_lock); 5042 + spin_unlock_bh(&adapter->mcc_lock); 5042 5043 return status; 5043 5044 } 5044 5045 ··· 5052 5053 struct be_cmd_resp_hdr *resp; 5053 5054 int status; 5054 5055 5055 - mutex_lock(&adapter->mcc_lock); 5056 + spin_lock_bh(&adapter->mcc_lock); 5056 5057 5057 5058 wrb = wrb_from_mccq(adapter); 5058 5059 if (!wrb) { ··· 5075 5076 memcpy(wrb_payload, resp, sizeof(*resp) + resp->response_length); 5076 5077 be_dws_le_to_cpu(wrb_payload, sizeof(*resp) + resp->response_length); 5077 5078 err: 5078 - mutex_unlock(&adapter->mcc_lock); 5079 + spin_unlock_bh(&adapter->mcc_lock); 5079 5080 return status; 5080 5081 } 5081 5082 EXPORT_SYMBOL(be_roce_mcc_cmd);
+1 -1
drivers/net/ethernet/emulex/benet/be_main.c
··· 5667 5667 } 5668 5668 5669 5669 mutex_init(&adapter->mbox_lock); 5670 - mutex_init(&adapter->mcc_lock); 5671 5670 mutex_init(&adapter->rx_filter_lock); 5671 + spin_lock_init(&adapter->mcc_lock); 5672 5672 spin_lock_init(&adapter->mcc_cq_lock); 5673 5673 init_completion(&adapter->et_cmd_compl); 5674 5674