1. 11 Apr, 2010 2 commits
    • Joe Eykholt's avatar
      [SCSI] libfc: fix hton24 macro to take expressions as args · 0b2f74a4
      Joe Eykholt authored
      hton24(p + 3, value) would fail to compile because
      p + 3[0] is not a valid expression.
      Went ahead and converted hton24 and ntoh24 to inline
      functions, which is better because the parameters
      are evalutated only once.
      Signed-off-by: default avatarJoe Eykholt <jeykholt@cisco.com>
      Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    • Joe Eykholt's avatar
      [SCSI] libfc, libfcoe, fcoe: use smp_processor_id() only when preempt disabled · f018b73a
      Joe Eykholt authored
      When the kernel is configured for preemption, using smp_processor_id()
      when preemption is enabled causes a warning backtrace and is wrong
      since we could move off of that CPU as soon as we get the ID,
      and we would be referencing the wrong CPU, and possibly an invalid one
      if it could be hotswapped out.
      Remove the fc_lport_get_stats() function and explicitly use per_cpu_ptr()
      to get the statistics.  Where preemption has been disabled by holding
      a _bh lock continue to use smp_processor_id(), but otherwise use
      In fcoe_recv_frame() also changed the cases where we return in the
      middle to do a goto to the code which bumps ErrorFrames and does
      a put_cpu().  Two of these cases didn't bump ErrorFrames before, but
      doing so is harmless because they "can't happen", due to prior length
      Also rearranged code in fcoe_recv_frame() to have only one call to
      fc_exch_recv().  It's just as efficient and saves a call to put_cpu().
      In fc_fcp.c, adjusted a FIXME comment for code which doesn't need fixing.
      Signed-off-by: default avatarJoe Eykholt <jeykholt@cisco.com>
      Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
  2. 04 Dec, 2009 20 commits
  3. 10 Sep, 2009 15 commits
  4. 05 Sep, 2009 2 commits
    • Vasu Dev's avatar
      [SCSI] fcoe, libfc: fully makes use of per cpu exch pool and then removes em_lock · b2f0091f
      Vasu Dev authored
      1. Updates fcoe_rcv() to queue incoming frames to the fcoe per
         cpu thread on which this frame's exch was originated and simply
         use current cpu for request exch not originated by initiator.
         It is redundant to add this code under CONFIG_SMP, so removes
         CONFIG_SMP uses around this code.
      2. Updates fc_exch_em_alloc, fc_exch_delete, fc_exch_find to use
         per cpu exch pools, here fc_exch_delete is rename of older
         fc_exch_mgr_delete_ep since ep/exch are now deleted in pools
         of EM and so brief new name is sufficient and better name.
         Updates these functions to map exch id to their index into exch
         pool using fc_cpu_mask, fc_cpu_order and EM min_xid.
         This mapping is as per detailed explanation about this in
         last patch and basically this is just as lower fc_cpu_mask
         bits of exch id as cpu number and upper bit sum of EM min_xid
         and exch index in pool.
         Uses pool next_index to keep track of exch allocation from
         pool along with pool_max_index as upper bound of exches array
         in pool.
      3. Adds exch pool ptr to fc_exch to free exch to its pool in
      4. Updates fc_exch_mgr_reset to reset all exch pools of an EM,
         this required adding fc_exch_pool_reset func to reset exches
         in pool and then have fc_exch_mgr_reset call fc_exch_pool_reset
         for each pool within each EM for a lport.
      5. Removes no longer needed exches array, em_lock, next_xid, and
         total_exches from struct fc_exch_mgr, these are not needed after
         use of per cpu exch pool, also removes not used max_read,
         last_read from struct fc_exch_mgr.
      6. Updates locking notes for exch pool lock with fc_exch lock and
         uses pool lock in exch allocation, lookup and reset.
      Signed-off-by: default avatarVasu Dev <vasu.dev@intel.com>
      Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    • Vasu Dev's avatar
      [SCSI] fcoe, libfc: adds per cpu exch pool within exchange manager(EM) · e4bc50be
      Vasu Dev authored
      Adds per cpu exch pool for these reasons:-
       1. Currently an EM instance is shared across all cpus to manage
          all exches for all cpus. This required em_lock across all
          cpus for an exch alloc, free, lookup and reset each frame
          and that made em_lock expensive, so instead having per cpu
          exch pool with their own per cpu pool lock will likely reduce
          locking contention in fast path for an exch alloc, free and
       2. Per cpu exch pool will likely improve cache hit ratio since
          all frames of an exch will be processed on the same cpu on
          which exch originated.
      This patch is only prep work to help in keeping complexity of next
      patch low, so this patch only sets up per cpu exch pool and related
      helper funcs to be used by next patch. The next patch fully makes
      use of per cpu exch pool in all code paths ie. tx, rx and reset.
      Divides per EM exch id range equally across all cpus to setup per
      cpu exch pool. This division is such that lower bits of exch id
      carries cpu number info on which exch originated, later a simple
      bitwise AND operation on exch id of incoming frame with fc_cpu_mask
      retrieves cpu number info to direct all frames to same cpu on which
      exch originated. This required a global fc_cpu_mask and fc_cpu_order
      initialized to max possible cpus number nr_cpu_ids rounded up to 2's
      power, this will be used in mapping exch id and exch ptr array
      index in pool during exch allocation, find or reset code paths.
      Adds a check in fc_exch_mgr_alloc() to ensure specified min_xid
      lower bits are zero since these bits are used to carry cpu info.
      Adds and initializes struct fc_exch_pool with all required fields
      to manage exches in pool.
      Allocates per cpu struct fc_exch_pool with memory for exches array
      for range of exches per pool. The exches array memory is followed
      by struct fc_exch_pool.
      Adds fc_exch_ptr_get/set() helper functions to get/set exch ptr in
      pool exches array at specified array index.
      Increases default FCOE_MAX_XID to 0x0FFF from 0x07EF, so that more
      exches are available per cpu after above described exch id range
      division across all cpus to each pool.
      Signed-off-by: default avatarVasu Dev <vasu.dev@intel.com>
      Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
  5. 22 Aug, 2009 1 commit
    • Vasu Dev's avatar
      [SCSI] fcoe, fnic, libfc: modifies current code paths to use EM anchor list · 52ff878c
      Vasu Dev authored
      Modifies current code to use EM anchor list in EM allocation, EM free,
      EM reset, exch allocation and exch lookup code paths.
       1. Modifies fc_exch_mgr_alloc to accept EM match function and then
          have allocated EM added to the lport using fc_exch_mgr_add API
          while also updating EM kref for newly added EM.
       2. Updates fc_exch_mgr_free API to accept only lport pointer instead
          EM and then have this API free all EMs of the lport from EM anchor
       3. Removes single lport pointer link from the EM, which was used in
          associating lport pointer in newly allocated exchange. Instead have
          lport pointer passed along new exchange allocation call path and
          then store passed lport pointer in newly allocated exchange, this
          will allow a single EM instance to be used across more than one
          lport and used in EM reset to reset only lport specific exchanges.
       4. Modifies fc_exch_mgr_reset to reset all EMs from the EM anchor list
          of the lport, adds additional exch lport pointer (ep->lp) check for
          shared EM case to reset exchange specific to a lport requested reset.
       5. Updates exch allocation API fc_exch_alloc to use EM anchor list and
          its anchor match func pointer. The fc_exch_alloc will walk the list
          of EMs until it finds a match, a match will be either null match
          func pointer or call to match function returning true value.
       6. Updates fc_exch_recv to accept incoming frame on local port using
          only lport pointer and frame pointer without specifying EM instance
          of incoming frame. Instead modified fc_exch_recv to locate EM for the
          incoming frame by matching xid of incoming frame against a EM xid range.
          This change was required to use EM list in libfc Rx path and after this
          change the lport fc_exch_mgr pointer emp is not needed anymore, so
          removed emp pointer.
       7. Updates fnic for removed lport emp pointer and above modified libfc APIs
          fc_exch_recv, fc_exch_mgr_alloc and fc_exch_mgr_free.
       8. Removes exch_get and exch_put from libfc_function_template as these
          are no longer needed with EM anchor list and its match function use.
          Also removes its default function fc_exch_get.
      A defect this patch introduced regarding the libfc initialization order in
      the fnic driver was fixed by Joe Eykholt <jeykholt@cisco.com>.
      Signed-off-by: default avatarVasu Dev <vasu.dev@intel.com>
      Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>