tcm_fc: Convert to per-cpu command map pre-allocation of ft_cmd
authorNicholas Bellinger <nab@daterainc.com>
Mon, 23 Sep 2013 19:12:42 +0000 (12:12 -0700)
committerNicholas Bellinger <nab@linux-iscsi.org>
Wed, 2 Oct 2013 04:40:55 +0000 (21:40 -0700)
commit5f544cfac956971099e906f94568bc3fd1a7108a
tree01693c400aeae3cf1fbaf26b54f7b55e083387d3
parent15c03dd4859ab16f9212238f29dd315654aa94f6
tcm_fc: Convert to per-cpu command map pre-allocation of ft_cmd

This patch converts tcm_fc to use transport_init_session_tags()
pre-allocation logic for struct ft_cmd descriptors using per-cpu
session tag pooling in order to effectively avoid memory allocation
+ release for each received I/O.

It adds percpu_ida_alloc() in ft_recv_cmd() to obtain an tag and
locate ft_cmd from se_sess->sess_cmd_map[], and percpu_ida_free()
in ft_free_cmd() to release the tag based upon se_cmd->map_tag id.

It also uses a TCM_FC_DEFAULT_TAGS value of 512, that puts the
per se_sess->sess_cmd_map allocation at ~360K on 64-bit.

v2 changes:

  - Handle possible tag < 0 failure with GFP_ATOMIC

Cc: Mark Rustad <mark.d.rustad@intel.com>
Cc: Robert Love <robert.w.love@intel.com>
Cc: Kent Overstreet <kmo@daterainc.com>
Signed-off-by: Nicholas Bellinger <nab@daterainc.com>
drivers/target/tcm_fc/tcm_fc.h
drivers/target/tcm_fc/tfc_cmd.c
drivers/target/tcm_fc/tfc_sess.c