• [PATCH v3 13/19] thunderbolt: Use spinlock in NHI serialization

    From Mika Westerberg@21:1/5 to All on Mon Oct 2 12:50:01 2017
    This is needed because ring polling functionality can be called from
    atomic contexts when networking and other high-speed traffic is
    transferred over a Thunderbolt cable.

    Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
    Reviewed-by: Michael Jamet <michael.jamet@intel.com>
    Reviewed-by: Yehezkel Bernat <yehezkel.bernat@intel.com>
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    ---
    drivers/thunderbolt/nhi.c | 75 +++++++++++++++++++++++++--------------------
    include/linux/thunderbolt.h | 2 +-
    2 files changed, 42 insertions(+), 35 deletions(-)

    diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
    index 7d1891ec3c47..0b3c0640048b 100644
    --- a/drivers/thunderbolt/nhi.c
    +++ b/drivers/thunderbolt/nhi.c
    @@ -327,21 +327,9 @@ static struct tb_ring *tb_ring_alloc(struct tb_nhi *nhi, u32 hop, int size,
    if (transmit && hop == RING_E2E_UNUSED_HOPID)
    return NULL;

    - mutex_lock(&nhi->lock);
    - if (hop >= nhi->hop_count) {
    - dev_WARN(&nhi->pdev->dev, "invalid hop: %d\n", hop);
    - goto err;
    - }
    - if (transmit && nhi->tx_rings[hop]) {
    - dev_WARN(&nhi->pdev->dev, "TX hop %d already allocated\n", hop);
    - goto err;
    - } else if (!transmit && nhi->rx_rings[hop]) {
    - dev_WARN(&nhi->pdev->dev, "RX hop %d already allocated\n", hop);
    - goto err;
    - }
    ring = kzalloc(sizeof(*ring), GFP_KERNEL);
    if (!ring)
    - goto err;
    + return NULL;

    spin_lock_ini