1. 13 Dec, 2014 17 commits
    • Sagi Grimberg's avatar
      iser-target: Remove an atomic operation from the IO path · bdf20e72
      Sagi Grimberg authored
      In order to know that we consumed all the connection completions
      we maintain atomic post_send_buf_count for each IO post send. But
      we can know that if we post a "beacon" (zero length RECV work request)
      after we move the QP into error state and the target does not serve
      any new IO. When we consume it, we know we finished all the connection
      completion and we can go ahead and destroy stuff.
      
      In error completion handler we now just need to check for ISERT_BEACON_WRID
      to arrive and then wait for session commands to cleanup and complete
      conn_wait_comp_err.
      
      We reserve another CQ and QP entries to fit the zero length post recv.
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      bdf20e72
    • Sagi Grimberg's avatar
      iser-target: Remove redundant call to isert_conn_terminate · 377d8f5c
      Sagi Grimberg authored
      We are calling session reinstatement, wait_conn will start
      connection termination.
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      377d8f5c
    • Sagi Grimberg's avatar
      iser-target: Use single CQ for TX and RX · 6f0fae3d
      Sagi Grimberg authored
      Using TX and RX CQs attached to the same vector might
      create a throttling effect coming from the serial processing
      of a work-queue. Use one CQ instead, it will do better in interrupt
      processing and it provides a simpler code. Also, We get rid of
      redundant isert_rx_wq.
      
      Next we can remove the atomic post_send_buf_count from the IO path.
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      6f0fae3d
    • Sagi Grimberg's avatar
      iser-target: Centralize completion elements to a context · 4a295bae
      Sagi Grimberg authored
      A pre-step before going to a single CQ.
      Also this makes the code a little more simple to
      read.
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      4a295bae
    • Sagi Grimberg's avatar
      iser-target: Cast wr_id with uintptr_t instead of unsinged long · b0a191e7
      Sagi Grimberg authored
      Nit, uintptr_t is designed for pointer casting, use it.
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      b0a191e7
    • Sagi Grimberg's avatar
      iser-target: Unite error completion handler for RX and TX · df43debd
      Sagi Grimberg authored
      As a pre-step to a single CQ, we unite the error completion
      handlers to a single handler.
      
      This patch does not change any functionality.
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      df43debd
    • Sagi Grimberg's avatar
      iser-target: Remove interrupt coalescing · 68a86dee
      Sagi Grimberg authored
      It is disabled at the moment, we will get that back
      in once the target is more stable.
      
      This reverts commit 95b60f07
      "Add support for completion interrupt coalescing"
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      68a86dee
    • Sagi Grimberg's avatar
      iser-target: Work-around live target stack shutdown resource cleanup · 268e6811
      Sagi Grimberg authored
      Currently we have no way to tell that the target stack is in shutdown
      sequence. In case we have open connections, the initiator immediately
      attempts to reconnect in a DDOS attack style, so we may end up
      terminating the iser enabled network portal while it's np_accept_list
      still have pending connections.
      
      The workaround is simply release all the connections in the list.
      A proper fix will be to start shutdown sequence by shutting the
      network portal to avoid initiator immediate reconnect attempts.
      
      But the temporary work around seems to work at this point, so I think
      we can do this for now...
      Reported-by: default avatarSlava Shwartsman <valyushash@gmail.com>
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      268e6811
    • Sagi Grimberg's avatar
      iscsi,iser-target: Expose supported protection ops according to t10_pi · 23a548ee
      Sagi Grimberg authored
      iSER will report supported protection operations based on
      the tpg attribute t10_pi settings and HCA PI offload capabilities.
      If the HCA does not support PI offload or tpg attribute t10_pi is
      not set, we fall to SW PI mode.
      
      In order to do that, we move iscsit_get_sup_prot_ops after connection
      tpg assignment.
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Cc: <stable@vger.kernel.org> # v3.14+
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      23a548ee
    • Sagi Grimberg's avatar
      iser-target: Fix NULL dereference in SW mode DIF · 302cc7c3
      Sagi Grimberg authored
      Fallback to software mode DIF if HCA does not support
      PI (without crashing obviously). It is still possible to
      run with backend protection and an unprotected frontend,
      so looking at the command prot_op is not enough. Check
      device PI capability on a per-IO basis (isert_prot_cmd
      inline static) to determine if we need to handle protection
      information.
      
      Trace:
      BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
      IP: [<ffffffffa037f8b1>] isert_reg_sig_mr+0x351/0x3b0 [ib_isert]
      Call Trace:
       [<ffffffff812b003a>] ? swiotlb_map_sg_attrs+0x7a/0x130
       [<ffffffffa038184d>] isert_reg_rdma+0x2fd/0x370 [ib_isert]
       [<ffffffff8108f2ec>] ? idle_balance+0x6c/0x2c0
       [<ffffffffa0382b68>] isert_put_datain+0x68/0x210 [ib_isert]
       [<ffffffffa02acf5b>] lio_queue_data_in+0x2b/0x30 [iscsi_target_mod]
       [<ffffffffa02306eb>] target_complete_ok_work+0x21b/0x310 [target_core_mod]
       [<ffffffff8106ece2>] process_one_work+0x182/0x3b0
       [<ffffffff8106fda0>] worker_thread+0x120/0x3c0
       [<ffffffff8106fc80>] ? maybe_create_worker+0x190/0x190
       [<ffffffff8107594e>] kthread+0xce/0xf0
       [<ffffffff81075880>] ? kthread_freezable_should_stop+0x70/0x70
       [<ffffffff8159a22c>] ret_from_fork+0x7c/0xb0
       [<ffffffff81075880>] ? kthread_freezable_should_stop+0x70/0x70
      Reported-by: default avatarSlava Shwartsman <valyushash@gmail.com>
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Cc: <stable@vger.kernel.org> # v3.14+
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      302cc7c3
    • Sagi Grimberg's avatar
      iser-target: Allocate PI contexts dynamically · 570db170
      Sagi Grimberg authored
      This patch converts to allocate PI contexts dynamically in order
      avoid a potentially bogus np->tpg_np and associated NULL pointer
      dereference in isert_connect_request() during iser-target endpoint
      shutdown with multiple network portals.
      
      Also, there is really no need to allocate these at connection
      establishment since it is not guaranteed that all the IOs on
      that connection will be to a PI formatted device.
      
      We can do it in a lazy fashion so the initial burst will have a
      transient slow down, but very fast all IOs will allocate a PI
      context.
      
      Squashed:
      
      iser-target: Centralize PI context handling code
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Cc: <stable@vger.kernel.org> # v3.14+
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      570db170
    • Sagi Grimberg's avatar
      iser-target: Fix implicit termination of connections · b02efbfc
      Sagi Grimberg authored
      In situations such as bond failover, The new session establishment
      implicitly invokes the termination of the old connection.
      
      So, we don't want to wait for the old connection wait_conn to completely
      terminate before we accept the new connection and post a login response.
      
      The solution is to deffer the comp_wait completion and the conn_put to
      a work so wait_conn will effectively be non-blocking (flush errors are
      assumed to come very fast).
      
      We allocate isert_release_wq with WQ_UNBOUND and WQ_UNBOUND_MAX_ACTIVE
      to spread the concurrency of release works.
      Reported-by: default avatarSlava Shwartsman <valyushash@gmail.com>
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Cc: <stable@vger.kernel.org> # v3.10+
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      b02efbfc
    • Sagi Grimberg's avatar
      iser-target: Handle ADDR_CHANGE event for listener cm_id · ca6c1d82
      Sagi Grimberg authored
      The np listener cm_id will also get ADDR_CHANGE event
      upcall (in case it is bound to a specific IP). Handle
      it correctly by creating a new cm_id and implicitly
      destroy the old one.
      
      Since this is the second event a listener np cm_id may
      encounter, we move the np cm_id event handling to a
      routine.
      
      Squashed:
      
      iser-target: Move cma_id setup to a function
      Reported-by: default avatarSlava Shwartsman <valyushash@gmail.com>
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Cc: <stable@vger.kernel.org> # v3.10+
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      ca6c1d82
    • Sagi Grimberg's avatar
      iser-target: Fix connected_handler + teardown flow race · 19e2090f
      Sagi Grimberg authored
      Take isert_conn pointer from cm_id->qp->qp_context. This
      will allow us to know that the cm_id context is always
      the network portal. This will make the cm_id event check
      (connection or network portal) more reliable.
      
      In order to avoid a NULL dereference in cma_id->qp->qp_context
      we destroy the qp after we destroy the cm_id (and make the
      dereference safe). session stablishment/teardown sequences
      can happen in parallel, we should take into account that
      connected_handler might race with connection teardown flow.
      
      Also, protect isert_conn->conn_device->active_qps decrement
      within the error patch during QP creation failure and the
      normal teardown path in isert_connect_release().
      
      Squashed:
      
      iser-target: Decrement completion context active_qps in error flow
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Cc: <stable@vger.kernel.org> # v3.10+
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      19e2090f
    • Sagi Grimberg's avatar
      iser-target: Parallelize CM connection establishment · 2371e5da
      Sagi Grimberg authored
      There is no point in accepting a new CM request only
      when we are completely done with the last iscsi login.
      Instead we accept immediately, this will also cause the
      CM connection to reach connected state and the initiator
      is allowed to send the first login. We mark that we got
      the initial login and let iscsi layer pick it up when it
      gets there.
      
      This reduces the parallel login sequence by a factor of
      more then 4 (and more for multi-login) and also prevents
      the initiator (who does all logins in parallel) from
      giving up on login timeout expiration.
      
      In order to support multiple login requests sequence (CHAP)
      we call isert_rx_login_req from isert_rx_completion insead
      of letting isert_get_login_rx call it.
      
      Squashed:
      
      iser-target: Use kref_get_unless_zero in connected_handler
      iser-target: Acquire conn_mutex when changing connection state
      iser-target: Reject connect request in failure path
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Cc: <stable@vger.kernel.org> # v3.10+
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      2371e5da
    • Sagi Grimberg's avatar
      iser-target: Fix flush + disconnect completion handling · 128e9cc8
      Sagi Grimberg authored
      ISER_CONN_UP state is not sufficient to know if
      we should wait for completion of flush errors and
      disconnected_handler event.
      
      Instead, split it to 2 states:
      - ISER_CONN_UP: Got to CM connected phase, This state
      indicates that we need to wait for a CM disconnect
      event before going to teardown.
      
      - ISER_CONN_FULL_FEATURE: Got to full feature phase
      after we posted login response, This state indicates
      that we posted recv buffers and we need to wait for
      flush completions before going to teardown.
      
      Also avoid deffering disconnected handler to a work,
      and handle it within disconnected handler.
      More work here is needed to handle DEVICE_REMOVAL event
      correctly (cleanup all resources).
      
      Squashed:
      
      iser-target: Don't deffer disconnected handler to a work
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Cc: <stable@vger.kernel.org> # v3.10+
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      128e9cc8
    • Sagi Grimberg's avatar
      iscsi,iser-target: Initiate termination only once · 954f2372
      Sagi Grimberg authored
      Since commit 0fc4ea70 ("Target/iser: Don't put isert_conn inside
      disconnected handler") we put the conn kref in isert_wait_conn, so we
      need .wait_conn to be invoked also in the error path.
      
      Introduce call to isert_conn_terminate (called under lock)
      which transitions the connection state to TERMINATING and calls
      rdma_disconnect. If the state is already teminating, just bail
      out back (temination started).
      
      Also, make sure to destroy the connection when getting a connect
      error event if didn't get to connected (state UP). Same for the
      handling of REJECTED and UNREACHABLE cma events.
      
      Squashed:
      
      iscsi-target: Add call to wait_conn in establishment error flow
      Reported-by: default avatarSlava Shwartsman <valyushash@gmail.com>
      Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
      Cc: <stable@vger.kernel.org> # v3.10+
      Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
      954f2372
  2. 02 Dec, 2014 21 commits
  3. 20 Nov, 2014 1 commit
  4. 03 Nov, 2014 1 commit