Blame


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"
4 28b49df3 2006-07-18 devnull
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;
10 28b49df3 2006-07-18 devnull
11 28b49df3 2006-07-18 devnull void
12 28b49df3 2006-07-18 devnull disksched(void)
13 28b49df3 2006-07-18 devnull {
14 28b49df3 2006-07-18 devnull int p, nwrite, nflush, ndirty, tdirty, toflush;
15 28b49df3 2006-07-18 devnull ulong t;
16 28b49df3 2006-07-18 devnull vlong cflush;
17 28b49df3 2006-07-18 devnull Stats *prev;
18 fa325e9b 2020-01-10 cross
19 28b49df3 2006-07-18 devnull /*
20 28b49df3 2006-07-18 devnull * no locks because all the data accesses are atomic.
21 28b49df3 2006-07-18 devnull */
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;
25 28b49df3 2006-07-18 devnull return;
26 28b49df3 2006-07-18 devnull }
27 28b49df3 2006-07-18 devnull
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];
40 28b49df3 2006-07-18 devnull
41 28b49df3 2006-07-18 devnull /* # entries written to index cache */
42 28b49df3 2006-07-18 devnull nwrite = stats.n[StatIcacheWrite] - prev->n[StatIcacheWrite];
43 fa325e9b 2020-01-10 cross
44 28b49df3 2006-07-18 devnull /* # dirty entries in index cache */
45 28b49df3 2006-07-18 devnull ndirty = stats.n[StatIcacheDirty] - prev->n[StatIcacheDirty];
46 fa325e9b 2020-01-10 cross
47 28b49df3 2006-07-18 devnull /* # entries flushed to disk */
48 28b49df3 2006-07-18 devnull nflush = nwrite - ndirty;
49 fa325e9b 2020-01-10 cross
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;
52 fa325e9b 2020-01-10 cross
53 28b49df3 2006-07-18 devnull /* assume nflush*icachesleeptime is a constant */
54 28b49df3 2006-07-18 devnull cflush = (vlong)nflush*(icachesleeptime+1);
55 fa325e9b 2020-01-10 cross
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);
58 fa325e9b 2020-01-10 cross
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;
62 28b49df3 2006-07-18 devnull else
63 28b49df3 2006-07-18 devnull icachesleeptime = cflush/toflush;
64 28b49df3 2006-07-18 devnull }
65 28b49df3 2006-07-18 devnull arenasumsleeptime = SleepForever;
66 28b49df3 2006-07-18 devnull return;
67 28b49df3 2006-07-18 devnull }
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;
72 28b49df3 2006-07-18 devnull return;
73 28b49df3 2006-07-18 devnull }
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;
77 28b49df3 2006-07-18 devnull }
78 28b49df3 2006-07-18 devnull
79 28b49df3 2006-07-18 devnull void
80 28b49df3 2006-07-18 devnull diskaccess(int level)
81 28b49df3 2006-07-18 devnull {
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));
85 28b49df3 2006-07-18 devnull return;
86 28b49df3 2006-07-18 devnull }
87 28b49df3 2006-07-18 devnull lasttime[level] = time(0);
88 28b49df3 2006-07-18 devnull }