On 15/07/14 17:56, Bartlomiej Zolnierkiewicz wrote:
+ >+/* Helper function to do poll and timeout */ >+static int read_poll_timeout(void __iomem *addr, u32 mask) >+{ >+ unsigned long timeout = jiffies + msecs_to_jiffies(TIMEOUT_MS); >+ >+ do { >+ if (readl_relaxed(addr) & mask) >+ return 0; >+ >+ usleep_range(DELAY_INTERVAL_US, DELAY_INTERVAL_US + 50); >+ } while (!time_after(jiffies, timeout)); >+ >+ return -ETIMEDOUT; >+}Thanks for reworking this code, unfortunately it still has a one (unlikely but still theoretically possible) problem. If there is i.e. a big IRQ load between first usleep_range() call and first
Very unlikely but as you said it possible in theory :-)
time_after() check the function will timeout without checking the register. To fix it you needs to add an additonal register checking before returning -ETIMEDOUT value or replace time_after() condition with a fixed number of retries (100000 to cover 1sec timeout).
I will send out a fix on top of my previous patches to fix this. thanks, srini -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

