forked from Minki/linux
[SCSI] target: Remove procfs based target_core_mib.c code
This patch removes the legacy procfs based target_core_mib.c code, and moves the necessary scsi_index_tables functions and defines into target_core_transport.c and target_core_base.h code to allow existing fabric independent statistics to function. This includes the removal of a handful of 'atomic_t mib_ref_count' counters used in struct se_node_acl, se_session and se_hba to prevent removal while using seq_list procfs walking logic. [jejb: fix up compile failures] Signed-off-by: Nicholas A. Bellinger <nab@linux-iscsi.org> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
e63af95888
commit
e89d15eead
@ -13,8 +13,7 @@ target_core_mod-y := target_core_configfs.o \
|
||||
target_core_transport.o \
|
||||
target_core_cdb.o \
|
||||
target_core_ua.o \
|
||||
target_core_rd.o \
|
||||
target_core_mib.o
|
||||
target_core_rd.o
|
||||
|
||||
obj-$(CONFIG_TARGET_CORE) += target_core_mod.o
|
||||
|
||||
|
@ -37,7 +37,6 @@
|
||||
#include <linux/parser.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/configfs.h>
|
||||
#include <linux/proc_fs.h>
|
||||
|
||||
#include <target/target_core_base.h>
|
||||
#include <target/target_core_device.h>
|
||||
@ -3022,7 +3021,6 @@ static int target_core_init_configfs(void)
|
||||
struct config_group *target_cg, *hba_cg = NULL, *alua_cg = NULL;
|
||||
struct config_group *lu_gp_cg = NULL;
|
||||
struct configfs_subsystem *subsys;
|
||||
struct proc_dir_entry *scsi_target_proc = NULL;
|
||||
struct t10_alua_lu_gp *lu_gp;
|
||||
int ret;
|
||||
|
||||
@ -3128,21 +3126,10 @@ static int target_core_init_configfs(void)
|
||||
if (core_dev_setup_virtual_lun0() < 0)
|
||||
goto out;
|
||||
|
||||
scsi_target_proc = proc_mkdir("scsi_target", 0);
|
||||
if (!(scsi_target_proc)) {
|
||||
printk(KERN_ERR "proc_mkdir(scsi_target, 0) failed\n");
|
||||
goto out;
|
||||
}
|
||||
ret = init_scsi_target_mib();
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
configfs_unregister_subsystem(subsys);
|
||||
if (scsi_target_proc)
|
||||
remove_proc_entry("scsi_target", 0);
|
||||
core_dev_release_virtual_lun0();
|
||||
rd_module_exit();
|
||||
out_global:
|
||||
@ -3210,8 +3197,6 @@ static void target_core_exit_configfs(void)
|
||||
printk(KERN_INFO "TARGET_CORE[0]: Released ConfigFS Fabric"
|
||||
" Infrastructure\n");
|
||||
|
||||
remove_scsi_target_mib();
|
||||
remove_proc_entry("scsi_target", 0);
|
||||
core_dev_release_virtual_lun0();
|
||||
rd_module_exit();
|
||||
release_se_global();
|
||||
|
@ -867,9 +867,6 @@ static void se_dev_stop(struct se_device *dev)
|
||||
}
|
||||
}
|
||||
spin_unlock(&hba->device_lock);
|
||||
|
||||
while (atomic_read(&hba->dev_mib_access_count))
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
int se_dev_check_online(struct se_device *dev)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,28 +0,0 @@
|
||||
#ifndef TARGET_CORE_MIB_H
|
||||
#define TARGET_CORE_MIB_H
|
||||
|
||||
typedef enum {
|
||||
SCSI_INST_INDEX,
|
||||
SCSI_DEVICE_INDEX,
|
||||
SCSI_AUTH_INTR_INDEX,
|
||||
SCSI_INDEX_TYPE_MAX
|
||||
} scsi_index_t;
|
||||
|
||||
struct scsi_index_table {
|
||||
spinlock_t lock;
|
||||
u32 scsi_mib_index[SCSI_INDEX_TYPE_MAX];
|
||||
} ____cacheline_aligned;
|
||||
|
||||
/* SCSI Port stats */
|
||||
struct scsi_port_stats {
|
||||
u64 cmd_pdus;
|
||||
u64 tx_data_octets;
|
||||
u64 rx_data_octets;
|
||||
} ____cacheline_aligned;
|
||||
|
||||
extern int init_scsi_target_mib(void);
|
||||
extern void remove_scsi_target_mib(void);
|
||||
extern void init_scsi_index_table(void);
|
||||
extern u32 scsi_get_new_index(scsi_index_t);
|
||||
|
||||
#endif /*** TARGET_CORE_MIB_H ***/
|
@ -275,7 +275,6 @@ struct se_node_acl *core_tpg_check_initiator_node_acl(
|
||||
spin_lock_init(&acl->device_list_lock);
|
||||
spin_lock_init(&acl->nacl_sess_lock);
|
||||
atomic_set(&acl->acl_pr_ref_count, 0);
|
||||
atomic_set(&acl->mib_ref_count, 0);
|
||||
acl->queue_depth = TPG_TFO(tpg)->tpg_get_default_depth(tpg);
|
||||
snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname);
|
||||
acl->se_tpg = tpg;
|
||||
@ -318,12 +317,6 @@ void core_tpg_wait_for_nacl_pr_ref(struct se_node_acl *nacl)
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
void core_tpg_wait_for_mib_ref(struct se_node_acl *nacl)
|
||||
{
|
||||
while (atomic_read(&nacl->mib_ref_count) != 0)
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
void core_tpg_clear_object_luns(struct se_portal_group *tpg)
|
||||
{
|
||||
int i, ret;
|
||||
@ -480,7 +473,6 @@ int core_tpg_del_initiator_node_acl(
|
||||
spin_unlock_bh(&tpg->session_lock);
|
||||
|
||||
core_tpg_wait_for_nacl_pr_ref(acl);
|
||||
core_tpg_wait_for_mib_ref(acl);
|
||||
core_clear_initiator_node_from_tpg(acl, tpg);
|
||||
core_free_device_list_for_node(acl, tpg);
|
||||
|
||||
@ -701,6 +693,8 @@ EXPORT_SYMBOL(core_tpg_register);
|
||||
|
||||
int core_tpg_deregister(struct se_portal_group *se_tpg)
|
||||
{
|
||||
struct se_node_acl *nacl, *nacl_tmp;
|
||||
|
||||
printk(KERN_INFO "TARGET_CORE[%s]: Deallocating %s struct se_portal_group"
|
||||
" for endpoint: %s Portal Tag %u\n",
|
||||
(se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) ?
|
||||
@ -714,6 +708,25 @@ int core_tpg_deregister(struct se_portal_group *se_tpg)
|
||||
|
||||
while (atomic_read(&se_tpg->tpg_pr_ref_count) != 0)
|
||||
cpu_relax();
|
||||
/*
|
||||
* Release any remaining demo-mode generated se_node_acl that have
|
||||
* not been released because of TFO->tpg_check_demo_mode_cache() == 1
|
||||
* in transport_deregister_session().
|
||||
*/
|
||||
spin_lock_bh(&se_tpg->acl_node_lock);
|
||||
list_for_each_entry_safe(nacl, nacl_tmp, &se_tpg->acl_node_list,
|
||||
acl_list) {
|
||||
list_del(&nacl->acl_list);
|
||||
se_tpg->num_node_acls--;
|
||||
spin_unlock_bh(&se_tpg->acl_node_lock);
|
||||
|
||||
core_tpg_wait_for_nacl_pr_ref(nacl);
|
||||
core_free_device_list_for_node(nacl, se_tpg);
|
||||
TPG_TFO(se_tpg)->tpg_release_fabric_acl(se_tpg, nacl);
|
||||
|
||||
spin_lock_bh(&se_tpg->acl_node_lock);
|
||||
}
|
||||
spin_unlock_bh(&se_tpg->acl_node_lock);
|
||||
|
||||
if (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL)
|
||||
core_tpg_release_virtual_lun0(se_tpg);
|
||||
|
@ -379,6 +379,40 @@ void release_se_global(void)
|
||||
se_global = NULL;
|
||||
}
|
||||
|
||||
/* SCSI statistics table index */
|
||||
static struct scsi_index_table scsi_index_table;
|
||||
|
||||
/*
|
||||
* Initialize the index table for allocating unique row indexes to various mib
|
||||
* tables.
|
||||
*/
|
||||
void init_scsi_index_table(void)
|
||||
{
|
||||
memset(&scsi_index_table, 0, sizeof(struct scsi_index_table));
|
||||
spin_lock_init(&scsi_index_table.lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate a new row index for the entry type specified
|
||||
*/
|
||||
u32 scsi_get_new_index(scsi_index_t type)
|
||||
{
|
||||
u32 new_index;
|
||||
|
||||
if ((type < 0) || (type >= SCSI_INDEX_TYPE_MAX)) {
|
||||
printk(KERN_ERR "Invalid index type %d\n", type);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
spin_lock(&scsi_index_table.lock);
|
||||
new_index = ++scsi_index_table.scsi_mib_index[type];
|
||||
if (new_index == 0)
|
||||
new_index = ++scsi_index_table.scsi_mib_index[type];
|
||||
spin_unlock(&scsi_index_table.lock);
|
||||
|
||||
return new_index;
|
||||
}
|
||||
|
||||
void transport_init_queue_obj(struct se_queue_obj *qobj)
|
||||
{
|
||||
atomic_set(&qobj->queue_cnt, 0);
|
||||
@ -437,7 +471,6 @@ struct se_session *transport_init_session(void)
|
||||
}
|
||||
INIT_LIST_HEAD(&se_sess->sess_list);
|
||||
INIT_LIST_HEAD(&se_sess->sess_acl_list);
|
||||
atomic_set(&se_sess->mib_ref_count, 0);
|
||||
|
||||
return se_sess;
|
||||
}
|
||||
@ -546,12 +579,6 @@ void transport_deregister_session(struct se_session *se_sess)
|
||||
transport_free_session(se_sess);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Wait for possible reference in drivers/target/target_core_mib.c:
|
||||
* scsi_att_intr_port_seq_show()
|
||||
*/
|
||||
while (atomic_read(&se_sess->mib_ref_count) != 0)
|
||||
cpu_relax();
|
||||
|
||||
spin_lock_bh(&se_tpg->session_lock);
|
||||
list_del(&se_sess->sess_list);
|
||||
@ -574,7 +601,6 @@ void transport_deregister_session(struct se_session *se_sess)
|
||||
spin_unlock_bh(&se_tpg->acl_node_lock);
|
||||
|
||||
core_tpg_wait_for_nacl_pr_ref(se_nacl);
|
||||
core_tpg_wait_for_mib_ref(se_nacl);
|
||||
core_free_device_list_for_node(se_nacl, se_tpg);
|
||||
TPG_TFO(se_tpg)->tpg_release_fabric_acl(se_tpg,
|
||||
se_nacl);
|
||||
|
@ -8,7 +8,6 @@
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/tcp.h>
|
||||
#include "target_core_mib.h"
|
||||
|
||||
#define TARGET_CORE_MOD_VERSION "v4.0.0-rc6"
|
||||
#define SHUTDOWN_SIGS (sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGABRT))
|
||||
@ -195,6 +194,21 @@ typedef enum {
|
||||
SAM_TASK_ATTR_EMULATED
|
||||
} t10_task_attr_index_t;
|
||||
|
||||
/*
|
||||
* Used for target SCSI statistics
|
||||
*/
|
||||
typedef enum {
|
||||
SCSI_INST_INDEX,
|
||||
SCSI_DEVICE_INDEX,
|
||||
SCSI_AUTH_INTR_INDEX,
|
||||
SCSI_INDEX_TYPE_MAX
|
||||
} scsi_index_t;
|
||||
|
||||
struct scsi_index_table {
|
||||
spinlock_t lock;
|
||||
u32 scsi_mib_index[SCSI_INDEX_TYPE_MAX];
|
||||
} ____cacheline_aligned;
|
||||
|
||||
struct se_cmd;
|
||||
|
||||
struct t10_alua {
|
||||
@ -578,8 +592,6 @@ struct se_node_acl {
|
||||
spinlock_t stats_lock;
|
||||
/* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
|
||||
atomic_t acl_pr_ref_count;
|
||||
/* Used for MIB access */
|
||||
atomic_t mib_ref_count;
|
||||
struct se_dev_entry *device_list;
|
||||
struct se_session *nacl_sess;
|
||||
struct se_portal_group *se_tpg;
|
||||
@ -595,8 +607,6 @@ struct se_node_acl {
|
||||
} ____cacheline_aligned;
|
||||
|
||||
struct se_session {
|
||||
/* Used for MIB access */
|
||||
atomic_t mib_ref_count;
|
||||
u64 sess_bin_isid;
|
||||
struct se_node_acl *se_node_acl;
|
||||
struct se_portal_group *se_tpg;
|
||||
@ -806,7 +816,6 @@ struct se_hba {
|
||||
/* Virtual iSCSI devices attached. */
|
||||
u32 dev_count;
|
||||
u32 hba_index;
|
||||
atomic_t dev_mib_access_count;
|
||||
atomic_t load_balance_queue;
|
||||
atomic_t left_queue_depth;
|
||||
/* Maximum queue depth the HBA can handle. */
|
||||
@ -845,6 +854,12 @@ struct se_lun {
|
||||
|
||||
#define SE_LUN(c) ((struct se_lun *)(c)->se_lun)
|
||||
|
||||
struct scsi_port_stats {
|
||||
u64 cmd_pdus;
|
||||
u64 tx_data_octets;
|
||||
u64 rx_data_octets;
|
||||
} ____cacheline_aligned;
|
||||
|
||||
struct se_port {
|
||||
/* RELATIVE TARGET PORT IDENTIFER */
|
||||
u16 sep_rtpi;
|
||||
|
@ -111,6 +111,8 @@ struct se_subsystem_api;
|
||||
|
||||
extern int init_se_global(void);
|
||||
extern void release_se_global(void);
|
||||
extern void init_scsi_index_table(void);
|
||||
extern u32 scsi_get_new_index(scsi_index_t);
|
||||
extern void transport_init_queue_obj(struct se_queue_obj *);
|
||||
extern int transport_subsystem_check_init(void);
|
||||
extern int transport_subsystem_register(struct se_subsystem_api *);
|
||||
|
Loading…
Reference in New Issue
Block a user