lkml.org 
[lkml]   [2011]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[11/78] IB/cm: Bump reference count on cm_id before invoking callback
    2.6.38-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Sean Hefty <sean.hefty@intel.com>

    commit 29963437a48475036353b95ab142bf199adb909e upstream.

    When processing a SIDR REQ, the ib_cm allocates a new cm_id. The
    refcount of the cm_id is initialized to 1. However, cm_process_work
    will decrement the refcount after invoking all callbacks. The result
    is that the cm_id will end up with refcount set to 0 by the end of the
    sidr req handler.

    If a user tries to destroy the cm_id, the destruction will proceed,
    under the incorrect assumption that no other threads are referencing
    the cm_id. This can lead to a crash when the cm callback thread tries
    to access the cm_id.

    This problem was noticed as part of a larger investigation with kernel
    crashes in the rdma_cm when running on a real time OS.

    Signed-off-by: Sean Hefty <sean.hefty@intel.com>
    Acked-by: Doug Ledford <dledford@redhat.com>
    Signed-off-by: Roland Dreier <roland@purestorage.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/infiniband/core/cm.c | 1 +
    1 file changed, 1 insertion(+)

    --- a/drivers/infiniband/core/cm.c
    +++ b/drivers/infiniband/core/cm.c
    @@ -2989,6 +2989,7 @@ static int cm_sidr_req_handler(struct cm
    goto out; /* No match. */
    }
    atomic_inc(&cur_cm_id_priv->refcount);
    + atomic_inc(&cm_id_priv->refcount);
    spin_unlock_irq(&cm.lock);

    cm_id_priv->id.cm_handler = cur_cm_id_priv->id.cm_handler;



    \
     
     \ /
      Last update: 2011-03-22 00:35    [W:0.021 / U:91.280 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site