Date: Tue, 4 Aug 2009 08:08:04 -0400 From: John Baldwin <jhb@freebsd.org> To: freebsd-hackers@freebsd.org Cc: Maslan <maslanbsd@gmail.com>, Dag-Erling =?iso-8859-1?q?Sm=F8rgrav?= <des@des.no> Subject: Re: sosend() and mbuf Message-ID: <200908040808.05074.jhb@freebsd.org> In-Reply-To: <319cceca0908031425r3516de29q34807cdf2c7489ed@mail.gmail.com> References: <319cceca0908030119i3432a495ya60aa431dab0e1b1@mail.gmail.com> <86eirs65gb.fsf@ds4.des.no> <319cceca0908031425r3516de29q34807cdf2c7489ed@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Monday 03 August 2009 5:25:27 pm Maslan wrote: > No my code doesn't work, I thought it may be because that soaccept() > -which is not found in man 9- is non-blocking, so i've to put my code > in a thread. > Now i got another problem, when I open a text file from this thread, > the kernel crashes, I'm sure that its the thread. > > kthread_create((void *)thread_main, NULL, NULL, RFNOWAIT, 0, "thread"); > > void thread_main(){ > struct thread *td = curthread; > int ret; > int fd; > ret = f_open("/path/to/file.txt", &fd); > printf("%d\n", ret); > tsleep(td, PDROP, "test tsleep", 10*hz); > f_close(fd); > kthread_exit(0); > } > > int f_open(char *filename, int *fd){ > struct thread *td = curthread; > int ret = kern_open(td, filename, UIO_SYSSPACE, O_RDONLY, FREAD); > if(!ret){ > *fd = td->td_retval[0]; > return 1; > } > return 0; > } kthread's / kproc's do not have a valid file descriptor table. I think you are probably not going to be happy trying to stuff a full httpd in the kernel, btw. I think instead you should look at creative ways of exposing certain bits of what you need to userland instead where possible. Alternatively, you could use a caching accelerator of some sort that maps known URLs to specific vnodes so you can reply to those directly, but when you miss in your cache you wake up a userland process which processes the URL and opens a file and you can then save the vnode from that file handle in your cache. However, stuffing httpd into the kernel may not buy you an appreciable amount of gain relative to the expense of making it work. BTW, kern_open() "works" in your module handler because the module handler runs in the kernel half of the thread from the kldload command. And when you do "kern_open()" you are actually opening a new file descriptor in the kldload process. This is quite a bad, bad idea to be indiscriminately screwing with user process' file descriptors behind their back. A brief search in the archives should cover how to initalize the necessary vnode references for a kproc's file descriptor table so that namei() works (and then you can use vn_open(), but _not_ kern_open()). I answered that question just last week in another thread ("Driver development question" on drivers@). However, in general the kernel is not nearly as friendly an environment as userland, and it can be quite saner and easier to debug if you export certain bits of the kernel to userland to accelerate portions of your application than moving the application into the kernel in my experience. -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908040808.05074.jhb>