mirror of https://gitee.com/openkylin/linux.git
[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_transport.o \
|
||||||
target_core_cdb.o \
|
target_core_cdb.o \
|
||||||
target_core_ua.o \
|
target_core_ua.o \
|
||||||
target_core_rd.o \
|
target_core_rd.o
|
||||||
target_core_mib.o
|
|
||||||
|
|
||||||
obj-$(CONFIG_TARGET_CORE) += target_core_mod.o
|
obj-$(CONFIG_TARGET_CORE) += target_core_mod.o
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
#include <linux/parser.h>
|
#include <linux/parser.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/configfs.h>
|
#include <linux/configfs.h>
|
||||||
#include <linux/proc_fs.h>
|
|
||||||
|
|
||||||
#include <target/target_core_base.h>
|
#include <target/target_core_base.h>
|
||||||
#include <target/target_core_device.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 *target_cg, *hba_cg = NULL, *alua_cg = NULL;
|
||||||
struct config_group *lu_gp_cg = NULL;
|
struct config_group *lu_gp_cg = NULL;
|
||||||
struct configfs_subsystem *subsys;
|
struct configfs_subsystem *subsys;
|
||||||
struct proc_dir_entry *scsi_target_proc = NULL;
|
|
||||||
struct t10_alua_lu_gp *lu_gp;
|
struct t10_alua_lu_gp *lu_gp;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -3128,21 +3126,10 @@ static int target_core_init_configfs(void)
|
||||||
if (core_dev_setup_virtual_lun0() < 0)
|
if (core_dev_setup_virtual_lun0() < 0)
|
||||||
goto out;
|
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;
|
return 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
configfs_unregister_subsystem(subsys);
|
configfs_unregister_subsystem(subsys);
|
||||||
if (scsi_target_proc)
|
|
||||||
remove_proc_entry("scsi_target", 0);
|
|
||||||
core_dev_release_virtual_lun0();
|
core_dev_release_virtual_lun0();
|
||||||
rd_module_exit();
|
rd_module_exit();
|
||||||
out_global:
|
out_global:
|
||||||
|
@ -3210,8 +3197,6 @@ static void target_core_exit_configfs(void)
|
||||||
printk(KERN_INFO "TARGET_CORE[0]: Released ConfigFS Fabric"
|
printk(KERN_INFO "TARGET_CORE[0]: Released ConfigFS Fabric"
|
||||||
" Infrastructure\n");
|
" Infrastructure\n");
|
||||||
|
|
||||||
remove_scsi_target_mib();
|
|
||||||
remove_proc_entry("scsi_target", 0);
|
|
||||||
core_dev_release_virtual_lun0();
|
core_dev_release_virtual_lun0();
|
||||||
rd_module_exit();
|
rd_module_exit();
|
||||||
release_se_global();
|
release_se_global();
|
||||||
|
|
|
@ -867,9 +867,6 @@ static void se_dev_stop(struct se_device *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spin_unlock(&hba->device_lock);
|
spin_unlock(&hba->device_lock);
|
||||||
|
|
||||||
while (atomic_read(&hba->dev_mib_access_count))
|
|
||||||
cpu_relax();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int se_dev_check_online(struct se_device *dev)
|
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->device_list_lock);
|
||||||
spin_lock_init(&acl->nacl_sess_lock);
|
spin_lock_init(&acl->nacl_sess_lock);
|
||||||
atomic_set(&acl->acl_pr_ref_count, 0);
|
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);
|
acl->queue_depth = TPG_TFO(tpg)->tpg_get_default_depth(tpg);
|
||||||
snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname);
|
snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname);
|
||||||
acl->se_tpg = tpg;
|
acl->se_tpg = tpg;
|
||||||
|
@ -318,12 +317,6 @@ void core_tpg_wait_for_nacl_pr_ref(struct se_node_acl *nacl)
|
||||||
cpu_relax();
|
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)
|
void core_tpg_clear_object_luns(struct se_portal_group *tpg)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
@ -480,7 +473,6 @@ int core_tpg_del_initiator_node_acl(
|
||||||
spin_unlock_bh(&tpg->session_lock);
|
spin_unlock_bh(&tpg->session_lock);
|
||||||
|
|
||||||
core_tpg_wait_for_nacl_pr_ref(acl);
|
core_tpg_wait_for_nacl_pr_ref(acl);
|
||||||
core_tpg_wait_for_mib_ref(acl);
|
|
||||||
core_clear_initiator_node_from_tpg(acl, tpg);
|
core_clear_initiator_node_from_tpg(acl, tpg);
|
||||||
core_free_device_list_for_node(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)
|
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"
|
printk(KERN_INFO "TARGET_CORE[%s]: Deallocating %s struct se_portal_group"
|
||||||
" for endpoint: %s Portal Tag %u\n",
|
" for endpoint: %s Portal Tag %u\n",
|
||||||
(se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) ?
|
(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)
|
while (atomic_read(&se_tpg->tpg_pr_ref_count) != 0)
|
||||||
cpu_relax();
|
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)
|
if (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL)
|
||||||
core_tpg_release_virtual_lun0(se_tpg);
|
core_tpg_release_virtual_lun0(se_tpg);
|
||||||
|
|
|
@ -379,6 +379,40 @@ void release_se_global(void)
|
||||||
se_global = NULL;
|
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)
|
void transport_init_queue_obj(struct se_queue_obj *qobj)
|
||||||
{
|
{
|
||||||
atomic_set(&qobj->queue_cnt, 0);
|
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_list);
|
||||||
INIT_LIST_HEAD(&se_sess->sess_acl_list);
|
INIT_LIST_HEAD(&se_sess->sess_acl_list);
|
||||||
atomic_set(&se_sess->mib_ref_count, 0);
|
|
||||||
|
|
||||||
return se_sess;
|
return se_sess;
|
||||||
}
|
}
|
||||||
|
@ -546,12 +579,6 @@ void transport_deregister_session(struct se_session *se_sess)
|
||||||
transport_free_session(se_sess);
|
transport_free_session(se_sess);
|
||||||
return;
|
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);
|
spin_lock_bh(&se_tpg->session_lock);
|
||||||
list_del(&se_sess->sess_list);
|
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);
|
spin_unlock_bh(&se_tpg->acl_node_lock);
|
||||||
|
|
||||||
core_tpg_wait_for_nacl_pr_ref(se_nacl);
|
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);
|
core_free_device_list_for_node(se_nacl, se_tpg);
|
||||||
TPG_TFO(se_tpg)->tpg_release_fabric_acl(se_tpg,
|
TPG_TFO(se_tpg)->tpg_release_fabric_acl(se_tpg,
|
||||||
se_nacl);
|
se_nacl);
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
#include <scsi/scsi_cmnd.h>
|
#include <scsi/scsi_cmnd.h>
|
||||||
#include <net/sock.h>
|
#include <net/sock.h>
|
||||||
#include <net/tcp.h>
|
#include <net/tcp.h>
|
||||||
#include "target_core_mib.h"
|
|
||||||
|
|
||||||
#define TARGET_CORE_MOD_VERSION "v4.0.0-rc6"
|
#define TARGET_CORE_MOD_VERSION "v4.0.0-rc6"
|
||||||
#define SHUTDOWN_SIGS (sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGABRT))
|
#define SHUTDOWN_SIGS (sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGABRT))
|
||||||
|
@ -195,6 +194,21 @@ typedef enum {
|
||||||
SAM_TASK_ATTR_EMULATED
|
SAM_TASK_ATTR_EMULATED
|
||||||
} t10_task_attr_index_t;
|
} 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 se_cmd;
|
||||||
|
|
||||||
struct t10_alua {
|
struct t10_alua {
|
||||||
|
@ -578,8 +592,6 @@ struct se_node_acl {
|
||||||
spinlock_t stats_lock;
|
spinlock_t stats_lock;
|
||||||
/* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
|
/* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
|
||||||
atomic_t acl_pr_ref_count;
|
atomic_t acl_pr_ref_count;
|
||||||
/* Used for MIB access */
|
|
||||||
atomic_t mib_ref_count;
|
|
||||||
struct se_dev_entry *device_list;
|
struct se_dev_entry *device_list;
|
||||||
struct se_session *nacl_sess;
|
struct se_session *nacl_sess;
|
||||||
struct se_portal_group *se_tpg;
|
struct se_portal_group *se_tpg;
|
||||||
|
@ -595,8 +607,6 @@ struct se_node_acl {
|
||||||
} ____cacheline_aligned;
|
} ____cacheline_aligned;
|
||||||
|
|
||||||
struct se_session {
|
struct se_session {
|
||||||
/* Used for MIB access */
|
|
||||||
atomic_t mib_ref_count;
|
|
||||||
u64 sess_bin_isid;
|
u64 sess_bin_isid;
|
||||||
struct se_node_acl *se_node_acl;
|
struct se_node_acl *se_node_acl;
|
||||||
struct se_portal_group *se_tpg;
|
struct se_portal_group *se_tpg;
|
||||||
|
@ -806,7 +816,6 @@ struct se_hba {
|
||||||
/* Virtual iSCSI devices attached. */
|
/* Virtual iSCSI devices attached. */
|
||||||
u32 dev_count;
|
u32 dev_count;
|
||||||
u32 hba_index;
|
u32 hba_index;
|
||||||
atomic_t dev_mib_access_count;
|
|
||||||
atomic_t load_balance_queue;
|
atomic_t load_balance_queue;
|
||||||
atomic_t left_queue_depth;
|
atomic_t left_queue_depth;
|
||||||
/* Maximum queue depth the HBA can handle. */
|
/* Maximum queue depth the HBA can handle. */
|
||||||
|
@ -845,6 +854,12 @@ struct se_lun {
|
||||||
|
|
||||||
#define SE_LUN(c) ((struct se_lun *)(c)->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 {
|
struct se_port {
|
||||||
/* RELATIVE TARGET PORT IDENTIFER */
|
/* RELATIVE TARGET PORT IDENTIFER */
|
||||||
u16 sep_rtpi;
|
u16 sep_rtpi;
|
||||||
|
|
|
@ -111,6 +111,8 @@ struct se_subsystem_api;
|
||||||
|
|
||||||
extern int init_se_global(void);
|
extern int init_se_global(void);
|
||||||
extern void release_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 void transport_init_queue_obj(struct se_queue_obj *);
|
||||||
extern int transport_subsystem_check_init(void);
|
extern int transport_subsystem_check_init(void);
|
||||||
extern int transport_subsystem_register(struct se_subsystem_api *);
|
extern int transport_subsystem_register(struct se_subsystem_api *);
|
||||||
|
|
Loading…
Reference in New Issue