Print this page
5045 use atomic_{inc,dec}_* instead of atomic_add_*
*** 936,946 ****
drv_usectohz(USEC_DEREG_RP_TIMEOUT);
irp->irp_dereg_count = 0;
fct_post_to_discovery_queue(iport, irp, NULL);
/* A PLOGI also invalidates any RSCNs related to this rp */
! atomic_add_32(&irp->irp_rscn_counter, 1);
} else {
/*
* For everything else, we have (or be able to lookup) a
* valid port pointer.
*/
--- 936,946 ----
drv_usectohz(USEC_DEREG_RP_TIMEOUT);
irp->irp_dereg_count = 0;
fct_post_to_discovery_queue(iport, irp, NULL);
/* A PLOGI also invalidates any RSCNs related to this rp */
! atomic_inc_32(&irp->irp_rscn_counter);
} else {
/*
* For everything else, we have (or be able to lookup) a
* valid port pointer.
*/
*** 981,991 ****
* Tell the framework that fct_cmd_free() can decrement the
* irp_nonfcp_xchg_count variable.
*/
atomic_or_32(&icmd->icmd_flags, ICMD_IMPLICIT_CMD_HAS_RESOURCE);
}
! atomic_add_16(&irp->irp_nonfcp_xchg_count, 1);
/*
* Grab the remote port lock while we modify the port state.
* we should not drop the fca port lock (as a reader) until we
* modify the remote port state.
--- 981,991 ----
* Tell the framework that fct_cmd_free() can decrement the
* irp_nonfcp_xchg_count variable.
*/
atomic_or_32(&icmd->icmd_flags, ICMD_IMPLICIT_CMD_HAS_RESOURCE);
}
! atomic_inc_16(&irp->irp_nonfcp_xchg_count);
/*
* Grab the remote port lock while we modify the port state.
* we should not drop the fca port lock (as a reader) until we
* modify the remote port state.
*** 996,1012 ****
(op == ELS_OP_TPRLO)) {
uint32_t rf = IRP_PRLI_DONE;
if ((op == ELS_OP_PLOGI) || (op == ELS_OP_LOGO)) {
rf |= IRP_PLOGI_DONE;
if (irp->irp_flags & IRP_PLOGI_DONE)
! atomic_add_32(&iport->iport_nrps_login, -1);
}
! atomic_add_16(&irp->irp_sa_elses_count, 1);
atomic_and_32(&irp->irp_flags, ~rf);
atomic_or_32(&icmd->icmd_flags, ICMD_SESSION_AFFECTING);
} else {
! atomic_add_16(&irp->irp_nsa_elses_count, 1);
}
fct_post_to_discovery_queue(iport, irp, icmd);
rw_exit(&irp->irp_lock);
--- 996,1012 ----
(op == ELS_OP_TPRLO)) {
uint32_t rf = IRP_PRLI_DONE;
if ((op == ELS_OP_PLOGI) || (op == ELS_OP_LOGO)) {
rf |= IRP_PLOGI_DONE;
if (irp->irp_flags & IRP_PLOGI_DONE)
! atomic_dec_32(&iport->iport_nrps_login);
}
! atomic_inc_16(&irp->irp_sa_elses_count);
atomic_and_32(&irp->irp_flags, ~rf);
atomic_or_32(&icmd->icmd_flags, ICMD_SESSION_AFFECTING);
} else {
! atomic_inc_16(&irp->irp_nsa_elses_count);
}
fct_post_to_discovery_queue(iport, irp, icmd);
rw_exit(&irp->irp_lock);
*** 1158,1168 ****
/* By this time rport_handle is valid */
if ((irp->irp_flags & IRP_HANDLE_OPENED) == 0) {
iport->iport_rp_slots[rp->rp_handle] = irp;
atomic_or_32(&irp->irp_flags, IRP_HANDLE_OPENED);
}
! (void) atomic_add_64_nv(&iport->iport_last_change, 1);
fct_log_remote_port_event(port, ESC_SUNFC_TARGET_ADD,
rp->rp_pwwn, rp->rp_id);
register_rp_done:;
rw_exit(&irp->irp_lock);
--- 1158,1168 ----
/* By this time rport_handle is valid */
if ((irp->irp_flags & IRP_HANDLE_OPENED) == 0) {
iport->iport_rp_slots[rp->rp_handle] = irp;
atomic_or_32(&irp->irp_flags, IRP_HANDLE_OPENED);
}
! (void) atomic_inc_64_nv(&iport->iport_last_change);
fct_log_remote_port_event(port, ESC_SUNFC_TARGET_ADD,
rp->rp_pwwn, rp->rp_id);
register_rp_done:;
rw_exit(&irp->irp_lock);
*** 1203,1213 ****
if (irp->irp_flags & IRP_HANDLE_OPENED) {
atomic_and_32(&irp->irp_flags, ~IRP_HANDLE_OPENED);
iport->iport_rp_slots[rp->rp_handle] = NULL;
}
! (void) atomic_add_64_nv(&iport->iport_last_change, 1);
fct_log_remote_port_event(port, ESC_SUNFC_TARGET_REMOVE,
rp->rp_pwwn, rp->rp_id);
return (FCT_SUCCESS);
}
--- 1203,1213 ----
if (irp->irp_flags & IRP_HANDLE_OPENED) {
atomic_and_32(&irp->irp_flags, ~IRP_HANDLE_OPENED);
iport->iport_rp_slots[rp->rp_handle] = NULL;
}
! (void) atomic_inc_64_nv(&iport->iport_last_change);
fct_log_remote_port_event(port, ESC_SUNFC_TARGET_REMOVE,
rp->rp_pwwn, rp->rp_id);
return (FCT_SUCCESS);
}
*** 1509,1524 ****
atomic_and_32(&irp->irp_flags,
~IRP_SOL_PLOGI_IN_PROGRESS);
}
}
}
! atomic_add_16(&irp->irp_sa_elses_count, -1);
if (ret == FCT_SUCCESS) {
if (cmd_type == FCT_CMD_RCVD_ELS) {
atomic_or_32(&irp->irp_flags, IRP_PLOGI_DONE);
! atomic_add_32(&iport->iport_nrps_login, 1);
if (irp->irp_deregister_timer)
irp->irp_deregister_timer = 0;
}
if (icmd_flags & ICMD_IMPLICIT) {
DTRACE_FC_5(rport__login__end,
--- 1509,1524 ----
atomic_and_32(&irp->irp_flags,
~IRP_SOL_PLOGI_IN_PROGRESS);
}
}
}
! atomic_dec_16(&irp->irp_sa_elses_count);
if (ret == FCT_SUCCESS) {
if (cmd_type == FCT_CMD_RCVD_ELS) {
atomic_or_32(&irp->irp_flags, IRP_PLOGI_DONE);
! atomic_inc_32(&iport->iport_nrps_login);
if (irp->irp_deregister_timer)
irp->irp_deregister_timer = 0;
}
if (icmd_flags & ICMD_IMPLICIT) {
DTRACE_FC_5(rport__login__end,
*** 1595,1605 ****
stmf_trace(iport->iport_alias, "Rejecting PRLI from %x "
" pld sz %d, prli_flags %x", cmd->cmd_rportid,
els->els_req_size, els->els_req_payload[6]);
fct_dequeue_els(irp);
! atomic_add_16(&irp->irp_sa_elses_count, -1);
ret = fct_send_accrjt(cmd, ELS_OP_LSRJT, 3, 0x2c);
goto prli_end;
}
if (irp->irp_fcp_xchg_count) {
--- 1595,1605 ----
stmf_trace(iport->iport_alias, "Rejecting PRLI from %x "
" pld sz %d, prli_flags %x", cmd->cmd_rportid,
els->els_req_size, els->els_req_payload[6]);
fct_dequeue_els(irp);
! atomic_dec_16(&irp->irp_sa_elses_count);
ret = fct_send_accrjt(cmd, ELS_OP_LSRJT, 3, 0x2c);
goto prli_end;
}
if (irp->irp_fcp_xchg_count) {
*** 1669,1679 ****
atomic_or_32(&irp->irp_flags, IRP_SCSI_SESSION_STARTED);
}
}
fct_dequeue_els(irp);
! atomic_add_16(&irp->irp_sa_elses_count, -1);
if (ses == NULL) {
/* fail PRLI */
ret = fct_send_accrjt(cmd, ELS_OP_LSRJT, 3, 0);
} else {
/* accept PRLI */
--- 1669,1679 ----
atomic_or_32(&irp->irp_flags, IRP_SCSI_SESSION_STARTED);
}
}
fct_dequeue_els(irp);
! atomic_dec_16(&irp->irp_sa_elses_count);
if (ses == NULL) {
/* fail PRLI */
ret = fct_send_accrjt(cmd, ELS_OP_LSRJT, 3, 0);
} else {
/* accept PRLI */
*** 1773,1783 ****
irp->irp_session = NULL;
atomic_and_32(&irp->irp_flags, ~IRP_SCSI_SESSION_STARTED);
}
fct_dequeue_els(irp);
! atomic_add_16(&irp->irp_sa_elses_count, -1);
/* don't send response if this is an implicit logout cmd */
if (!(icmd->icmd_flags & ICMD_IMPLICIT)) {
if (cmd->cmd_type == FCT_CMD_RCVD_ELS) {
ret = fct_send_accrjt(cmd, ELS_OP_ACC, 0, 0);
--- 1773,1783 ----
irp->irp_session = NULL;
atomic_and_32(&irp->irp_flags, ~IRP_SCSI_SESSION_STARTED);
}
fct_dequeue_els(irp);
! atomic_dec_16(&irp->irp_sa_elses_count);
/* don't send response if this is an implicit logout cmd */
if (!(icmd->icmd_flags & ICMD_IMPLICIT)) {
if (cmd->cmd_type == FCT_CMD_RCVD_ELS) {
ret = fct_send_accrjt(cmd, ELS_OP_ACC, 0, 0);
*** 1884,1894 ****
irp->irp_session = NULL;
atomic_and_32(&irp->irp_flags, ~IRP_SCSI_SESSION_STARTED);
}
fct_dequeue_els(irp);
! atomic_add_16(&irp->irp_sa_elses_count, -1);
ret = fct_send_accrjt(cmd, ELS_OP_ACC, 0, 0);
if (ret != FCT_SUCCESS)
fct_queue_cmd_for_termination(cmd, ret);
return (DISC_ACTION_RESCAN);
--- 1884,1894 ----
irp->irp_session = NULL;
atomic_and_32(&irp->irp_flags, ~IRP_SCSI_SESSION_STARTED);
}
fct_dequeue_els(irp);
! atomic_dec_16(&irp->irp_sa_elses_count);
ret = fct_send_accrjt(cmd, ELS_OP_ACC, 0, 0);
if (ret != FCT_SUCCESS)
fct_queue_cmd_for_termination(cmd, ret);
return (DISC_ACTION_RESCAN);
*** 1909,1919 ****
uint8_t *p;
uint32_t *q;
fct_status_t ret;
fct_dequeue_els(irp);
! atomic_add_16(&irp->irp_nsa_elses_count, -1);
/* Validate the adisc request */
p = els->els_req_payload;
q = (uint32_t *)p;
if ((els->els_req_size != 28) || (bcmp(rp->rp_pwwn, p + 8, 8)) ||
--- 1909,1919 ----
uint8_t *p;
uint32_t *q;
fct_status_t ret;
fct_dequeue_els(irp);
! atomic_dec_16(&irp->irp_nsa_elses_count);
/* Validate the adisc request */
p = els->els_req_payload;
q = (uint32_t *)p;
if ((els->els_req_size != 28) || (bcmp(rp->rp_pwwn, p + 8, 8)) ||
*** 1947,1957 ****
fct_status_t ret = FCT_FAILURE;
uint8_t op = 0;
ASSERT(icmd->icmd_cmd->cmd_type == FCT_CMD_RCVD_ELS);
fct_dequeue_els(ICMD_TO_IRP(icmd));
! atomic_add_16(&ICMD_TO_IRP(icmd)->irp_nsa_elses_count, -1);
op = ICMD_TO_ELS(icmd)->els_req_payload[0];
stmf_trace(iport->iport_alias, "Rejecting unknown unsol els %x (%s)",
op, FCT_ELS_NAME(op));
ret = fct_send_accrjt(icmd->icmd_cmd, ELS_OP_LSRJT, 1, 0);
if (ret != FCT_SUCCESS) {
--- 1947,1957 ----
fct_status_t ret = FCT_FAILURE;
uint8_t op = 0;
ASSERT(icmd->icmd_cmd->cmd_type == FCT_CMD_RCVD_ELS);
fct_dequeue_els(ICMD_TO_IRP(icmd));
! atomic_dec_16(&ICMD_TO_IRP(icmd)->irp_nsa_elses_count);
op = ICMD_TO_ELS(icmd)->els_req_payload[0];
stmf_trace(iport->iport_alias, "Rejecting unknown unsol els %x (%s)",
op, FCT_ELS_NAME(op));
ret = fct_send_accrjt(icmd->icmd_cmd, ELS_OP_LSRJT, 1, 0);
if (ret != FCT_SUCCESS) {
*** 1969,1979 ****
uint8_t op = 0;
uint8_t *rscn_req_payload;
uint32_t rscn_req_size;
fct_dequeue_els(ICMD_TO_IRP(icmd));
! atomic_add_16(&ICMD_TO_IRP(icmd)->irp_nsa_elses_count, -1);
if (icmd->icmd_cmd->cmd_type == FCT_CMD_RCVD_ELS) {
op = ICMD_TO_ELS(icmd)->els_req_payload[0];
stmf_trace(iport->iport_alias, "Accepting RSCN %x (%s)",
op, FCT_ELS_NAME(op));
rscn_req_size = ICMD_TO_ELS(icmd)->els_req_size;
--- 1969,1979 ----
uint8_t op = 0;
uint8_t *rscn_req_payload;
uint32_t rscn_req_size;
fct_dequeue_els(ICMD_TO_IRP(icmd));
! atomic_dec_16(&ICMD_TO_IRP(icmd)->irp_nsa_elses_count);
if (icmd->icmd_cmd->cmd_type == FCT_CMD_RCVD_ELS) {
op = ICMD_TO_ELS(icmd)->els_req_payload[0];
stmf_trace(iport->iport_alias, "Accepting RSCN %x (%s)",
op, FCT_ELS_NAME(op));
rscn_req_size = ICMD_TO_ELS(icmd)->els_req_size;
*** 2066,2078 ****
if (dq) {
fct_i_cmd_t *c = (*ppcmd)->icmd_next;
if ((*ppcmd)->icmd_flags & ICMD_SESSION_AFFECTING)
! atomic_add_16(&irp->irp_sa_elses_count, -1);
else
! atomic_add_16(&irp->irp_nsa_elses_count, -1);
(*ppcmd)->icmd_next = cmd_to_abort;
cmd_to_abort = *ppcmd;
*ppcmd = c;
} else {
ppcmd = &((*ppcmd)->icmd_next);
--- 2066,2078 ----
if (dq) {
fct_i_cmd_t *c = (*ppcmd)->icmd_next;
if ((*ppcmd)->icmd_flags & ICMD_SESSION_AFFECTING)
! atomic_dec_16(&irp->irp_sa_elses_count);
else
! atomic_dec_16(&irp->irp_nsa_elses_count);
(*ppcmd)->icmd_next = cmd_to_abort;
cmd_to_abort = *ppcmd;
*ppcmd = c;
} else {
ppcmd = &((*ppcmd)->icmd_next);
*** 2123,2133 ****
} else if (cmd->cmd_type == FCT_CMD_SOL_ELS) {
fct_status_t s;
fct_local_port_t *port = iport->iport_port;
fct_dequeue_els(irp);
! atomic_add_16(&irp->irp_nsa_elses_count, -1);
atomic_or_32(&icmd->icmd_flags, ICMD_KNOWN_TO_FCA);
if ((s = port->port_send_cmd(cmd)) != FCT_SUCCESS) {
atomic_and_32(&icmd->icmd_flags, ~ICMD_KNOWN_TO_FCA);
fct_queue_cmd_for_termination(cmd, s);
stmf_trace(iport->iport_alias, "Solicited els "
--- 2123,2133 ----
} else if (cmd->cmd_type == FCT_CMD_SOL_ELS) {
fct_status_t s;
fct_local_port_t *port = iport->iport_port;
fct_dequeue_els(irp);
! atomic_dec_16(&irp->irp_nsa_elses_count);
atomic_or_32(&icmd->icmd_flags, ICMD_KNOWN_TO_FCA);
if ((s = port->port_send_cmd(cmd)) != FCT_SUCCESS) {
atomic_and_32(&icmd->icmd_flags, ~ICMD_KNOWN_TO_FCA);
fct_queue_cmd_for_termination(cmd, s);
stmf_trace(iport->iport_alias, "Solicited els "
*** 2177,2187 ****
bcopy(els->els_resp_payload + 28, irp->irp_rp->rp_nwwn, 8);
stmf_wwn_to_devid_desc((scsi_devid_desc_t *)irp->irp_id,
irp->irp_rp->rp_pwwn, PROTOCOL_FIBRE_CHANNEL);
atomic_or_32(&irp->irp_flags, IRP_PLOGI_DONE);
! atomic_add_32(&iport->iport_nrps_login, 1);
if (irp->irp_deregister_timer) {
irp->irp_deregister_timer = 0;
irp->irp_dereg_count = 0;
}
}
--- 2177,2187 ----
bcopy(els->els_resp_payload + 28, irp->irp_rp->rp_nwwn, 8);
stmf_wwn_to_devid_desc((scsi_devid_desc_t *)irp->irp_id,
irp->irp_rp->rp_pwwn, PROTOCOL_FIBRE_CHANNEL);
atomic_or_32(&irp->irp_flags, IRP_PLOGI_DONE);
! atomic_inc_32(&iport->iport_nrps_login);
if (irp->irp_deregister_timer) {
irp->irp_deregister_timer = 0;
irp->irp_dereg_count = 0;
}
}
*** 2223,2233 ****
break;
}
iport->iport_cached_cmdlist = icmd->icmd_next;
iport->iport_cached_ncmds--;
mutex_exit(&iport->iport_cached_cmd_lock);
! atomic_add_32(&iport->iport_total_alloced_ncmds, -1);
fct_free(icmd->icmd_cmd);
}
mutex_enter(&iport->iport_worker_lock);
return (DISC_ACTION_RESCAN);
}
--- 2223,2233 ----
break;
}
iport->iport_cached_cmdlist = icmd->icmd_next;
iport->iport_cached_ncmds--;
mutex_exit(&iport->iport_cached_cmd_lock);
! atomic_dec_32(&iport->iport_total_alloced_ncmds);
fct_free(icmd->icmd_cmd);
}
mutex_enter(&iport->iport_worker_lock);
return (DISC_ACTION_RESCAN);
}
*** 2372,2382 ****
}
}
rw_exit(&irp->irp_lock);
rw_exit(&iport->iport_lock);
! atomic_add_16(&irp->irp_nonfcp_xchg_count, 1);
atomic_or_32(&icmd->icmd_flags, ICMD_KNOWN_TO_FCA);
icmd->icmd_start_time = ddi_get_lbolt();
ret = iport->iport_port->port_send_cmd(cmd);
if (ret != FCT_SUCCESS) {
atomic_and_32(&icmd->icmd_flags, ~ICMD_KNOWN_TO_FCA);
--- 2372,2382 ----
}
}
rw_exit(&irp->irp_lock);
rw_exit(&iport->iport_lock);
! atomic_inc_16(&irp->irp_nonfcp_xchg_count);
atomic_or_32(&icmd->icmd_flags, ICMD_KNOWN_TO_FCA);
icmd->icmd_start_time = ddi_get_lbolt();
ret = iport->iport_port->port_send_cmd(cmd);
if (ret != FCT_SUCCESS) {
atomic_and_32(&icmd->icmd_flags, ~ICMD_KNOWN_TO_FCA);
*** 2761,2771 ****
do { \
ct_cmd = fct_create_solct(port, irp->irp_rp, NS_GID_PN, \
fct_gid_cb); \
if (ct_cmd) { \
uint32_t cnt; \
! cnt = atomic_add_32_nv(&irp->irp_rscn_counter, 1); \
CMD_TO_ICMD(ct_cmd)->icmd_cb_private = \
INT2PTR(cnt, void *); \
irp->irp_flags |= IRP_RSCN_QUEUED; \
fct_post_to_solcmd_queue(port, ct_cmd); \
} \
--- 2761,2771 ----
do { \
ct_cmd = fct_create_solct(port, irp->irp_rp, NS_GID_PN, \
fct_gid_cb); \
if (ct_cmd) { \
uint32_t cnt; \
! cnt = atomic_inc_32_nv(&irp->irp_rscn_counter); \
CMD_TO_ICMD(ct_cmd)->icmd_cb_private = \
INT2PTR(cnt, void *); \
irp->irp_flags |= IRP_RSCN_QUEUED; \
fct_post_to_solcmd_queue(port, ct_cmd); \
} \