1 28b49df3 2006-07-18 devnull #include "stdinc.h"
2 28b49df3 2006-07-18 devnull #include "dat.h"
3 28b49df3 2006-07-18 devnull #include "fns.h"
5 28b49df3 2006-07-18 devnull ulong lasttime[2];
6 28b49df3 2006-07-18 devnull int manualscheduling;
7 28b49df3 2006-07-18 devnull int l0quantum = 120;
8 28b49df3 2006-07-18 devnull int l1quantum = 120;
9 28b49df3 2006-07-18 devnull ulong lasticachechange;
12 28b49df3 2006-07-18 devnull disksched(void)
14 28b49df3 2006-07-18 devnull int p, nwrite, nflush, ndirty, tdirty, toflush;
16 28b49df3 2006-07-18 devnull vlong cflush;
17 28b49df3 2006-07-18 devnull Stats *prev;
20 28b49df3 2006-07-18 devnull * no locks because all the data accesses are atomic.
22 28b49df3 2006-07-18 devnull t = time(0);
23 28b49df3 2006-07-18 devnull if(manualscheduling){
24 28b49df3 2006-07-18 devnull lasticachechange = t;
28 28b49df3 2006-07-18 devnull if(t-lasttime[0] < l0quantum){
29 28b49df3 2006-07-18 devnull /* level-0 disk access going on */
30 28b49df3 2006-07-18 devnull p = icachedirtyfrac();
31 28b49df3 2006-07-18 devnull if(p < IcacheFrac*5/10){ /* can wait */
32 28b49df3 2006-07-18 devnull icachesleeptime = SleepForever;
33 28b49df3 2006-07-18 devnull lasticachechange = t;
34 28b49df3 2006-07-18 devnull }else if(p > IcacheFrac*9/10){ /* can't wait */
35 28b49df3 2006-07-18 devnull icachesleeptime = 0;
36 28b49df3 2006-07-18 devnull lasticachechange = t;
37 28b49df3 2006-07-18 devnull }else if(t-lasticachechange > 60){
38 28b49df3 2006-07-18 devnull /* have minute worth of data for current rate */
39 28b49df3 2006-07-18 devnull prev = &stathist[(stattime-60+nstathist)%nstathist];
41 28b49df3 2006-07-18 devnull /* # entries written to index cache */
42 28b49df3 2006-07-18 devnull nwrite = stats.n[StatIcacheWrite] - prev->n[StatIcacheWrite];
44 28b49df3 2006-07-18 devnull /* # dirty entries in index cache */
45 28b49df3 2006-07-18 devnull ndirty = stats.n[StatIcacheDirty] - prev->n[StatIcacheDirty];
47 28b49df3 2006-07-18 devnull /* # entries flushed to disk */
48 28b49df3 2006-07-18 devnull nflush = nwrite - ndirty;
50 28b49df3 2006-07-18 devnull /* want to stay around 70% dirty */
51 28b49df3 2006-07-18 devnull tdirty = (vlong)stats.n[StatIcacheSize]*700/1000;
53 28b49df3 2006-07-18 devnull /* assume nflush*icachesleeptime is a constant */
54 28b49df3 2006-07-18 devnull cflush = (vlong)nflush*(icachesleeptime+1);
56 28b49df3 2006-07-18 devnull /* computer number entries to write in next minute */
57 28b49df3 2006-07-18 devnull toflush = nwrite + (stats.n[StatIcacheDirty] - tdirty);
59 28b49df3 2006-07-18 devnull /* schedule for that many */
60 28b49df3 2006-07-18 devnull if(toflush <= 0 || cflush/toflush > 100000)
61 28b49df3 2006-07-18 devnull icachesleeptime = SleepForever;
63 28b49df3 2006-07-18 devnull icachesleeptime = cflush/toflush;
65 28b49df3 2006-07-18 devnull arenasumsleeptime = SleepForever;
68 28b49df3 2006-07-18 devnull if(t-lasttime[1] < l1quantum){
69 28b49df3 2006-07-18 devnull /* level-1 disk access (icache flush) going on */
70 28b49df3 2006-07-18 devnull icachesleeptime = 0;
71 28b49df3 2006-07-18 devnull arenasumsleeptime = SleepForever;
74 28b49df3 2006-07-18 devnull /* no disk access going on - no holds barred*/
75 28b49df3 2006-07-18 devnull icachesleeptime = 0;
76 28b49df3 2006-07-18 devnull arenasumsleeptime = 0;
80 28b49df3 2006-07-18 devnull diskaccess(int level)
82 28b49df3 2006-07-18 devnull if(level < 0 || level >= nelem(lasttime)){
83 54dd92be 2008-01-30 rsc fprint(2, "bad level in diskaccess; caller=%#p\n",
84 54dd92be 2008-01-30 rsc getcallerpc(&level));
87 28b49df3 2006-07-18 devnull lasttime[level] = time(0);