On Wed, Feb 24, 2016 at 11:22:49PM +0000, tilman wrote:
>
> > I suggest staying away from eclipse, that's not needed for kernel
> > development. Other than that, it's just normal debugging, good luck
> > with that :)
> I resorted to good old vi as the editor that starts up fastest :-)
>
> And I traced down the problem -- but not the root cause:
>
> In usbrsa_attach, I allocate a private struct for port specific/driver
> specific data:
>
> static int usbrsa_attach(struct usb_serial *serial)
> {
> int i = 0;
> int ret = 0;
> struct usb_serial_port* serport;
> struct usbrsa_port_private* priv = NULL;
> ...
> for (i = 0; i < serial->num_ports; i++)
> {
> serport = serial->port[i];
>
> // allocate struct for driver's private data
> priv = kmalloc(sizeof(struct usbrsa_port_private),
> GFP_KERNEL);
> ....
> usb_set_serial_port_data(serport,priv);
> ...
> }
>
>
> In usbrsa_release, the pointer to the private struct has become a NULL
> pointer -- even though the pointer was not manipulated in between by
> usbrsa_open or usbrsa_write. In fact, I have dumped the pointer in all other
> functions like usbrsa_open, usbrsa_writeroom etc., and it is correct. The
> null pointer in usbrsa_release then leads to a pointer dereferencing error
> in release_baudrate_lcr_urb(priv);
>
> static void usbrsa_release(struct usb_serial *serial)
> {
> int i;
> struct usbrsa_port_private* priv;
> struct usb_serial_port* serport;
> ...
>
> for (i = 0; i < serial->num_ports; i++)
> {
> printk("%s: Mark1\n",__func__);
> serport = serial->port[i];
> priv = usb_get_serial_port_data(serport);
> printk("%s: Mark2\n",__func__);
> printk("%s: private struct at %p\n",__func__,priv);
> printk("%s: Mark2a ",__func__);
> release_baudrate_lcr_urb(priv);
>
> Here the kernel log
> [ 1856.366874] usbrsa_release: Mark2
> [ 1856.366876] usbrsa_release: private struct at (null)
> [ 1856.366878] usbrsa_release: Mark2a release_baudrate_lcr_urb: Start
> [ 1856.366904] BUG: unable to handle kernel NULL pointer dereference at
> 0000000000000102
>
> This could mean that usb_get_serial_port_data does not always work correctly
> -- which I find rather unlikely. Are there any limitations known, for
> instance when using the usb_get_serial_port_data in an SMP environment? Any
> suggestions in which direction to dig?
Release your port data in the port_remove callback, not the release
callback. The release callback is for when your whole device is
removed, not the individual ports.
Try that and see what happens...
thanks,
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html