lkml.org 
[lkml]   [2015]   [Sep]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16.y-ckt 008/130] iscsi-target: Fix iser explicit logout TX kthread leak
    Date
    3.16.7-ckt17 -stable review patch.  If anyone has any objections, please let me know.

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

    From: Nicholas Bellinger <nab@linux-iscsi.org>

    commit 007d038bdf95ccfe2491d0078be54040d110fd06 upstream.

    This patch fixes a regression introduced with the following commit
    in v4.0-rc1 code, where an explicit iser-target logout would result
    in ->tx_thread_active being incorrectly cleared by the logout post
    handler, and subsequent TX kthread leak:

    commit 88dcd2dab5c23b1c9cfc396246d8f476c872f0ca
    Author: Nicholas Bellinger <nab@linux-iscsi.org>
    Date: Thu Feb 26 22:19:15 2015 -0800

    iscsi-target: Convert iscsi_thread_set usage to kthread.h

    To address this bug, change iscsit_logout_post_handler_closesession()
    and iscsit_logout_post_handler_samecid() to only cmpxchg() on
    ->tx_thread_active for traditional iscsi/tcp connections.

    This is required because iscsi/tcp connections are invoking logout
    post handler logic directly from TX kthread context, while iser
    connections are invoking logout post handler logic from a seperate
    workqueue context.

    Cc: Sagi Grimberg <sagig@mellanox.com>
    Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    drivers/target/iscsi/iscsi_target.c | 18 ++++++++++++++++--
    1 file changed, 16 insertions(+), 2 deletions(-)

    diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
    index cc401d217406..ce87bdcb1843 100644
    --- a/drivers/target/iscsi/iscsi_target.c
    +++ b/drivers/target/iscsi/iscsi_target.c
    @@ -4515,7 +4515,18 @@ static void iscsit_logout_post_handler_closesession(
    struct iscsi_conn *conn)
    {
    struct iscsi_session *sess = conn->sess;
    - int sleep = cmpxchg(&conn->tx_thread_active, true, false);
    + int sleep = 1;
    + /*
    + * Traditional iscsi/tcp will invoke this logic from TX thread
    + * context during session logout, so clear tx_thread_active and
    + * sleep if iscsit_close_connection() has not already occured.
    + *
    + * Since iser-target invokes this logic from it's own workqueue,
    + * always sleep waiting for RX/TX thread shutdown to complete
    + * within iscsit_close_connection().
    + */
    + if (conn->conn_transport->transport_type == ISCSI_TCP)
    + sleep = cmpxchg(&conn->tx_thread_active, true, false);

    atomic_set(&conn->conn_logout_remove, 0);
    complete(&conn->conn_logout_comp);
    @@ -4529,7 +4540,10 @@ static void iscsit_logout_post_handler_closesession(
    static void iscsit_logout_post_handler_samecid(
    struct iscsi_conn *conn)
    {
    - int sleep = cmpxchg(&conn->tx_thread_active, true, false);
    + int sleep = 1;
    +
    + if (conn->conn_transport->transport_type == ISCSI_TCP)
    + sleep = cmpxchg(&conn->tx_thread_active, true, false);

    atomic_set(&conn->conn_logout_remove, 0);
    complete(&conn->conn_logout_comp);

    \
     
     \ /
      Last update: 2015-09-04 15:21    [W:4.227 / U:0.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site