Print this page
5045 use atomic_{inc,dec}_* instead of atomic_add_*

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/comstar/stmf/stmf.c
          +++ new/usr/src/uts/common/io/comstar/stmf/stmf.c
↓ open down ↓ 2086 lines elided ↑ open up ↑
2087 2087                  /* register existing local ports with ppp */
2088 2088                  for (ilport = stmf_state.stmf_ilportlist; ilport != NULL;
2089 2089                      ilport = ilport->ilport_next) {
2090 2090                          /* skip standby ports and non-alua participants */
2091 2091                          if (ilport->ilport_standby == 1 ||
2092 2092                              ilport->ilport_alua == 0) {
2093 2093                                  continue;
2094 2094                          }
2095 2095                          if (alua_state->alua_node != 0) {
2096 2096                                  ilport->ilport_rtpid =
2097      -                                    atomic_add_16_nv(&stmf_rtpid_counter, 1);
     2097 +                                    atomic_inc_16_nv(&stmf_rtpid_counter);
2098 2098                          }
2099 2099                          lport = ilport->ilport_lport;
2100 2100                          ic_reg_port = ic_reg_port_msg_alloc(
2101 2101                              lport->lport_id, ilport->ilport_rtpid,
2102 2102                              0, NULL, stmf_proxy_msg_id);
2103 2103                          if (ic_reg_port) {
2104 2104                                  ic_ret = ic_tx_msg(ic_reg_port);
2105 2105                                  if (ic_ret == STMF_IC_MSG_SUCCESS) {
2106 2106                                          ilport->ilport_reg_msgid =
2107 2107                                              stmf_proxy_msg_id++;
↓ open down ↓ 1138 lines elided ↑ open up ↑
3246 3246          ilport->ilport_tg =
3247 3247              stmf_lookup_group_for_target(lport->lport_id->ident,
3248 3248              lport->lport_id->ident_length);
3249 3249  
3250 3250          /*
3251 3251           * rtpid will/must be set if this is a standby port
3252 3252           * only register ports that are not standby (proxy) ports
3253 3253           * and ports that are alua participants (ilport_alua == 1)
3254 3254           */
3255 3255          if (ilport->ilport_standby == 0) {
3256      -                ilport->ilport_rtpid = atomic_add_16_nv(&stmf_rtpid_counter, 1);
     3256 +                ilport->ilport_rtpid = atomic_inc_16_nv(&stmf_rtpid_counter);
3257 3257          }
3258 3258  
3259 3259          if (stmf_state.stmf_alua_state == 1 &&
3260 3260              ilport->ilport_standby == 0 &&
3261 3261              ilport->ilport_alua == 1) {
3262 3262                  stmf_ic_msg_t *ic_reg_port;
3263 3263                  stmf_ic_msg_status_t ic_ret;
3264 3264                  stmf_local_port_t *lport;
3265 3265                  lport = ilport->ilport_lport;
3266 3266                  ic_reg_port = ic_reg_port_msg_alloc(
↓ open down ↓ 321 lines elided ↑ open up ↑
3588 3588          mutex_enter(&stmf_state.stmf_lock);
3589 3589          rw_enter(&ilport->ilport_lock, RW_WRITER);
3590 3590          (void) stmf_session_create_lun_map(ilport, iss);
3591 3591          ilport->ilport_nsessions++;
3592 3592          iss->iss_next = ilport->ilport_ss_list;
3593 3593          ilport->ilport_ss_list = iss;
3594 3594          rw_exit(&ilport->ilport_lock);
3595 3595          mutex_exit(&stmf_state.stmf_lock);
3596 3596  
3597 3597          iss->iss_creation_time = ddi_get_time();
3598      -        ss->ss_session_id = atomic_add_64_nv(&stmf_session_counter, 1);
     3598 +        ss->ss_session_id = atomic_inc_64_nv(&stmf_session_counter);
3599 3599          iss->iss_flags &= ~ISS_BEING_CREATED;
3600 3600          /* XXX should we remove ISS_LUN_INVENTORY_CHANGED on new session? */
3601 3601          iss->iss_flags &= ~ISS_LUN_INVENTORY_CHANGED;
3602 3602          DTRACE_PROBE2(session__online, stmf_local_port_t *, lport,
3603 3603              stmf_scsi_session_t *, ss);
3604 3604          return (STMF_SUCCESS);
3605 3605  }
3606 3606  
3607 3607  void
3608 3608  stmf_deregister_scsi_session(stmf_local_port_t *lport, stmf_scsi_session_t *ss)
↓ open down ↓ 178 lines elided ↑ open up ↑
3787 3787          do {
3788 3788                  old = new = itl->itl_flags;
3789 3789                  if (old & STMF_ITL_BEING_TERMINATED)
3790 3790                          return;
3791 3791                  new |= STMF_ITL_BEING_TERMINATED;
3792 3792          } while (atomic_cas_8(&itl->itl_flags, old, new) != old);
3793 3793          itl->itl_hdlrm_reason = hdlrm_reason;
3794 3794  
3795 3795          ASSERT(itl->itl_counter);
3796 3796  
3797      -        if (atomic_add_32_nv(&itl->itl_counter, -1))
     3797 +        if (atomic_dec_32_nv(&itl->itl_counter))
3798 3798                  return;
3799 3799  
3800 3800          stmf_release_itl_handle(lu, itl);
3801 3801  }
3802 3802  
3803 3803  stmf_status_t
3804 3804  stmf_deregister_all_lu_itl_handles(stmf_lu_t *lu)
3805 3805  {
3806 3806          stmf_i_lu_t *ilu;
3807 3807          stmf_i_local_port_t *ilport;
↓ open down ↓ 337 lines elided ↑ open up ↑
4145 4145                  itask->itask_lu_next = ilu->ilu_tasks;
4146 4146                  if (ilu->ilu_tasks)
4147 4147                          ilu->ilu_tasks->itask_lu_prev = itask;
4148 4148                  ilu->ilu_tasks = itask;
4149 4149                  /* kmem_zalloc automatically makes itask->itask_lu_prev NULL */
4150 4150                  ilu->ilu_ntasks++;
4151 4151                  mutex_exit(&ilu->ilu_task_lock);
4152 4152          }
4153 4153  
4154 4154          itask->itask_ilu_task_cntr = ilu->ilu_cur_task_cntr;
4155      -        atomic_add_32(itask->itask_ilu_task_cntr, 1);
     4155 +        atomic_inc_32(itask->itask_ilu_task_cntr);
4156 4156          itask->itask_start_time = ddi_get_lbolt();
4157 4157  
4158 4158          if ((lun_map_ent != NULL) && ((itask->itask_itl_datap =
4159 4159              lun_map_ent->ent_itl_datap) != NULL)) {
4160      -                atomic_add_32(&itask->itask_itl_datap->itl_counter, 1);
     4160 +                atomic_inc_32(&itask->itask_itl_datap->itl_counter);
4161 4161                  task->task_lu_itl_handle = itask->itask_itl_datap->itl_handle;
4162 4162          } else {
4163 4163                  itask->itask_itl_datap = NULL;
4164 4164                  task->task_lu_itl_handle = NULL;
4165 4165          }
4166 4166  
4167 4167          rw_exit(iss->iss_lockp);
4168 4168          return (task);
4169 4169  }
4170 4170  
↓ open down ↓ 7 lines elided ↑ open up ↑
4178 4178          ASSERT(rw_lock_held(iss->iss_lockp));
4179 4179          itask->itask_flags = ITASK_IN_FREE_LIST;
4180 4180          itask->itask_proxy_msg_id = 0;
4181 4181          mutex_enter(&ilu->ilu_task_lock);
4182 4182          itask->itask_lu_free_next = ilu->ilu_free_tasks;
4183 4183          ilu->ilu_free_tasks = itask;
4184 4184          ilu->ilu_ntasks_free++;
4185 4185          if (ilu->ilu_ntasks == ilu->ilu_ntasks_free)
4186 4186                  cv_signal(&ilu->ilu_offline_pending_cv);
4187 4187          mutex_exit(&ilu->ilu_task_lock);
4188      -        atomic_add_32(itask->itask_ilu_task_cntr, -1);
     4188 +        atomic_dec_32(itask->itask_ilu_task_cntr);
4189 4189  }
4190 4190  
4191 4191  void
4192 4192  stmf_task_lu_check_freelist(stmf_i_lu_t *ilu)
4193 4193  {
4194 4194          uint32_t        num_to_release, ndx;
4195 4195          stmf_i_scsi_task_t *itask;
4196 4196          stmf_lu_t       *lu = ilu->ilu_lu;
4197 4197  
4198 4198          ASSERT(ilu->ilu_ntasks_min_free <= ilu->ilu_ntasks_free);
↓ open down ↓ 202 lines elided ↑ open up ↑
4401 4401              task->task_session->ss_stmf_private;
4402 4402  
4403 4403          stmf_task_audit(itask, TE_TASK_FREE, CMD_OR_IOF_NA, NULL);
4404 4404  
4405 4405          stmf_free_task_bufs(itask, lport);
4406 4406          stmf_itl_task_done(itask);
4407 4407          DTRACE_PROBE2(stmf__task__end, scsi_task_t *, task,
4408 4408              hrtime_t,
4409 4409              itask->itask_done_timestamp - itask->itask_start_timestamp);
4410 4410          if (itask->itask_itl_datap) {
4411      -                if (atomic_add_32_nv(&itask->itask_itl_datap->itl_counter,
4412      -                    -1) == 0) {
     4411 +                if (atomic_dec_32_nv(&itask->itask_itl_datap->itl_counter) ==
     4412 +                    0) {
4413 4413                          stmf_release_itl_handle(task->task_lu,
4414 4414                              itask->itask_itl_datap);
4415 4415                  }
4416 4416          }
4417 4417  
4418 4418          rw_enter(iss->iss_lockp, RW_READER);
4419 4419          lport->lport_task_free(task);
4420 4420          if (itask->itask_worker) {
4421      -                atomic_add_32(&stmf_cur_ntasks, -1);
4422      -                atomic_add_32(&itask->itask_worker->worker_ref_count, -1);
     4421 +                atomic_dec_32(&stmf_cur_ntasks);
     4422 +                atomic_dec_32(&itask->itask_worker->worker_ref_count);
4423 4423          }
4424 4424          /*
4425 4425           * After calling stmf_task_lu_free, the task pointer can no longer
4426 4426           * be trusted.
4427 4427           */
4428 4428          stmf_task_lu_free(task, iss);
4429 4429          rw_exit(iss->iss_lockp);
4430 4430  }
4431 4431  
4432 4432  void
↓ open down ↓ 5 lines elided ↑ open up ↑
4438 4438          int nv;
4439 4439          uint32_t old, new;
4440 4440          uint32_t ct;
4441 4441          stmf_worker_t *w, *w1;
4442 4442          uint8_t tm;
4443 4443  
4444 4444          if (task->task_max_nbufs > 4)
4445 4445                  task->task_max_nbufs = 4;
4446 4446          task->task_cur_nbufs = 0;
4447 4447          /* Latest value of currently running tasks */
4448      -        ct = atomic_add_32_nv(&stmf_cur_ntasks, 1);
     4448 +        ct = atomic_inc_32_nv(&stmf_cur_ntasks);
4449 4449  
4450 4450          /* Select the next worker using round robin */
4451      -        nv = (int)atomic_add_32_nv((uint32_t *)&stmf_worker_sel_counter, 1);
     4451 +        nv = (int)atomic_inc_32_nv((uint32_t *)&stmf_worker_sel_counter);
4452 4452          if (nv >= stmf_nworkers_accepting_cmds) {
4453 4453                  int s = nv;
4454 4454                  do {
4455 4455                          nv -= stmf_nworkers_accepting_cmds;
4456 4456                  } while (nv >= stmf_nworkers_accepting_cmds);
4457 4457                  if (nv < 0)
4458 4458                          nv = 0;
4459 4459                  /* Its ok if this cas fails */
4460 4460                  (void) atomic_cas_32((uint32_t *)&stmf_worker_sel_counter,
4461 4461                      s, nv);
↓ open down ↓ 56 lines elided ↑ open up ↑
4518 4518                  w->worker_task_tail->itask_worker_next = itask;
4519 4519          } else {
4520 4520                  w->worker_task_head = itask;
4521 4521          }
4522 4522          w->worker_task_tail = itask;
4523 4523          if (++(w->worker_queue_depth) > w->worker_max_qdepth_pu) {
4524 4524                  w->worker_max_qdepth_pu = w->worker_queue_depth;
4525 4525          }
4526 4526          /* Measure task waitq time */
4527 4527          itask->itask_waitq_enter_timestamp = gethrtime();
4528      -        atomic_add_32(&w->worker_ref_count, 1);
     4528 +        atomic_inc_32(&w->worker_ref_count);
4529 4529          itask->itask_cmd_stack[0] = ITASK_CMD_NEW_TASK;
4530 4530          itask->itask_ncmds = 1;
4531 4531          stmf_task_audit(itask, TE_TASK_START, CMD_OR_IOF_NA, dbuf);
4532 4532          if (dbuf) {
4533 4533                  itask->itask_allocated_buf_map = 1;
4534 4534                  itask->itask_dbufs[0] = dbuf;
4535 4535                  dbuf->db_handle = 0;
4536 4536          } else {
4537 4537                  itask->itask_allocated_buf_map = 0;
4538 4538                  itask->itask_dbufs[0] = NULL;
↓ open down ↓ 67 lines elided ↑ open up ↑
4606 4606                          new = old = itask->itask_flags;
4607 4607                          if (new & ITASK_BEING_ABORTED)
4608 4608                                  return (STMF_ABORTED);
4609 4609                          new &= ~ITASK_KNOWN_TO_LU;
4610 4610                  } while (atomic_cas_32(&itask->itask_flags, old, new) != old);
4611 4611          }
4612 4612          if (itask->itask_flags & ITASK_BEING_ABORTED)
4613 4613                  return (STMF_ABORTED);
4614 4614  #ifdef  DEBUG
4615 4615          if (!(ioflags & STMF_IOF_STATS_ONLY) && stmf_drop_buf_counter > 0) {
4616      -                if (atomic_add_32_nv((uint32_t *)&stmf_drop_buf_counter, -1) ==
     4616 +                if (atomic_dec_32_nv((uint32_t *)&stmf_drop_buf_counter) ==
4617 4617                      1)
4618 4618                          return (STMF_SUCCESS);
4619 4619          }
4620 4620  #endif
4621 4621  
4622 4622          stmf_update_kstat_lu_io(task, dbuf);
4623 4623          stmf_update_kstat_lport_io(task, dbuf);
4624 4624          stmf_lport_xfer_start(itask, dbuf);
4625 4625          if (ioflags & STMF_IOF_STATS_ONLY) {
4626 4626                  stmf_lport_xfer_done(itask, dbuf);
↓ open down ↓ 1076 lines elided ↑ open up ↑
5703 5703          uint16_t gen_number;
5704 5704  
5705 5705          if (company_id == COMPANY_ID_NONE)
5706 5706                  company_id = COMPANY_ID_SUN;
5707 5707  
5708 5708          if (lu_id->ident_length != 0x10)
5709 5709                  return (STMF_INVALID_ARG);
5710 5710  
5711 5711          p = (uint8_t *)lu_id;
5712 5712  
5713      -        gen_number = atomic_add_16_nv(&stmf_lu_id_gen_number, 1);
     5713 +        gen_number = atomic_inc_16_nv(&stmf_lu_id_gen_number);
5714 5714  
5715 5715          p[0] = 0xf1; p[1] = 3; p[2] = 0; p[3] = 0x10;
5716 5716          p[4] = ((company_id >> 20) & 0xf) | 0x60;
5717 5717          p[5] = (company_id >> 12) & 0xff;
5718 5718          p[6] = (company_id >> 4) & 0xff;
5719 5719          p[7] = (company_id << 4) & 0xf0;
5720 5720          if (hid == 0 && !localetheraddr((struct ether_addr *)NULL, &mac)) {
5721 5721                  hid = BE_32((int)zone_get_hostid(NULL));
5722 5722          }
5723 5723          if (hid != 0) {
↓ open down ↓ 611 lines elided ↑ open up ↑
6335 6335                  case ITASK_CMD_NEW_TASK:
6336 6336                          iss = (stmf_i_scsi_session_t *)
6337 6337                              task->task_session->ss_stmf_private;
6338 6338                          stmf_itl_lu_new_task(itask);
6339 6339                          if (iss->iss_flags & ISS_LUN_INVENTORY_CHANGED) {
6340 6340                                  if (stmf_handle_cmd_during_ic(itask))
6341 6341                                          break;
6342 6342                          }
6343 6343  #ifdef  DEBUG
6344 6344                          if (stmf_drop_task_counter > 0) {
6345      -                                if (atomic_add_32_nv(
6346      -                                    (uint32_t *)&stmf_drop_task_counter,
6347      -                                    -1) == 1) {
     6345 +                                if (atomic_dec_32_nv((uint32_t *)&stmf_drop_task_counter) ==
     6346 +                                    1) {
6348 6347                                          break;
6349 6348                                  }
6350 6349                          }
6351 6350  #endif
6352 6351                          DTRACE_PROBE1(scsi__task__start, scsi_task_t *, task);
6353 6352                          lu->lu_new_task(task, dbuf);
6354 6353                          break;
6355 6354                  case ITASK_CMD_DATA_XFER_DONE:
6356 6355                          lu->lu_dbuf_xfer_done(task, dbuf);
6357 6356                          break;
↓ open down ↓ 1639 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX