Changeset View
Changeset View
Standalone View
Standalone View
sys/cam/cam_iosched.c
Show First 20 Lines • Show All 527 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
cam_iosched_ticker(void *arg) | cam_iosched_ticker(void *arg) | ||||
{ | { | ||||
struct cam_iosched_softc *isc = arg; | struct cam_iosched_softc *isc = arg; | ||||
sbintime_t now, delta; | sbintime_t now, delta; | ||||
int pending; | int pending; | ||||
callout_reset(&isc->ticker, hz / isc->quanta - 1, cam_iosched_ticker, isc); | callout_reset(&isc->ticker, hz / isc->quanta, cam_iosched_ticker, isc); | ||||
now = sbinuptime(); | now = sbinuptime(); | ||||
delta = now - isc->last_time; | delta = now - isc->last_time; | ||||
isc->this_frac = (uint32_t)delta >> 16; /* Note: discards seconds -- should be 0 harmless if not */ | isc->this_frac = (uint32_t)delta >> 16; /* Note: discards seconds -- should be 0 harmless if not */ | ||||
isc->last_time = now; | isc->last_time = now; | ||||
cam_iosched_cl_maybe_steer(&isc->cl); | cam_iosched_cl_maybe_steer(&isc->cl); | ||||
▲ Show 20 Lines • Show All 245 Lines • ▼ Show 20 Lines | for (i = none; i < limiter_max; i++) { | ||||
ios->limiter = i; | ios->limiter = i; | ||||
error = cam_iosched_limiter_init(ios); | error = cam_iosched_limiter_init(ios); | ||||
if (error != 0) { | if (error != 0) { | ||||
ios->limiter = value; | ios->limiter = value; | ||||
cam_periph_unlock(isc->periph); | cam_periph_unlock(isc->periph); | ||||
return error; | return error; | ||||
} | } | ||||
/* Note: disk load averate requires ticker to be always running */ | /* Note: disk load averate requires ticker to be always running */ | ||||
callout_reset(&isc->ticker, hz / isc->quanta - 1, cam_iosched_ticker, isc); | callout_reset(&isc->ticker, hz / isc->quanta, cam_iosched_ticker, isc); | ||||
isc->flags |= CAM_IOSCHED_FLAG_CALLOUT_ACTIVE; | isc->flags |= CAM_IOSCHED_FLAG_CALLOUT_ACTIVE; | ||||
cam_periph_unlock(isc->periph); | cam_periph_unlock(isc->periph); | ||||
return 0; | return 0; | ||||
} | } | ||||
cam_periph_unlock(isc->periph); | cam_periph_unlock(isc->periph); | ||||
return EINVAL; | return EINVAL; | ||||
▲ Show 20 Lines • Show All 219 Lines • ▼ Show 20 Lines | if (do_dynamic_iosched) { | ||||
cam_iosched_iop_stats_init(*iscp, &(*iscp)->read_stats); | cam_iosched_iop_stats_init(*iscp, &(*iscp)->read_stats); | ||||
cam_iosched_iop_stats_init(*iscp, &(*iscp)->write_stats); | cam_iosched_iop_stats_init(*iscp, &(*iscp)->write_stats); | ||||
cam_iosched_iop_stats_init(*iscp, &(*iscp)->trim_stats); | cam_iosched_iop_stats_init(*iscp, &(*iscp)->trim_stats); | ||||
(*iscp)->trim_stats.max = 1; /* Trims are special: one at a time for now */ | (*iscp)->trim_stats.max = 1; /* Trims are special: one at a time for now */ | ||||
(*iscp)->last_time = sbinuptime(); | (*iscp)->last_time = sbinuptime(); | ||||
callout_init_mtx(&(*iscp)->ticker, cam_periph_mtx(periph), 0); | callout_init_mtx(&(*iscp)->ticker, cam_periph_mtx(periph), 0); | ||||
(*iscp)->periph = periph; | (*iscp)->periph = periph; | ||||
cam_iosched_cl_init(&(*iscp)->cl, *iscp); | cam_iosched_cl_init(&(*iscp)->cl, *iscp); | ||||
callout_reset(&(*iscp)->ticker, hz / (*iscp)->quanta - 1, cam_iosched_ticker, *iscp); | callout_reset(&(*iscp)->ticker, hz / (*iscp)->quanta, cam_iosched_ticker, *iscp); | ||||
(*iscp)->flags |= CAM_IOSCHED_FLAG_CALLOUT_ACTIVE; | (*iscp)->flags |= CAM_IOSCHED_FLAG_CALLOUT_ACTIVE; | ||||
} | } | ||||
#endif | #endif | ||||
return 0; | return 0; | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 653 Lines • Show Last 20 Lines |