Print this page
*** NO COMMENTS ***

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/comstar/port/pppt/pppt.c
          +++ new/usr/src/uts/common/io/comstar/port/pppt/pppt.c
↓ open down ↓ 123 lines elided ↑ open up ↑
 124  124      uint32_t size, uint32_t *pminsize, uint32_t flags);
 125  125  
 126  126  static void pppt_dbuf_free(stmf_dbuf_store_t *ds, stmf_data_buf_t *dbuf);
 127  127  
 128  128  static void pppt_sess_destroy_task(void *ps_void);
 129  129  
 130  130  static void pppt_task_sent_status(pppt_task_t *ptask);
 131  131  
 132  132  static pppt_status_t pppt_task_try_abort(pppt_task_t *ptask);
 133  133  
 134      -static pppt_status_t pppt_task_hold(pppt_task_t *ptask);
 135      -
 136  134  static void pppt_task_rele(pppt_task_t *ptask);
 137  135  
 138  136  static void pppt_task_update_state(pppt_task_t *ptask,
 139  137      pppt_task_state_t new_state);
 140  138  
 141  139  /*
 142  140   * Lock order:  global --> target --> session --> task
 143  141   */
 144  142  
 145  143  int
↓ open down ↓ 648 lines elided ↑ open up ↑
 794  792                  return (STMF_SUCCESS);
 795  793          }
 796  794  }
 797  795  
 798  796  void
 799  797  pppt_lport_task_free(scsi_task_t *task)
 800  798  {
 801  799          pppt_task_t *ptask = task->task_port_private;
 802  800          pppt_sess_t *ps = ptask->pt_sess;
 803  801  
 804      -        pppt_task_free(ptask);
      802 +        pppt_task_rele(ptask);
 805  803          pppt_sess_rele(ps);
 806  804  }
 807  805  
 808  806  /*ARGSUSED*/
 809  807  stmf_status_t
 810  808  pppt_lport_abort(stmf_local_port_t *lport, int abort_cmd, void *arg,
 811  809      uint32_t flags)
 812  810  {
 813  811          scsi_task_t     *st = (scsi_task_t *)arg;
 814  812          pppt_task_t     *ptask;
↓ open down ↓ 387 lines elided ↑ open up ↑
1202 1200  {
1203 1201          pppt_task_t     *ptask;
1204 1202          pppt_buf_t      *immed_pbuf;
1205 1203  
1206 1204          ptask = kmem_alloc(sizeof (pppt_task_t) + sizeof (pppt_buf_t) +
1207 1205              sizeof (stmf_data_buf_t), KM_NOSLEEP);
1208 1206          if (ptask != NULL) {
1209 1207                  ptask->pt_state = PTS_INIT;
1210 1208                  ptask->pt_read_buf = NULL;
1211 1209                  ptask->pt_read_xfer_msgid = 0;
1212      -                cv_init(&ptask->pt_cv, NULL, CV_DRIVER, NULL);
     1210 +                ptask->pt_refcnt = 0;
1213 1211                  mutex_init(&ptask->pt_mutex, NULL, MUTEX_DRIVER, NULL);
1214 1212                  immed_pbuf = (pppt_buf_t *)(ptask + 1);
1215 1213                  bzero(immed_pbuf, sizeof (*immed_pbuf));
1216 1214                  immed_pbuf->pbuf_is_immed = B_TRUE;
1217 1215                  immed_pbuf->pbuf_stmf_buf = (stmf_data_buf_t *)(immed_pbuf + 1);
1218 1216  
1219 1217                  bzero(immed_pbuf->pbuf_stmf_buf, sizeof (stmf_data_buf_t));
1220 1218                  immed_pbuf->pbuf_stmf_buf->db_port_private = immed_pbuf;
1221 1219                  immed_pbuf->pbuf_stmf_buf->db_sglist_length = 1;
1222 1220                  immed_pbuf->pbuf_stmf_buf->db_flags = DB_DIRECTION_FROM_RPORT |
↓ open down ↓ 2 lines elided ↑ open up ↑
1225 1223          }
1226 1224  
1227 1225          return (ptask);
1228 1226  
1229 1227  }
1230 1228  
1231 1229  void
1232 1230  pppt_task_free(pppt_task_t *ptask)
1233 1231  {
1234 1232          mutex_enter(&ptask->pt_mutex);
     1233 +        ASSERT(ptask->pt_refcnt == 0);
1235 1234          mutex_destroy(&ptask->pt_mutex);
1236      -        cv_destroy(&ptask->pt_cv);
1237 1235          kmem_free(ptask, sizeof (pppt_task_t) + sizeof (pppt_buf_t) +
1238 1236              sizeof (stmf_data_buf_t));
1239 1237  }
1240 1238  
1241 1239  pppt_status_t
1242 1240  pppt_task_start(pppt_task_t *ptask)
1243 1241  {
1244 1242          avl_index_t             where;
1245 1243  
1246 1244          ASSERT(ptask->pt_state == PTS_INIT);
1247 1245  
1248 1246          mutex_enter(&ptask->pt_sess->ps_mutex);
1249 1247          mutex_enter(&ptask->pt_mutex);
1250 1248          if (avl_find(&ptask->pt_sess->ps_task_list, ptask, &where) == NULL) {
1251 1249                  pppt_task_update_state(ptask, PTS_ACTIVE);
     1250 +                /* Manually increment refcnt, sincd we hold the mutex... */
     1251 +                ptask->pt_refcnt++;
1252 1252                  avl_insert(&ptask->pt_sess->ps_task_list, ptask, where);
1253 1253                  mutex_exit(&ptask->pt_mutex);
1254 1254                  mutex_exit(&ptask->pt_sess->ps_mutex);
1255 1255                  return (PPPT_STATUS_SUCCESS);
1256 1256          }
1257 1257          mutex_exit(&ptask->pt_mutex);
1258 1258          mutex_exit(&ptask->pt_sess->ps_mutex);
1259 1259  
1260 1260          return (PPPT_STATUS_FAIL);
1261 1261  }
↓ open down ↓ 20 lines elided ↑ open up ↑
1282 1282          default:
1283 1283                  ASSERT(0);
1284 1284          }
1285 1285  
1286 1286          mutex_exit(&ptask->pt_mutex);
1287 1287  
1288 1288          if (remove) {
1289 1289                  mutex_enter(&ptask->pt_sess->ps_mutex);
1290 1290                  avl_remove(&ptask->pt_sess->ps_task_list, ptask);
1291 1291                  mutex_exit(&ptask->pt_sess->ps_mutex);
     1292 +                /* Out of the AVL tree, so drop a reference. */
     1293 +                pppt_task_rele(ptask);
1292 1294          }
1293 1295  
1294 1296          return (pppt_status);
1295 1297  }
1296 1298  
1297 1299  void
1298 1300  pppt_task_sent_status(pppt_task_t *ptask)
1299 1301  {
1300 1302          /*
1301 1303           * If STMF tries to abort a task after the task state changed to
↓ open down ↓ 92 lines elided ↑ open up ↑
1394 1396          default:
1395 1397                  ASSERT(0);
1396 1398          }
1397 1399  
1398 1400          mutex_exit(&ptask->pt_mutex);
1399 1401  
1400 1402          if (remove) {
1401 1403                  mutex_enter(&ptask->pt_sess->ps_mutex);
1402 1404                  avl_remove(&ptask->pt_sess->ps_task_list, ptask);
1403 1405                  mutex_exit(&ptask->pt_sess->ps_mutex);
     1406 +                /* Out of the AVL tree, so drop a reference. */
     1407 +                pppt_task_rele(ptask);
1404 1408          }
1405 1409  
1406 1410          return (pppt_status);
1407 1411  }
1408 1412  
1409      -static pppt_status_t
     1413 +pppt_status_t
1410 1414  pppt_task_hold(pppt_task_t *ptask)
1411 1415  {
1412 1416          pppt_status_t   pppt_status = PPPT_STATUS_SUCCESS;
1413 1417  
1414 1418          mutex_enter(&ptask->pt_mutex);
1415 1419          if (ptask->pt_state == PTS_ACTIVE) {
1416 1420                  ptask->pt_refcnt++;
1417 1421          } else {
1418 1422                  pppt_status = PPPT_STATUS_FAIL;
1419 1423          }
1420 1424          mutex_exit(&ptask->pt_mutex);
1421 1425  
1422 1426          return (pppt_status);
1423 1427  }
1424 1428  
1425 1429  static void
1426 1430  pppt_task_rele(pppt_task_t *ptask)
1427 1431  {
     1432 +        boolean_t freeit;
     1433 +
1428 1434          mutex_enter(&ptask->pt_mutex);
1429 1435          ptask->pt_refcnt--;
1430      -        cv_signal(&ptask->pt_cv);
     1436 +        freeit = (ptask->pt_refcnt == 0);
1431 1437          mutex_exit(&ptask->pt_mutex);
     1438 +        if (freeit)
     1439 +                pppt_task_free(ptask);
1432 1440  }
1433 1441  
1434 1442  static void
1435 1443  pppt_task_update_state(pppt_task_t *ptask,
1436 1444      pppt_task_state_t new_state)
1437 1445  {
1438 1446          PPPT_LOG(CE_NOTE, "task %p %d -> %d", (void *)ptask,
1439 1447              ptask->pt_state, new_state);
1440 1448  
1441 1449          ASSERT(mutex_owned(&ptask->pt_mutex));
1442 1450          ptask->pt_state = new_state;
1443      -        cv_signal(&ptask->pt_cv);
1444 1451  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX