[lkml]   [2011]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    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 <>

    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 <>
    Acked-by: Doug Ledford <>
    Signed-off-by: Roland Dreier <>
    Signed-off-by: Greg Kroah-Hartman <>

    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(&cm_id_priv->refcount);

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

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