Print this page
NEX-13937 Improve kstat performance
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-4425 support KSTAT_DATA_STRING in non-virtual named kstats
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/os/kstat_fr.c
          +++ new/usr/src/uts/common/os/kstat_fr.c
↓ open down ↓ 1298 lines elided ↑ open up ↑
1299 1299                  kstat_delete(ksp);
1300 1300          }
1301 1301  }
1302 1302  
1303 1303  void
1304 1304  kstat_delete_byname(const char *ks_module, int ks_instance, const char *ks_name)
1305 1305  {
1306 1306          kstat_delete_byname_zone(ks_module, ks_instance, ks_name, ALL_ZONES);
1307 1307  }
1308 1308  
1309      -/*
1310      - * The sparc V9 versions of these routines can be much cheaper than
1311      - * the poor 32-bit compiler can comprehend, so they're in sparcv9_subr.s.
1312      - * For simplicity, however, we always feed the C versions to lint.
1313      - */
1314      -#if !defined(__sparc) || defined(lint) || defined(__lint)
1315      -
1316 1309  void
1317      -kstat_waitq_enter(kstat_io_t *kiop)
     1310 +kstat_waitq_enter_time(kstat_io_t *kiop, const hrtime_t new)
1318 1311  {
1319      -        hrtime_t new, delta;
     1312 +        hrtime_t delta;
1320 1313          ulong_t wcnt;
1321 1314  
1322      -        new = gethrtime_unscaled();
     1315 +        ASSERT(kiop != NULL);
1323 1316          delta = new - kiop->wlastupdate;
1324 1317          kiop->wlastupdate = new;
1325 1318          wcnt = kiop->wcnt++;
1326 1319          if (wcnt != 0) {
1327 1320                  kiop->wlentime += delta * wcnt;
1328 1321                  kiop->wtime += delta;
1329 1322          }
1330 1323  }
1331 1324  
1332 1325  void
1333      -kstat_waitq_exit(kstat_io_t *kiop)
     1326 +kstat_waitq_exit_time(kstat_io_t *kiop, const hrtime_t new)
1334 1327  {
1335      -        hrtime_t new, delta;
     1328 +        hrtime_t delta;
1336 1329          ulong_t wcnt;
1337 1330  
1338      -        new = gethrtime_unscaled();
     1331 +        ASSERT(kiop != NULL);
1339 1332          delta = new - kiop->wlastupdate;
1340 1333          kiop->wlastupdate = new;
1341 1334          wcnt = kiop->wcnt--;
1342 1335          ASSERT((int)wcnt > 0);
1343 1336          kiop->wlentime += delta * wcnt;
1344 1337          kiop->wtime += delta;
1345 1338  }
1346 1339  
1347 1340  void
1348      -kstat_runq_enter(kstat_io_t *kiop)
     1341 +kstat_runq_enter_time(kstat_io_t *kiop, const hrtime_t new)
1349 1342  {
1350      -        hrtime_t new, delta;
     1343 +        hrtime_t delta;
1351 1344          ulong_t rcnt;
1352 1345  
1353      -        new = gethrtime_unscaled();
     1346 +        ASSERT(kiop != NULL);
1354 1347          delta = new - kiop->rlastupdate;
1355 1348          kiop->rlastupdate = new;
1356 1349          rcnt = kiop->rcnt++;
1357 1350          if (rcnt != 0) {
1358 1351                  kiop->rlentime += delta * rcnt;
1359 1352                  kiop->rtime += delta;
1360 1353          }
1361 1354  }
1362 1355  
1363 1356  void
1364      -kstat_runq_exit(kstat_io_t *kiop)
     1357 +kstat_runq_exit_time(kstat_io_t *kiop, const hrtime_t new)
1365 1358  {
1366      -        hrtime_t new, delta;
     1359 +        hrtime_t delta;
1367 1360          ulong_t rcnt;
1368 1361  
1369      -        new = gethrtime_unscaled();
     1362 +        ASSERT(kiop != NULL);
1370 1363          delta = new - kiop->rlastupdate;
1371 1364          kiop->rlastupdate = new;
1372 1365          rcnt = kiop->rcnt--;
1373 1366          ASSERT((int)rcnt > 0);
1374 1367          kiop->rlentime += delta * rcnt;
1375 1368          kiop->rtime += delta;
1376 1369  }
1377 1370  
     1371 +/*
     1372 + * The sparc V9 versions of these routines can be much cheaper than
     1373 + * the poor 32-bit compiler can comprehend, so they're in sparcv9_subr.s.
     1374 + * For simplicity, however, we always feed the C versions to lint.
     1375 + */
     1376 +#if !defined(__sparc) || defined(lint) || defined(__lint)
     1377 +
1378 1378  void
1379      -kstat_waitq_to_runq(kstat_io_t *kiop)
     1379 +kstat_waitq_enter(kstat_io_t *kiop)
1380 1380  {
1381      -        hrtime_t new, delta;
1382      -        ulong_t wcnt, rcnt;
     1381 +        kstat_waitq_enter_time(kiop, gethrtime_unscaled());
     1382 +}
1383 1383  
1384      -        new = gethrtime_unscaled();
     1384 +void
     1385 +kstat_waitq_exit(kstat_io_t *kiop)
     1386 +{
     1387 +        kstat_waitq_exit_time(kiop, gethrtime_unscaled());
     1388 +}
1385 1389  
1386      -        delta = new - kiop->wlastupdate;
1387      -        kiop->wlastupdate = new;
1388      -        wcnt = kiop->wcnt--;
1389      -        ASSERT((int)wcnt > 0);
1390      -        kiop->wlentime += delta * wcnt;
1391      -        kiop->wtime += delta;
     1390 +void
     1391 +kstat_runq_enter(kstat_io_t *kiop)
     1392 +{
     1393 +        kstat_runq_enter_time(kiop, gethrtime_unscaled());
     1394 +}
1392 1395  
1393      -        delta = new - kiop->rlastupdate;
1394      -        kiop->rlastupdate = new;
1395      -        rcnt = kiop->rcnt++;
1396      -        if (rcnt != 0) {
1397      -                kiop->rlentime += delta * rcnt;
1398      -                kiop->rtime += delta;
1399      -        }
     1396 +void
     1397 +kstat_runq_exit(kstat_io_t *kiop)
     1398 +{
     1399 +        kstat_runq_exit_time(kiop, gethrtime_unscaled());
1400 1400  }
1401 1401  
1402 1402  void
1403      -kstat_runq_back_to_waitq(kstat_io_t *kiop)
     1403 +kstat_waitq_to_runq(kstat_io_t *kiop)
1404 1404  {
1405      -        hrtime_t new, delta;
1406      -        ulong_t wcnt, rcnt;
     1405 +        hrtime_t new = gethrtime_unscaled();
     1406 +        ASSERT(kiop != NULL);
     1407 +        kstat_waitq_exit_time(kiop, new);
     1408 +        kstat_runq_enter_time(kiop, new);
     1409 +}
1407 1410  
1408      -        new = gethrtime_unscaled();
1409      -
1410      -        delta = new - kiop->rlastupdate;
1411      -        kiop->rlastupdate = new;
1412      -        rcnt = kiop->rcnt--;
1413      -        ASSERT((int)rcnt > 0);
1414      -        kiop->rlentime += delta * rcnt;
1415      -        kiop->rtime += delta;
1416      -
1417      -        delta = new - kiop->wlastupdate;
1418      -        kiop->wlastupdate = new;
1419      -        wcnt = kiop->wcnt++;
1420      -        if (wcnt != 0) {
1421      -                kiop->wlentime += delta * wcnt;
1422      -                kiop->wtime += delta;
1423      -        }
     1411 +void
     1412 +kstat_runq_back_to_waitq(kstat_io_t *kiop)
     1413 +{
     1414 +        hrtime_t new = gethrtime_unscaled();
     1415 +        ASSERT(kiop != NULL);
     1416 +        kstat_runq_exit_time(kiop, new);
     1417 +        kstat_waitq_enter_time(kiop, new);
1424 1418  }
1425 1419  
1426 1420  #endif
1427 1421  
1428 1422  void
1429 1423  kstat_timer_start(kstat_timer_t *ktp)
1430 1424  {
1431 1425          ktp->start_time = gethrtime();
1432 1426  }
1433 1427  
↓ open down ↓ 16 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX