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); \ } \