Lines Matching refs:info

190 static void throttle_info_update_internal(struct _throttle_io_info_t *info, uthread_t ut, int policy, int flags, boolean_t isssd);
811 throttle_info_rel(struct _throttle_io_info_t *info)
813 SInt32 oldValue = OSDecrementAtomic(&info->throttle_refcnt);
815 DEBUG_ALLOC_THROTTLE_INFO("refcnt = %d info = %p\n",
816 info, (int)(oldValue -1), info );
820 panic("throttle info ref cnt went negative!");
826 if ((info->throttle_refcnt == 0) && (info->throttle_alloc)) {
827 DEBUG_ALLOC_THROTTLE_INFO("Freeing info = %p\n", info);
829 lck_mtx_destroy(&info->throttle_lock, throttle_mtx_grp);
830 FREE(info, M_TEMP);
837 * Just take a reference on the throttle info structure.
842 throttle_info_ref(struct _throttle_io_info_t *info)
844 SInt32 oldValue = OSIncrementAtomic(&info->throttle_refcnt);
846 DEBUG_ALLOC_THROTTLE_INFO("refcnt = %d info = %p\n",
847 info, (int)(oldValue -1), info );
849 if (info->throttle_alloc && (oldValue == 0))
850 panic("Taking a reference without calling create throttle info!\n");
859 * and dropping the reference on the info
867 throttle_timer_start(struct _throttle_io_info_t *info, boolean_t update_io_count)
875 info->throttle_io_count_begin = info->throttle_io_count;
876 info->throttle_io_period_num++;
878 microuptime(&info->throttle_start_IO_period_timestamp);
883 timevalsub(&elapsed, &info->throttle_last_IO_timestamp[throttle_level]);
900 info->throttle_timer_running = 0;
904 if (info->throttle_timer_running == 0) {
908 throttle_info_ref(info);
910 info->throttle_timer_running = 1;
914 thread_call_enter_delayed(info->throttle_timer_call, deadline);
921 throttle_timer(struct _throttle_io_info_t *info)
931 lck_mtx_lock(&info->throttle_lock);
934 timevalsub(&elapsed, &info->throttle_start_IO_period_timestamp);
937 if (elapsed_msecs >= (uint64_t)info->throttle_io_period) {
941 * after we have reset the I/O window info
946 if ((throttle_level = throttle_timer_start(info, update_io_count)) == THROTTLE_LEVEL_END) {
954 * until we are entirely done playing with 'info'
959 TAILQ_FOREACH_SAFE(ut, &info->throttle_uthlist, uu_throttlelist, utlist) {
969 TAILQ_REMOVE(&info->throttle_uthlist, ut, uu_throttlelist);
975 if (need_wakeup && !TAILQ_EMPTY(&info->throttle_uthlist)) {
980 ut = (uthread_t)TAILQ_FIRST(&info->throttle_uthlist);
981 TAILQ_REMOVE(&info->throttle_uthlist, ut, uu_throttlelist);
986 lck_mtx_unlock(&info->throttle_lock);
989 throttle_info_rel(info);
996 struct _throttle_io_info_t *info;
1011 info = &_throttle_io_info[i];
1013 lck_mtx_init(&info->throttle_lock, throttle_mtx_grp, throttle_mtx_attr);
1014 info->throttle_timer_call = thread_call_allocate((thread_call_func_t)throttle_timer, (thread_call_param_t)info);
1016 TAILQ_INIT(&info->throttle_uthlist);
1032 struct _throttle_io_info_t *info;
1034 if ((info = ut->uu_throttle_info) == NULL)
1037 lck_mtx_lock(&info->throttle_lock);
1040 TAILQ_REMOVE(&info->throttle_uthlist, ut, uu_throttlelist);
1045 lck_mtx_unlock(&info->throttle_lock);
1052 * Create and take a reference on a throttle info structure and return a
1059 struct _throttle_io_info_t *info;
1061 MALLOC(info, struct _throttle_io_info_t *, sizeof(*info), M_TEMP, M_ZERO | M_WAITOK);
1063 if (info == NULL)
1066 DEBUG_ALLOC_THROTTLE_INFO("Creating info = %p\n", info, info );
1067 info->throttle_alloc = TRUE;
1069 lck_mtx_init(&info->throttle_lock, throttle_mtx_grp, throttle_mtx_attr);
1070 info->throttle_timer_call = thread_call_allocate((thread_call_func_t)throttle_timer, (thread_call_param_t)info);
1072 TAILQ_INIT(&info->throttle_uthlist);
1075 OSIncrementAtomic(&info->throttle_refcnt);
1076 return info;
1082 * Release the throttle info pointer if all the reference are gone. Should be
1088 DEBUG_ALLOC_THROTTLE_INFO("Releaseing info = %p\n",
1098 * File Systems that create an info structure, need to call this routine in
1128 struct _throttle_io_info_t *info;
1134 info = &_throttle_io_info[dev_index];
1135 throttle_info_ref(info);
1136 *(struct _throttle_io_info_t**)throttle_info_handle = info;
1172 struct _throttle_io_info_t *info;
1175 info = &_throttle_io_info[LOWPRI_MAX_NUM_DEV - 1];
1177 info = &_throttle_io_info[mp->mnt_devbsdunit];
1179 info = mp->mnt_throttle_info;
1181 *tv = info->throttle_last_write_timestamp;
1187 struct _throttle_io_info_t *info;
1190 info = &_throttle_io_info[LOWPRI_MAX_NUM_DEV - 1];
1192 info = &_throttle_io_info[mp->mnt_devbsdunit];
1194 info = mp->mnt_throttle_info;
1196 microuptime(&info->throttle_last_write_timestamp);
1247 struct _throttle_io_info_t *info = throttle_info;
1259 timevalsub(&elapsed, &info->throttle_last_IO_timestamp[throttle_level]);
1273 if (info->throttle_io_count != info->throttle_io_count_begin) {
1288 * If we have a mount point and it has a throttle info pointer then
1290 * the correct throttle info array element.
1295 void *info;
1301 info = &_throttle_io_info[LOWPRI_MAX_NUM_DEV - 1];
1303 info = &_throttle_io_info[mp->mnt_devbsdunit];
1305 info = mp->mnt_throttle_info;
1307 return throttle_io_will_be_throttled_internal(info);
1315 struct _throttle_io_info_t *info;
1327 info = ut->uu_throttle_info;
1329 if ((sleep_amount == 0) || (info == NULL))
1335 throttle_io_period_num = info->throttle_io_period_num;
1337 while ( (throttle_type = throttle_io_will_be_throttled_internal(info)) ) {
1342 if (info->throttle_io_period_num < throttle_io_period_num)
1344 if ((info->throttle_io_period_num - throttle_io_period_num) >= (uint32_t)sleep_amount)
1348 lck_mtx_lock(&info->throttle_lock);
1351 if (info->throttle_timer_running == 0) {
1357 if (throttle_timer_start(info, TRUE) == THROTTLE_LEVEL_END)
1362 ut->uu_lowpri_window, info->throttle_io_period, info->throttle_io_count, 0, 0);
1366 TAILQ_INSERT_TAIL(&info->throttle_uthlist, ut, uu_throttlelist);
1368 TAILQ_INSERT_HEAD(&info->throttle_uthlist, ut, uu_throttlelist);
1372 msleep((caddr_t)&ut->uu_on_throttlelist, &info->throttle_lock, PRIBIO + 1, "throttle_lowpri_io", NULL);
1378 else if (info->throttle_io_period_num < throttle_io_period_num ||
1379 (info->throttle_io_period_num - throttle_io_period_num) >= (uint32_t)sleep_amount) {
1387 lck_mtx_lock(&info->throttle_lock);
1391 TAILQ_REMOVE(&info->throttle_uthlist, ut, uu_throttlelist);
1397 lck_mtx_unlock(&info->throttle_lock);
1401 ut->uu_lowpri_window, info->throttle_io_period, info->throttle_io_count, 0, 0);
1402 if (info)
1403 throttle_info_rel(info);
1429 struct _throttle_io_info_t *info;
1431 if ( (info = ut->uu_throttle_info) ) {
1432 throttle_info_rel(info);
1441 void throttle_info_set_initial_window(uthread_t ut, struct _throttle_io_info_t *info, boolean_t BC_throttle)
1445 ut->uu_throttle_info = info;
1446 throttle_info_ref(info);
1447 DEBUG_ALLOC_THROTTLE_INFO("updating info = %p\n", info, info );
1456 void throttle_info_update_internal(struct _throttle_io_info_t *info, uthread_t ut, int policy, int flags, boolean_t isssd)
1472 microuptime(&info->throttle_last_IO_timestamp[thread_throttle_level]);
1485 if (info->throttle_io_period == 0) {
1488 info->throttle_io_period = lowpri_io_period_ssd_msecs;
1490 info->throttle_io_period = lowpri_io_period_msecs;
1492 if (info->throttle_io_period < lowpri_timer_period_msecs)
1493 info->throttle_io_period = lowpri_timer_period_msecs;
1495 OSAddAtomic(1, &info->throttle_io_count);
1497 throttle_info_set_initial_window(ut, info, FALSE);
1503 struct _throttle_io_info_t *info;
1515 info = &_throttle_io_info[mp->mnt_devbsdunit];
1517 info = &_throttle_io_info[LOWPRI_MAX_NUM_DEV - 1];
1519 if (info->throttle_io_period == 0) {
1522 info->throttle_io_period = lowpri_io_period_ssd_msecs;
1524 info->throttle_io_period = lowpri_io_period_msecs;
1526 if (info->throttle_io_period < lowpri_timer_period_msecs)
1527 info->throttle_io_period = lowpri_timer_period_msecs;
1529 throttle_info_set_initial_window(ut, info, FALSE);
1567 struct _throttle_io_info_t *info = throttle_info;
1588 timevalsub(&elapsed, &info->throttle_last_IO_timestamp[throttle_level]);