Strange behavior of kernel module (output terminated)
John Baldwin
jhb at freebsd.org
Tue Mar 23 14:27:57 UTC 2010
On Tuesday 23 March 2010 7:22:47 am Dag-Erling Smørgrav wrote:
> Dmitry Krivenok <krivenok.dmitry at gmail.com> writes:
> > /* The function called at load/unload. */
> > static int event_handler(struct module *module, int event, void *arg)
> > {
> > int e = 0; /* Error, 0 for normal return status */
> > switch (event)
> > {
> > case MOD_LOAD:
> > uprintf("Hello FreeBSD kernel!\n");
>
> I'm not sure it's such a good idea to use uprintf() here. The event
> handler can be called in non-process context.
If you are doing a kldload post-boot it is actually done from some sort of
process context. We run module handlers synchronously from the kldload(2)
syscall.
> > int i = 0;
> > for(i = 0; i < 1000; i++)
> > {
> > uprintf("%3d ", i);
> > if(! (i % 10) ) uprintf("\n");
> > }
>
> (i % 10) is not a predicate. The test should be if (i % 10 == 0).
>
> If you want to work on FreeBSD, I recommend you get used to the
> FreeBSD coding style; see 'man 9 style'.
True, but that doesn't explain the behavior he sees.
> > As you can see the loop was terminated after i==466. I tried to
> > load/unload the module many times but the last printed number was
> > always 466.
>
> You filled up a buffer somewhere...
Does uprintf() require the caller to flush the output to the tty somehow? If
so, that seems to be a bug. Nothing in the uprintf(9) manpage suggests that
the output should be manually flushed.
--
John Baldwin
More information about the freebsd-hackers
mailing list