diff options
author | Mark Brown <broonie@linaro.org> | 2013-12-31 12:59:55 +0000 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-12-31 12:59:55 +0000 |
commit | 68066bb378a0504439e046cdb55d88362eb6379d (patch) | |
tree | 0b60f72ddf7108a63dd4db617b42e07fbae5346d /drivers/infiniband/core/iwcm.c | |
parent | 43f627ac9de42607b2cdcc7a41f2bcc82187e06a (diff) | |
parent | 802eee95bde72fd0cd0f3a5b2098375a487d1eda (diff) |
Merge tag 'v3.13-rc6' into spi-dw
To resolve trivial overlaps with fixes.
Linux 3.13-rc6
Diffstat (limited to 'drivers/infiniband/core/iwcm.c')
-rw-r--r-- | drivers/infiniband/core/iwcm.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c index c47c2034ca7..0717940ec3b 100644 --- a/drivers/infiniband/core/iwcm.c +++ b/drivers/infiniband/core/iwcm.c @@ -181,9 +181,16 @@ static void add_ref(struct iw_cm_id *cm_id) static void rem_ref(struct iw_cm_id *cm_id) { struct iwcm_id_private *cm_id_priv; + int cb_destroy; + cm_id_priv = container_of(cm_id, struct iwcm_id_private, id); - if (iwcm_deref_id(cm_id_priv) && - test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags)) { + + /* + * Test bit before deref in case the cm_id gets freed on another + * thread. + */ + cb_destroy = test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags); + if (iwcm_deref_id(cm_id_priv) && cb_destroy) { BUG_ON(!list_empty(&cm_id_priv->work_list)); free_cm_id(cm_id_priv); } |