44,12 → 44,14 |
|
/* this structure contains the status for a single budget */ |
struct budget_struct { |
TIME Q; /* budget */ |
TIME T; /* period */ |
bandwidth_t Ub; /* bandwidth */ |
TIME Q; /* Budget */ |
TIME T; /* Period */ |
TIME D; /* Deadline */ |
bandwidth_t Ub; /* Bandwidth */ |
|
struct timespec dline; /* deadline */ |
int dline_timer; /* oslib event for budget reactivation*/ |
struct timespec replenish; /* server period */ |
int replenish_timer; |
int vtimer; |
int avail; /* current budget */ |
|
91,7 → 93,7 |
} GRUBSTAR_level_des; |
|
|
static void GRUBSTAR_deadline_timer_hardreservation(void *a) |
static void GRUBSTAR_timer_hardreservation(void *a) |
{ |
struct budget_struct *b = a; |
PID p; |
103,7 → 105,7 |
kern_printf("(GS:HrdRes:"); |
#endif |
|
b->dline_timer = NIL; |
b->replenish_timer = NIL; |
|
b->last_reclaiming = 0; |
b->avail += b->Q; |
115,12 → 117,12 |
if (b->flags==GRUBSTAR_RECLAIMING && b->avail>0) |
if (lev->Uf < lev->U) lev->Uf += b->Ub; |
|
if (b->avail > 0) b->flags = GRUBSTAR_ACTIVE; |
|
if (b->current == NIL && b->flags) { |
if (iq_query_first(&(b->tasks)) != NIL) { |
JOB_TASK_MODEL job; |
|
if (b->avail > 0) b->flags = GRUBSTAR_ACTIVE; |
|
p = iq_getfirst(&b->tasks); |
|
#ifdef GRUBSTAR_DEBUG |
127,12 → 129,13 |
kern_printf("%d",p); |
#endif |
|
ADDUSEC2TIMESPEC(b->T, &b->dline); |
kern_gettime(&b->dline); |
ADDUSEC2TIMESPEC(b->D, &b->dline); |
|
b->current = p; |
|
job_task_default_model(job, b->dline); |
job_task_def_noexc(job); |
//job_task_def_noexc(job); |
level_table[ lev->scheduling_level ]-> |
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job); |
|
142,10 → 145,10 |
} |
|
if (b->flags == GRUBSTAR_NOACTIVE) { |
kern_gettime(&b->dline); |
ADDUSEC2TIMESPEC(b->T, &b->dline); |
kern_gettime(&b->replenish); |
ADDUSEC2TIMESPEC(b->T, &b->replenish); |
|
b->dline_timer=kern_event_post(&b->dline, GRUBSTAR_deadline_timer_hardreservation, b); |
b->replenish_timer=kern_event_post(&b->replenish, GRUBSTAR_timer_hardreservation, b); |
} |
|
#ifdef GRUBSTAR_DEBUG |
188,7 → 191,7 |
TIME t; |
struct timespec t2,t3; |
|
mul32div32to32(b->T,b->avail,b->Q,t); |
mul32div32to32(b->D,b->avail,b->Q,t); |
t3.tv_sec = t / 1000000; |
t3.tv_nsec = (t % 1000000) * 1000; |
|
204,8 → 207,10 |
SUBTIMESPEC(&b->dline, acttime, &t2); |
if (/* 1 */ TIMESPEC_A_LT_B(&b->dline, acttime) || |
/* 2 */ TIMESPEC_A_GT_B(&t3, &t2) ) { |
TIMESPEC_ASSIGN(&b->replenish, acttime); |
ADDUSEC2TIMESPEC(b->T, &b->replenish); |
TIMESPEC_ASSIGN(&b->dline, acttime); |
ADDUSEC2TIMESPEC(b->T, &b->dline); |
ADDUSEC2TIMESPEC(b->D, &b->dline); |
b->avail = b->Q; |
b->last_reclaiming = 0; |
} |
219,7 → 224,7 |
b->current = p; |
|
job_task_default_model(job, b->dline); |
job_task_def_noexc(job); |
//job_task_def_noexc(job); |
level_table[ lev->scheduling_level ]-> |
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job); |
|
233,7 → 238,6 |
TIME t; |
struct timespec t2,t3; |
|
|
if (b->vtimer!=NIL) kern_event_delete(b->vtimer); |
b->vtimer=NIL; |
|
259,13 → 263,15 |
if (TIMESPEC_A_LT_B(&b->dline, &schedule_time)) { |
/* we modify the deadline ... */ |
TIMESPEC_ASSIGN(&b->dline, &schedule_time); |
ADDUSEC2TIMESPEC(b->T, &b->dline); |
ADDUSEC2TIMESPEC(b->D, &b->dline); |
TIMESPEC_ASSIGN(&b->replenish, &schedule_time); |
ADDUSEC2TIMESPEC(b->T, &b->replenish); |
} |
|
if (b->flags == GRUBSTAR_NOACTIVE && b->dline_timer == NIL) { |
b->dline_timer=kern_event_post(&b->dline, GRUBSTAR_deadline_timer_hardreservation, b); |
if (b->flags == GRUBSTAR_NOACTIVE && b->replenish_timer == NIL) { |
b->replenish_timer=kern_event_post(&b->replenish, GRUBSTAR_timer_hardreservation, b); |
} else { |
mul32div32to32(b->T,b->avail,b->Q,t); |
mul32div32to32(b->D,b->avail,b->Q,t); |
t3.tv_sec = t / 1000000; |
t3.tv_nsec = (t % 1000000) * 1000; |
SUBTIMESPEC(&b->dline, &t3, &t2); |
305,7 → 311,7 |
private_extract(lev->scheduling_level, p); |
/* we modify the deadline ... */ |
kern_gettime(&b->dline); |
ADDUSEC2TIMESPEC(b->T, &b->dline); |
ADDUSEC2TIMESPEC(b->D, &b->dline); |
|
/* and the capacity */ |
b->avail = b->Q; |
320,9 → 326,9 |
|
b->flags = GRUBSTAR_ACTIVE; |
|
if (b->dline_timer!=NIL) { |
kern_event_delete(b->dline_timer); |
b->dline_timer=NIL; |
if (b->replenish_timer!=NIL) { |
kern_event_delete(b->replenish_timer); |
b->replenish_timer=NIL; |
} |
|
if (b->vtimer!=NIL) { |
333,7 → 339,7 |
|
/* and, finally, we reinsert the task in the master level */ |
job_task_default_model(job, b->dline); |
job_task_def_noexc(job); |
//job_task_def_noexc(job); |
level_table[ lev->scheduling_level ]-> |
private_insert(lev->scheduling_level, p, (TASK_MODEL *)&job); |
|
585,9 → 591,11 |
for (i=0; i<n; i++) { |
lev->b[i].Q = 0; |
lev->b[i].T = 0; |
lev->b[i].D = 0; |
lev->b[i].Ub = 0; |
NULL_TIMESPEC(&lev->b[i].dline); |
lev->b[i].dline_timer = NIL; |
NULL_TIMESPEC(&lev->b[i].replenish); |
lev->b[i].replenish_timer = NIL; |
lev->b[i].vtimer = NIL; |
lev->b[i].avail = 0; |
lev->b[i].current = -1; |
613,7 → 621,7 |
|
} |
|
int GRUBSTAR_setbudget(LEVEL l, TIME Q, TIME T, LEVEL local_scheduler_level, int scheduler_id) |
int GRUBSTAR_setbudget(LEVEL l, TIME Q, TIME T, TIME D, LEVEL local_scheduler_level, int scheduler_id) |
{ |
GRUBSTAR_level_des *lev = (GRUBSTAR_level_des *)(level_table[l]); |
int r; |
638,6 → 646,7 |
|
lev->b[r].Q = Q; |
lev->b[r].T = T; |
lev->b[r].D = D; |
lev->b[r].Ub = b; |
lev->b[r].avail = Q; |
lev->b[r].flags = GRUBSTAR_RECLAIMING; |
668,9 → 677,11 |
|
lev->b[budget].Q = 0; |
lev->b[budget].T = 0; |
lev->b[budget].D = 0; |
lev->b[budget].Ub = 0; |
NULL_TIMESPEC(&lev->b[budget].dline); |
lev->b[budget].dline_timer = NIL; |
NULL_TIMESPEC(&lev->b[budget].replenish); |
lev->b[budget].replenish_timer = NIL; |
lev->b[budget].avail = 0; |
lev->b[budget].current = -1; |
lev->b[budget].flags = GRUBSTAR_RECLAIMING; |
683,7 → 694,7 |
/* Change Q and T parameters of a budget |
* It returns the time to wait before the change is effective |
*/ |
int GRUBSTAR_adjust_budget(LEVEL l, TIME Q, TIME T, int budget) |
int GRUBSTAR_adjust_budget(LEVEL l, TIME Q, TIME T, TIME D, int budget) |
{ |
|
GRUBSTAR_level_des *lev = (GRUBSTAR_level_des *)(level_table[l]); |
697,6 → 708,7 |
|
lev->b[budget].Q = Q; |
lev->b[budget].T = T; |
lev->b[budget].D = D; |
mul32div32to32(MAX_BANDWIDTH,Q,T,lev->b[budget].Ub); |
|
lev->U += lev->b[budget].Ub; |
711,7 → 723,7 |
|
} |
|
int GRUBSTAR_getbudgetinfo(LEVEL l, TIME *Q, TIME *T, int budget) |
int GRUBSTAR_getbudgetinfo(LEVEL l, TIME *Q, TIME *T, TIME *D, int budget) |
{ |
|
GRUBSTAR_level_des *lev = (GRUBSTAR_level_des *)(level_table[l]); |
718,6 → 730,7 |
|
*Q = lev->b[budget].Q; |
*T = lev->b[budget].T; |
*D = lev->b[budget].D; |
|
return 0; |
|