[Nut-upsuser] nutdrv_qx hangs after send: QS

Charles Lepple clepple at gmail.com
Sun Apr 5 01:28:01 UTC 2015


On Apr 4, 2015, at 8:53 PM, Richard Flint <richard.flint at gmail.com> wrote:

> I have used the truss command as directed. I have attached both the driver output and the last few sections of truss output leading to the hang. Both outputs end at the CTRL+C i pressed when i was forced to end the processes.
> 
> Hope this is helpful. Please bear with me if i didn't run it with the right options etc - as I mentioned, I'm a little new to Solaris.

Well, it did provide some information, but I'll be honest that I don't know what else we can get from truss.

Stepping back a bit, here is the stack:

upsc --- upsd --- nutdrv_qx --- libusb -+- Solaris kernel --- UPS

truss is tracing at the "+" sign: the boundary between user space and kernel space.

When the driver gets a valid response, the truss log looks like this:

5834:      Q u i c k   u p d a t e . . .
5834:   write(2, "\n", 1)                               = 1
5834:   write(5, 0x082DA320, 16)                        = 16
5834:      !\t\002\0\0\b\0 Q S\r\0\0\0\0\0
5834:   write(2, "   1 6 1", 4)                         = 4
5834:   write(2, " .", 1)                               = 1
5834:   write(2, " 3 9 5 1 0 8", 6)                     = 6
5834:   write(2, "\t", 1)                               = 1
5834:   write(2, " s e n d :   Q S", 8)                 = 8
5834:   write(2, "\n", 1)                               = 1
5834:   open("/dev/usb/665.5161/0/if0in1stat", O_RDWR)  = 8
5834:   write(8, "01", 1)                               = 1
5834:   open("/dev/usb/665.5161/0/if0in1", O_RDONLY)    = 9
5834:   read(9, " ( 2 4 5 . 4   2", 8)                  = 8
5834:   close(9)                                        = 0
5834:   close(8)                                        = 0
...

The failed poll at the end looks like this:

5834:      Q u i c k   u p d a t e . . .
5834:   write(2, "\n", 1)                               = 1
5834:   write(5, 0x082DA320, 16)        (sleeping...)
5834:   write(5, 0x082DA320, 16)                        = 16
5834:      !\t\002\0\0\b\0 Q S\r\0\0\0\0\0
5834:   write(2, "   1 6 9", 4)                         = 4
5834:   write(2, " .", 1)                               = 1
5834:   write(2, " 8 5 8 9 3 0", 6)                     = 6
5834:   write(2, "\t", 1)                               = 1
5834:   write(2, " s e n d :   Q S", 8)                 = 8
5834:   write(2, "\n", 1)                               = 1
5834:   open("/dev/usb/665.5161/0/if0in1stat", O_RDWR)  = 8
5834:   write(8, "01", 1)                               = 1
5834:   open("/dev/usb/665.5161/0/if0in1", O_RDONLY)    = 9
5834:   read(9, 0xFC9BC650, 8)          (sleeping...)
^C

I did run across a comment in the NUT configure.ac that says "dnl FIXME: Sun's libusb doesn't support timeout (so blocks notification)". This is unfortunate, since other libusb platforms will time out after ~5 seconds, and most of the drivers have retry logic to handle that.

I couldn't find any relevant source code when searching for Solaris libusb 0.1.7 with Google. Do you have any other information about the libusb that is installed there?

There is also this fork of libusb that claims to support Solaris, and the code seems to have timeouts: http://sourceforge.net/projects/openusb/

-- 
Charles Lepple
clepple at gmail



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.alioth.debian.org/pipermail/nut-upsuser/attachments/20150404/d7536c99/attachment.html>


More information about the Nut-upsuser mailing list