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