Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iscsi-target: Convert iscsi_session statistics to atomic_long_t

This patch converts a handful of iscsi_session statistics to type
atomic_long_t, instead of using iscsi_session->session_stats_lock
when incrementing these values.

More importantly, go ahead and drop the spinlock usage within
iscsit_setup_scsi_cmd(), iscsit_check_dataout_hdr(),
iscsit_send_datain(), and iscsit_build_rsp_pdu() fast-path code.

(Squash in Roland's target: Remove write-only stats fields and lock
from struct se_node_acl)

Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>

+25 -50
+5 -30
drivers/target/iscsi/iscsi_target.c
··· 800 800 int iscsi_task_attr; 801 801 int sam_task_attr; 802 802 803 - spin_lock_bh(&conn->sess->session_stats_lock); 804 - conn->sess->cmd_pdus++; 805 - if (conn->sess->se_sess->se_node_acl) { 806 - spin_lock(&conn->sess->se_sess->se_node_acl->stats_lock); 807 - conn->sess->se_sess->se_node_acl->num_cmds++; 808 - spin_unlock(&conn->sess->se_sess->se_node_acl->stats_lock); 809 - } 810 - spin_unlock_bh(&conn->sess->session_stats_lock); 803 + atomic_long_inc(&conn->sess->cmd_pdus); 811 804 812 805 hdr = (struct iscsi_scsi_req *) buf; 813 806 payload_length = ntoh24(hdr->dlength); ··· 1247 1254 } 1248 1255 1249 1256 /* iSCSI write */ 1250 - spin_lock_bh(&conn->sess->session_stats_lock); 1251 - conn->sess->rx_data_octets += payload_length; 1252 - if (conn->sess->se_sess->se_node_acl) { 1253 - spin_lock(&conn->sess->se_sess->se_node_acl->stats_lock); 1254 - conn->sess->se_sess->se_node_acl->write_bytes += payload_length; 1255 - spin_unlock(&conn->sess->se_sess->se_node_acl->stats_lock); 1256 - } 1257 - spin_unlock_bh(&conn->sess->session_stats_lock); 1257 + atomic_long_add(payload_length, &conn->sess->rx_data_octets); 1258 1258 1259 1259 if (payload_length > conn->conn_ops->MaxXmitDataSegmentLength) { 1260 1260 pr_err("DataSegmentLength: %u is greater than" ··· 2617 2631 return -1; 2618 2632 } 2619 2633 2620 - spin_lock_bh(&conn->sess->session_stats_lock); 2621 - conn->sess->tx_data_octets += datain.length; 2622 - if (conn->sess->se_sess->se_node_acl) { 2623 - spin_lock(&conn->sess->se_sess->se_node_acl->stats_lock); 2624 - conn->sess->se_sess->se_node_acl->read_bytes += datain.length; 2625 - spin_unlock(&conn->sess->se_sess->se_node_acl->stats_lock); 2626 - } 2627 - spin_unlock_bh(&conn->sess->session_stats_lock); 2634 + atomic_long_add(datain.length, &conn->sess->tx_data_octets); 2628 2635 /* 2629 2636 * Special case for successfully execution w/ both DATAIN 2630 2637 * and Sense Data. ··· 3142 3163 if (inc_stat_sn) 3143 3164 cmd->stat_sn = conn->stat_sn++; 3144 3165 3145 - spin_lock_bh(&conn->sess->session_stats_lock); 3146 - conn->sess->rsp_pdus++; 3147 - spin_unlock_bh(&conn->sess->session_stats_lock); 3166 + atomic_long_inc(&conn->sess->rsp_pdus); 3148 3167 3149 3168 memset(hdr, 0, ISCSI_HDR_LEN); 3150 3169 hdr->opcode = ISCSI_OP_SCSI_CMD_RSP; ··· 4091 4114 * hit default in the switch below. 4092 4115 */ 4093 4116 memset(buffer, 0xff, ISCSI_HDR_LEN); 4094 - spin_lock_bh(&conn->sess->session_stats_lock); 4095 - conn->sess->conn_digest_errors++; 4096 - spin_unlock_bh(&conn->sess->session_stats_lock); 4117 + atomic_long_inc(&conn->sess->conn_digest_errors); 4097 4118 } else { 4098 4119 pr_debug("Got HeaderDigest CRC32C" 4099 4120 " 0x%08x\n", checksum);
+6 -7
drivers/target/iscsi/iscsi_target_core.h
··· 651 651 /* Used for session reference counting */ 652 652 int session_usage_count; 653 653 int session_waiting_on_uc; 654 - u32 cmd_pdus; 655 - u32 rsp_pdus; 656 - u64 tx_data_octets; 657 - u64 rx_data_octets; 658 - u32 conn_digest_errors; 659 - u32 conn_timeout_errors; 654 + atomic_long_t cmd_pdus; 655 + atomic_long_t rsp_pdus; 656 + atomic_long_t tx_data_octets; 657 + atomic_long_t rx_data_octets; 658 + atomic_long_t conn_digest_errors; 659 + atomic_long_t conn_timeout_errors; 660 660 u64 creation_time; 661 - spinlock_t session_stats_lock; 662 661 /* Number of active connections */ 663 662 atomic_t nconn; 664 663 atomic_t session_continuation;
+1 -1
drivers/target/iscsi/iscsi_target_erl0.c
··· 785 785 tiqn->sess_err_stats.last_sess_failure_type = 786 786 ISCSI_SESS_ERR_CXN_TIMEOUT; 787 787 tiqn->sess_err_stats.cxn_timeout_errors++; 788 - sess->conn_timeout_errors++; 788 + atomic_long_inc(&sess->conn_timeout_errors); 789 789 spin_unlock(&tiqn->sess_err_stats.lock); 790 790 } 791 791 }
-1
drivers/target/iscsi/iscsi_target_login.c
··· 305 305 } 306 306 307 307 sess->creation_time = get_jiffies_64(); 308 - spin_lock_init(&sess->session_stats_lock); 309 308 /* 310 309 * The FFP CmdSN window values will be allocated from the TPG's 311 310 * Initiator Node's ACL once the login has been successfully completed.
+12 -10
drivers/target/iscsi/iscsi_target_stat.c
··· 792 792 if (se_sess) { 793 793 sess = se_sess->fabric_sess_ptr; 794 794 if (sess) 795 - ret = snprintf(page, PAGE_SIZE, "%u\n", sess->cmd_pdus); 795 + ret = snprintf(page, PAGE_SIZE, "%lu\n", 796 + atomic_long_read(&sess->cmd_pdus)); 796 797 } 797 798 spin_unlock_bh(&se_nacl->nacl_sess_lock); 798 799 ··· 816 815 if (se_sess) { 817 816 sess = se_sess->fabric_sess_ptr; 818 817 if (sess) 819 - ret = snprintf(page, PAGE_SIZE, "%u\n", sess->rsp_pdus); 818 + ret = snprintf(page, PAGE_SIZE, "%lu\n", 819 + atomic_long_read(&sess->rsp_pdus)); 820 820 } 821 821 spin_unlock_bh(&se_nacl->nacl_sess_lock); 822 822 ··· 840 838 if (se_sess) { 841 839 sess = se_sess->fabric_sess_ptr; 842 840 if (sess) 843 - ret = snprintf(page, PAGE_SIZE, "%llu\n", 844 - (unsigned long long)sess->tx_data_octets); 841 + ret = snprintf(page, PAGE_SIZE, "%lu\n", 842 + atomic_long_read(&sess->tx_data_octets)); 845 843 } 846 844 spin_unlock_bh(&se_nacl->nacl_sess_lock); 847 845 ··· 864 862 if (se_sess) { 865 863 sess = se_sess->fabric_sess_ptr; 866 864 if (sess) 867 - ret = snprintf(page, PAGE_SIZE, "%llu\n", 868 - (unsigned long long)sess->rx_data_octets); 865 + ret = snprintf(page, PAGE_SIZE, "%lu\n", 866 + atomic_long_read(&sess->rx_data_octets)); 869 867 } 870 868 spin_unlock_bh(&se_nacl->nacl_sess_lock); 871 869 ··· 888 886 if (se_sess) { 889 887 sess = se_sess->fabric_sess_ptr; 890 888 if (sess) 891 - ret = snprintf(page, PAGE_SIZE, "%u\n", 892 - sess->conn_digest_errors); 889 + ret = snprintf(page, PAGE_SIZE, "%lu\n", 890 + atomic_long_read(&sess->conn_digest_errors)); 893 891 } 894 892 spin_unlock_bh(&se_nacl->nacl_sess_lock); 895 893 ··· 912 910 if (se_sess) { 913 911 sess = se_sess->fabric_sess_ptr; 914 912 if (sess) 915 - ret = snprintf(page, PAGE_SIZE, "%u\n", 916 - sess->conn_timeout_errors); 913 + ret = snprintf(page, PAGE_SIZE, "%lu\n", 914 + atomic_long_read(&sess->conn_timeout_errors)); 917 915 } 918 916 spin_unlock_bh(&se_nacl->nacl_sess_lock); 919 917
+1 -1
drivers/target/iscsi/iscsi_target_util.c
··· 980 980 tiqn->sess_err_stats.last_sess_failure_type = 981 981 ISCSI_SESS_ERR_CXN_TIMEOUT; 982 982 tiqn->sess_err_stats.cxn_timeout_errors++; 983 - conn->sess->conn_timeout_errors++; 983 + atomic_long_inc(&conn->sess->conn_timeout_errors); 984 984 spin_unlock_bh(&tiqn->sess_err_stats.lock); 985 985 } 986 986 }