*use atomic instructions for counting, rather than locking *don't sched unless there's just a single processor when there is process priority inversion *iprint in atomic context Reference: /n/atom/patch/applied/qiosched Date: Mon Aug 17 06:15:32 CES 2015 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/port/qio.c Mon Aug 17 06:14:13 2015 +++ /sys/src/nix/port/qio.c Mon Aug 17 06:14:15 2015 @@ -31,7 +31,6 @@ }; static uvlong count[Ncount]; -static Lock countlk; static int debugging; @@ -76,20 +75,19 @@ uint qiomaxatomic = Maxatomic; +extern uvlong ainc64(uvlong*); /* sic */ +extern uvlong aadd64(uvlong*, uvlong); /* sic */ + static void counter(int i) { - ilock(&countlk); - count[i]++; - iunlock(&countlk); + ainc64(count+i); } static void bytes(int i, int n) { - ilock(&countlk); - count[i] += n; - iunlock(&countlk); + aadd64(count+i, n); } char* @@ -218,7 +216,7 @@ int len; Block *nb, *f; - if(bp->next == 0) + if(bp->next == nil) return bp; nb = allocb(blocklen(bp)); @@ -1277,7 +1275,7 @@ p = wakeup(&q->rr); /* if we just wokeup a higher priority process, let it run */ - if(p != nil && p->priority > up->priority){ + if(p != nil && p->priority > up->priority && sys->nproc == 1){ counter(Cqbwritepricnt); sched(); } @@ -1322,7 +1320,7 @@ uchar *p = vp; QDEBUG if(!islo()) - print("qwrite hi %#p\n", getcallerpc(&q)); + iprint("qwrite hi %#p\n", getcallerpc(&q)); sofar = 0; do {