Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 747 → Rev 748

/shark/trunk/kernel/modules/elastic.c
138,8 → 138,8
ADDUSEC2TIMESPEC(et->T, &et->dline);
 
#ifdef ELASTIC_DEBUG
cprintf("At %s: activating %s; rel=%s; dl=%s\n", pnow(), proc_table[p].name,
ptime1(&et->release), ptime2(&et->dline));
/* cprintf("At %s: activating %s; rel=%s; dl=%s\n", pnow(), proc_table[p].name,
ptime1(&et->release), ptime2(&et->dline)); */
#endif
 
mul32div32to32(et->C,lev->c_scaling_factor,SCALING_UNIT,proc_table[p].avail_time);
498,8 → 498,9
ELASTIC_level_des *lev = (ELASTIC_level_des *)(level_table[l]);
ELASTIC_task_descr *et = &lev->elist[p];
 
if (et->dltimer != -1)
if (et->dltimer != -1) {
kern_event_delete(et->dltimer);
}
 
if (et->flags & ELASTIC_JOB_PRESENT) {
level_table[ lev->scheduling_level ]->
566,8 → 567,9
}
 
 
/* Force the period of task p to a given value */
 
/* Force the period of task p to a given value (between Tmin and Tmax) */
 
int ELASTIC_set_period(PID p, TIME period) {
 
SYS_FLAGS f;
574,6 → 576,7
int saveE;
unsigned int temp;
ext_bandwidth_t saveU;
TIME saveT;
 
f = kern_fsave();
 
581,19 → 584,27
lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level];
ELASTIC_task_descr *et = &lev->elist[p];
 
if (period < et->Tmin || period > et->Tmax) {
kern_frestore(f);
return -1;
}
 
saveE = et->E;
saveU = et->U;
saveT = et->T;
 
et->E = 0; /* set elasticity to zero to force period */
mul32div32to32(et->C,lev->c_scaling_factor,SCALING_UNIT,temp);
et->U = ((long long)MAX_BANDWIDTH * (long long)(temp))/((long long)period);
et->T = period;
if (ELASTIC_compress(lev) == -1) {
#ifdef ELASTIC_DEBUG
cprintf("ELASTIC_set_period failed: could not compress\n");
cprintf("ELASTIC_set_period failed!\n");
#endif
et->E = saveE;
et->U = saveU;
et->T = saveT;
kern_frestore(f);
return -1;
}
633,6 → 644,9
ELASTIC_level_des *lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level];
ELASTIC_task_descr *et = &lev->elist[p];
TIME saveTmin;
TIME saveT;
ext_bandwidth_t saveU;
unsigned int temp;
 
f = kern_fsave();
639,13 → 653,23
if (et->flags & ELASTIC_PRESENT) {
saveTmin = et->Tmin;
saveT = et->T;
saveU = et->U;
et->Tmin = Tmin;
if (Tmin > et->T) {
et->T = Tmin;
mul32div32to32(et->C,lev->c_scaling_factor,SCALING_UNIT,temp);
et->U = ((long long)MAX_BANDWIDTH * (long long)(temp))/((long long)Tmin);
}
 
if (ELASTIC_compress(lev) == -1) {
#ifdef ELASTIC_DEBUG
cprintf("ELASTIC_set_Tmin failed: could not compress\n");
#endif
et->Tmin = saveTmin;
et->T = saveT;
et->U = saveU;
kern_frestore(f);
return -1;
}
685,6 → 709,53
}
 
 
int ELASTIC_set_Tmax(PID p, TIME Tmax)
{
SYS_FLAGS f;
ELASTIC_level_des *lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level];
ELASTIC_task_descr *et = &lev->elist[p];
TIME saveTmax;
TIME saveT;
ext_bandwidth_t saveU;
unsigned int temp;
 
f = kern_fsave();
if (et->flags & ELASTIC_PRESENT) {
saveTmax = et->Tmax;
saveT = et->T;
saveU = et->U;
et->Tmax = Tmax;
if (Tmax < et->T) {
et->T = Tmax;
mul32div32to32(et->C,lev->c_scaling_factor,SCALING_UNIT,temp);
et->U = ((long long)MAX_BANDWIDTH * (long long)(temp))/((long long)Tmax);
}
 
if (ELASTIC_compress(lev) == -1) {
#ifdef ELASTIC_DEBUG
cprintf("ELASTIC_set_Tmax failed: could not compress\n");
#endif
et->Tmax = saveTmax;
et->T = saveT;
et->U = saveU;
kern_frestore(f);
return -1;
}
kern_frestore(f);
return 0;
} else {
 
kern_frestore(f);
return -1;
}
}
 
 
int ELASTIC_get_Tmax(PID p) {
 
SYS_FLAGS f;
708,7 → 779,48
 
}
 
int ELASTIC_set_C(PID p, TIME C)
{
SYS_FLAGS f;
ELASTIC_level_des *lev = (ELASTIC_level_des *)level_table[proc_table[p].task_level];
ELASTIC_task_descr *et = &lev->elist[p];
TIME saveC;
ext_bandwidth_t saveU;
unsigned int temp;
 
f = kern_fsave();
if (et->flags & ELASTIC_PRESENT) {
saveC = et->C;
saveU = et->U;
et->C = C;
 
mul32div32to32(et->C,lev->c_scaling_factor,SCALING_UNIT,temp);
et->U = ((long long)MAX_BANDWIDTH * (long long)(temp))/((long long)et->T);
 
if (ELASTIC_compress(lev) == -1) {
#ifdef ELASTIC_DEBUG
cprintf("ELASTIC_set_C failed: could not compress\n");
#endif
et->C = saveC;
et->U = saveU;
kern_frestore(f);
return -1;
}
kern_frestore(f);
return 0;
} else {
 
kern_frestore(f);
return -1;
}
}
 
 
int ELASTIC_get_C(PID p) {
 
SYS_FLAGS f;
/shark/trunk/include/modules/elastic.h
53,8 → 53,13
int ELASTIC_set_period(PID p, TIME period);
int ELASTIC_get_period(PID p);
 
int ELASTIC_set_Tmin(PID p, TIME Tmin);
int ELASTIC_get_Tmin(PID p);
 
int ELASTIC_set_Tmax(PID p, TIME Tmax);
int ELASTIC_get_Tmax(PID p);
 
int ELASTIC_set_C(PID p, TIME C);
int ELASTIC_get_C(PID p);
 
int ELASTIC_set_E(PID p, int E);