Search Linux Wireless

[PATCH 00/10] orinoco: Remove in_interrupt() usage.

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

 



Hi,

this series removes the in_interrupt() usage in the orinoco driver which
is the last one in drivers/net.

The series preserves the current status based on the context I saw
during the review.

The proper way dealing with this would be to use a mutex_t as another
lock and split the current usage of orinoco_lock() and push some of the
callers into a worker where an immediate answer is not needed. This
would allow to always block on the completion and so avoid the polling.

The problem with the current approach / polling in BH context is that
USB HCDs which marked with HCD_BH (EHCI/XHCI) will complete the URB in
tasklet/BH context. The URB's callback (that part that completes
completion which is being polled for) will obviously not be invoked if
the driver polls with the orinoco_private::lock acquired which disables
BH. The only way it may work is if the USB HCD does not set HCD_BH or
the HCD IRQ fires on a different CPU.

A lot of the "BH" usage comes from the orinoco_lock(). The other callers
are fully preemtible. I didn't look how many of the callers, that
disable BH via orinoco_lock(), are already in atomic context due to
another lock, timer or so. I'm afraid I make it worse by missing
something subtle. This might still work on a OHCI/UHCI controller.

Sebastian



[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux