Re: Kernel panic in cdc_acm / acm_tty_hangup / tty_port_hangup

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Dec 3, 2011 at 16:29, Thilo-Alexander Ginkel <thilo@xxxxxxxxxx> wrote:
> On Tue, Nov 29, 2011 at 16:14, Thilo-Alexander Ginkel <thilo@xxxxxxxxxx> wrote:
>> On Tue, Nov 29, 2011 at 14:23, Johan Hovold <jhovold@xxxxxxxxx> wrote:
>>>>  page_fault
>>>>  ? __ticket_spin_lock
>>>>  default_spin_lock_flags
>>>>  _raw_spin_lock_irqsave
>>>>  tty_port_hangup
>>>>  acm_tty_hangup [cdc_acm]
>>>>  __tty_hangup
>>>>  ? __tty_hangup
>>>>  do_tty_hangup
>>>>  process_one_work
>>>>  worker_thread
>>>
>>> This could have been fixed by 5dc2470c602da (USB: cdc-acm: Fix disconnect() vs
>>> close() race).
>>>
>>>> $ uname -a
>>>> Linux orion 3.1.0-030100-generic #201110241006 SMP Mon Oct 24 14:07:10
>>>> UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
>>>
>>> Try updating to 3.1.4 which contains the above commit.
>>
>> Done. I'll let you know in case the problem reappears.
>
> Hm... Unfortunately, updating to 3.1.4 did not really help as my
> laptop is still sporadically locking up on suspend/resume iff a 3G
> connection via cdc_acm is actve at the point in time when the suspend
> happens.

I have got a question with regards to what data structure open_mutex
is supposed to protect:

In acm_tty_hangup, which triggers the crash, the mutex is only
acquired after tty_port_hangup has been called. Is this intended,
i.e., is it safe to access acm outside of the mutex?

 555 static void acm_tty_hangup(struct tty_struct *tty)
 556 {
 557 »···struct acm *acm = tty->driver_data;
 558 »···tty_port_hangup(&acm->port);
 559 »···mutex_lock(&open_mutex);
 560 »···acm_port_down(acm);
 561 »···mutex_unlock(&open_mutex);
 562 }

Another idea that came to my mind: If data transmission is in progress
when the suspend happens (as indicated by acm->transmitting), what are
the effects of returning EBUSY (just in case the suspend is an auto
suspend - under which circumstances do these happen?)? May this cause
trouble on resume?

1305 static int acm_suspend(struct usb_interface *intf, pm_message_t message)
1306 {
1307 »···struct acm *acm = usb_get_intfdata(intf);
1308 »···int cnt;
1309
1310 »···if (PMSG_IS_AUTO(message)) {
1311 »···»···int b;
1312
1313 »···»···spin_lock_irq(&acm->write_lock);
1314 »···»···b = acm->transmitting;
1315 »···»···spin_unlock_irq(&acm->write_lock);
1316 »···»···if (b)
1317 »···»···»···return -EBUSY;
1318 »···}

Thanks,
Thilo
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux