From owner-freebsd-current Tue Jul 9 5: 5:16 2002 Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 6431937B401 for ; Tue, 9 Jul 2002 05:05:09 -0700 (PDT) Received: from mail.speakeasy.net (mail11.speakeasy.net [216.254.0.211]) by mx1.FreeBSD.org (Postfix) with ESMTP id E6D9943E09 for ; Tue, 9 Jul 2002 05:05:08 -0700 (PDT) (envelope-from jhb@FreeBSD.org) Received: (qmail 7855 invoked from network); 9 Jul 2002 12:05:08 -0000 Received: from unknown (HELO server.baldwin.cx) ([216.27.160.63]) (envelope-sender ) by mail11.speakeasy.net (qmail-ldap-1.03) with DES-CBC3-SHA encrypted SMTP for ; 9 Jul 2002 12:05:08 -0000 Received: from laptop.baldwin.cx (laptop.baldwin.cx [192.168.0.4]) by server.baldwin.cx (8.11.6/8.11.6) with ESMTP id g69C57f08495; Tue, 9 Jul 2002 08:05:07 -0400 (EDT) (envelope-from jhb@FreeBSD.org) Message-ID: X-Mailer: XFMail 1.5.2 on FreeBSD X-Priority: 3 (Normal) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit MIME-Version: 1.0 In-Reply-To: Date: Tue, 09 Jul 2002 08:05:18 -0400 (EDT) From: John Baldwin To: Julian Elischer Subject: RE: userret() , ast() and the end of syscalls Cc: FreeBSD current users Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG On 09-Jul-2002 Julian Elischer wrote: > > A question to those who know.. > > why is userret() called both at the end of trap() or syscall() > and also almost immediatly again (often) at the end of ast(). ast() is really a special form of a trap that is triggered by doing a last-minute type check on return to userland to see if we still have work to do. > It seems that really there is no one place that one can put code that will > be called ONCE and ONLY ONCE as a thread progresses to userland. Sure there is. When you want an action done, set a thread flag marking the request and set TDF_ASTPENDING. Then handle it in ast() if the flag is set. > There is no one place where you can say "after this point we are in > userland" right up until that iret instruction. There is always the danger > that FTER ny insruction that decides that we are now definitly going to > user space, there could occur an interrupt that causes a reschedule so > that some OTHER thread goes to user land. > > Is it possible to clear interrupts and have the iret instruction > itself re-enable them? > (that would give a few instructions 'atomically' with the iret > which may be all I need). Remember how ast() used to do a critical_enter() before it grabbed sched_lock to check flags and dropped the critical section while handling the flags? This is exactly what you have asked for above. The loop and the critical sections then got pushed back into the MD code but still work the same. > is this possible in other architectures? It already works that way on all architectures. -- John Baldwin <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve!" - http://www.FreeBSD.org/ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message