Hello! sys/bus.h documents the following semantics for FILTER_SCHEDULE_THREAD: /** * _at_brief Driver interrupt filter return values * * If a driver provides an interrupt filter routine it must return an * integer consisting of oring together zero or more of the following ^^^^^^^ * flags: * * FILTER_STRAY - this device did not trigger the interrupt * FILTER_HANDLED - the interrupt has been fully handled and can be EOId * FILTER_SCHEDULE_THREAD - the threaded interrupt handler should be * scheduled to execute * * If the driver does not provide a filter, then the interrupt code will * act is if the filter had returned FILTER_SCHEDULE_THREAD. Note that it * is illegal to specify any other flag with FILTER_STRAY and that it is * illegal to not specify either of FILTER_HANDLED or FILTER_SCHEDULE_THREAD * if FILTER_STRAY is not specified. */ #define FILTER_STRAY 0x01 #define FILTER_HANDLED 0x02 #define FILTER_SCHEDULE_THREAD 0x04 But actually FILTER_SCHEDULE_THREAD is not used as a bit-value (see kern/kern_intr.c): if (!thread) { if (ret == FILTER_SCHEDULE_THREAD) thread = 1; } There is at least one in-tree driver that could be broken because of this (asmc(8), but I found the problem with some other out-of-tree driver). This should be "if (ret & FILTER_SCHEDULE_THREAD)" instead. Attached patch fixes the problem. What do you think? Max
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:23 UTC