From owner-freebsd-hackers Wed Jul 31 9:29:32 2002 Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 2B25937B401 for ; Wed, 31 Jul 2002 09:29:26 -0700 (PDT) Received: from mail.malarhojden.nu (malarhojden.nu [195.54.99.114]) by mx1.FreeBSD.org (Postfix) with SMTP id 1102643E3B for ; Wed, 31 Jul 2002 09:29:21 -0700 (PDT) (envelope-from daniel@malarhojden.nu) Received: (qmail 72208 invoked by uid 1000); 31 Jul 2002 16:30:57 -0000 Date: Wed, 31 Jul 2002 18:30:57 +0200 From: Daniel Lundqvist To: Terry Lambert Cc: freebsd-hackers@freebsd.org Subject: Re: select()/poll() i kernel. Message-ID: <20020731163057.GB72029@malarhojden.nu> References: <20020730152514.GA66448@malarhojden.nu> <3D471152.4347ABD1@mindspring.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3D471152.4347ABD1@mindspring.com> User-Agent: Mutt/1.3.27i Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG On Tue, Jul 30, 2002 at 03:21:06PM -0700, Terry Lambert wrote: > Daniel Lundqvist wrote: > > I was wondering if there is a select()/poll() for use in kernel by > > kernel threads? I've been looking around in sys/kern/ but didn't find anything. > > I'm currently developing under 4.6. > > > > Please CC me since I'm not a member of the list. > > 4.6 does not have kernel threads; it has kernel processes (kproc's), > however, which are just standard processes which have been assumed > to have entered the kernel. As such, they are suitable for use as a > context for blocking operations (you can only sleep things that have > the ability to have scheduler queue entries, and therefore be awakened > at a later time). > > There is no explicit support for a "select" call; most operations on > file descriptors assume a process context in user space from which > parameters can be copied, and results copied out. > > Rather than correcting the FreeBSD model to internally add a space > identifier parameter to the body of the call, and make the system > calls call that, instead of being directly wired in, you have two > real options: > > 1) Use "The mmap trick" to obtain memory in the user space > portion of the kproc address space, so that when uiomove > and/or copyin/copyout operate, they have someplace to get > or put the data. > > 2) Write the moral equivalent of the select(2) (or poll(2)) > code that can be called from kernel space, and call it > from your kproc. > > Note that either of these will *only* work from a kproc, where the > current process identfier is the kproc. So you can't use them in > fault handlers or interrupt handlers, if that's what yu are thinking. > > Really, FreeBSD needs a better abstraction of the file I/O and other > operations in kernel space, so that doing this type of work is much > easier. > > On the other hand... it's likely that your expectations of how a > kproc can be used as if it were a kernel thread are unreasonable, > so maybe it's just as well that there is not explicit support for > this kind of thing, like there is in Linux, AIX, and Solaris. OK... maybe if I describe what I want to do someone might have a better solution. Basically I have an kernel module that should act as a filter towars clients running in user space. The clients will tell the module what kind of messages it's intrested in. It will be used as a messaging bus running over multicast. This is just to test a couple of ideas of mine. If it doesn't work I'll have to come up with something new :) This is what the kernel module will do: * Bind up an UDP socket on INADDR_ANY and joins an multicast group * Register a character device /dev/ih * Distribute incoming message to all interested applications * Send out messages from applications A client will then open /dev/ih and run a couple of ioctls to tell the module which messages it want. Using the filedescriptor returned from the open it should be able to read()/write() like on any other descriptor. The kernel module will keep a list of applications using it and will distribute incoming messages to all interested applications. It will also take care of writes to /dev/ih and send them out on the UDP socket. If there is no kernel select()/poll() I see no other way to write the kproc function as follows: void kproc (void) { init; while(running) { check UDP socket; for all applications check for writes; sleep(); } } If anyone has a better solution to this I'm all ears. Kind regards, Daniel Lundqvist To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message