From b73c2bce143fa3eddf775354e7dc66cf1aa434c3 Mon Sep 17 00:00:00 2001 From: Giacomo Tesio Date: Fri, 8 Dec 2017 01:53:32 +0100 Subject: [PATCH] kern: awake & dev9p: do not interrupt Tflush to avoid consuming all tags --- sys/src/kern/port/awake.c | 13 +++++++++++++ sys/src/kern/port/dev9p.c | 22 ++++++++++++++++++++++ sys/src/kern/port/portfns.h | 2 ++ 3 files changed, 37 insertions(+) diff --git a/sys/src/kern/port/awake.c b/sys/src/kern/port/awake.c index ee9e744..e6f211d 100644 --- a/sys/src/kern/port/awake.c +++ b/sys/src/kern/port/awake.c @@ -239,6 +239,19 @@ awake_fell_asleep(Proc *p) } } +Syscalls +awake_disable(void) +{ + Syscalls blockingsc = up->wakeups[up->notified].blockingsc; + up->wakeups[up->notified].blockingsc = 0; + return blockingsc; +} +void +awake_enable(Syscalls s) +{ + up->wakeups[up->notified].blockingsc = s; +} + int awake_should_wake_up(Proc *p) { diff --git a/sys/src/kern/port/dev9p.c b/sys/src/kern/port/dev9p.c index 287b3d1..8765057 100644 --- a/sys/src/kern/port/dev9p.c +++ b/sys/src/kern/port/dev9p.c @@ -805,6 +805,7 @@ mountio(Mnt *mnt, Mntrpc *r) { Block *b; int n; + Syscalls awksysc; while(waserror()) { if(mnt->rip == up) @@ -854,7 +855,28 @@ mountio(Mnt *mnt, Mntrpc *r) if(mnt->rip == nil) break; unlock(&mnt->l); + if(r->request.type == Tflush){ + /* Tflush must not be interrupted by awake + * or we will consume all tags trying: since + * awake cannot know that it's not worth to + * flush an interrupted flush it will interrupt + * them all and each interrupt will cause + * a new flush to be sent. + * + * TODO: verify we do not have to do the same + * with notes + */ + awksysc = awake_disable(); + if(waserror()){ + awake_enable(awksysc); + nexterror(); + } + } sleep(r->z, rpcattn, r); + if(r->request.type == Tflush){ + awake_enable(awksysc); + poperror(); + } if(r->done){ poperror(); mntflushfree(mnt, r); diff --git a/sys/src/kern/port/portfns.h b/sys/src/kern/port/portfns.h index 3c2a17a..e3f100f 100644 --- a/sys/src/kern/port/portfns.h +++ b/sys/src/kern/port/portfns.h @@ -33,6 +33,8 @@ Block* allocb(int); Block* allocbalign(int, int); int anyhigher(void); int anyready(void); +Syscalls awake_disable(void); +void awake_enable(Syscalls s); void awake_tick(unsigned long tick); void awake_timer(void*); void awake_ringer(void*);