panic: already on hash list

Sepherosa Ziehau sepherosa at gmail.com
Wed Jul 23 06:06:48 PDT 2008


On Tue, Jul 22, 2008 at 8:28 PM, YONETANI Tomokazu <qhwt+dfly at les.ath.cx> wrote:
> Hi.
> Caught this panic while playing with my build box.  I don't know the exact
> moment when it panicked, as the monitor was connected to another box, but
> here's what I was doing before the panic anyway:
>
> - login to the build box from the console, and slogin to the router box
>  (running DragonFly 1.8), and rebooted it.
> - switch the monitor/keyboard to the router box, wait for it to boot,
>  and login to the console.  slogin to the build machine, start GNU screen,
>  start w3m (a text-based web browser, similar to lynx), tried to visit
>  Google but it didn't work (this was expected, because for some reason mpd
>  starts up earlier than ipnat and I always have to restart before I can
>  connect to the Internet from behind the router).
> - split the screen inside GNU screen, and typed ctrl+C on w3m.  A few seconds

I think this ctrl+C is important to the problem :)

One thing I need you to help confirm is that does w3m put the socket
into nonblock mode?  I didn't seem to be able to download w3m source
code.

I think it may be caused by following pattern of user code:

s = socket();
/* s is not put into nonblock mode */
while (1) {
  if (connect(s) < 0) {  <==== here you hit ctrl+C
    if (errno == EINTR)
      continue; <==== another connect(2) attempt on 's'
    ...
  }
  ...
}

We probably could create a much simpler test program by using the
above code pattern to reproduce the panic ...

The things from the dump related to my following assumption are:
1) so_state is 0
2) inpcb is on hash list (both the flag and the link fields prove that)

I think following things happened, if w3m used the code pattern I listed above:
- connect(2) is blocking, so first calling of connect(2) will make
kern_connect() block on lwkt_domsg()
- ctrl+C will make the lwkt_domsg() in kern_connect() return.
SS_ISCONNECTING is cleared on so_state, then so_state becomes 0, but
inpcb is left on hash list since former soconnect() succeeded.
- the second connect(2) syscall hits the wall (soconnect calls
so_pru_connect, since so_state is 0)

I will appreciate if you could reproduce the panic by using the user
code I mention above.  I probably could not do it today, I could not
go back home before 10pm today :(

Best Regards,
sephe

-- 
Live Free or Die





More information about the Bugs mailing list