xhci: init command timeout timer earlier to avoid deleting it uninitialized
Don't check if timer is running with a timer_pending() before deleting it with del_timer_sync(), this defies the whole point of the sync part and can cause a possible race. Instead we just want to make sure the timer is initialized early enough before we have a chance to delete it. Cc: <stable@vger.kernel.org> Reported-by: Oliver Neukum <oneukum@suse.com> Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
dca7794539
commit
cc8e4fc0c3
|
@ -1792,8 +1792,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
|
|||
int size;
|
||||
int i, j, num_ports;
|
||||
|
||||
if (timer_pending(&xhci->cmd_timer))
|
||||
del_timer_sync(&xhci->cmd_timer);
|
||||
del_timer_sync(&xhci->cmd_timer);
|
||||
|
||||
/* Free the Event Ring Segment Table and the actual Event Ring */
|
||||
size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries);
|
||||
|
@ -2321,6 +2320,10 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||
|
||||
INIT_LIST_HEAD(&xhci->cmd_list);
|
||||
|
||||
/* init command timeout timer */
|
||||
setup_timer(&xhci->cmd_timer, xhci_handle_command_timeout,
|
||||
(unsigned long)xhci);
|
||||
|
||||
page_size = readl(&xhci->op_regs->page_size);
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
||||
"Supported page size register = 0x%x", page_size);
|
||||
|
@ -2505,10 +2508,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
|
|||
"Wrote ERST address to ir_set 0.");
|
||||
xhci_print_ir_set(xhci, 0);
|
||||
|
||||
/* init command timeout timer */
|
||||
setup_timer(&xhci->cmd_timer, xhci_handle_command_timeout,
|
||||
(unsigned long)xhci);
|
||||
|
||||
/*
|
||||
* XXX: Might need to set the Interrupter Moderation Register to
|
||||
* something other than the default (~1ms minimum between interrupts).
|
||||
|
|
Loading…
Reference in New Issue