From: Anil Veliyankara Madam Date: Fri, 8 Jan 2016 05:18:52 +0000 (-0800) Subject: drivers: libata-core: Use usleep_range() instead of msleep() for short sleeps (<20 ms) X-Git-Tag: v4.5-rc1~156^2~3 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=848c3920866fdb7b8b353408348df7929306e9be;p=karo-tx-linux.git drivers: libata-core: Use usleep_range() instead of msleep() for short sleeps (<20 ms) Since msleep() may sleep longer than intended time for values less than 20ms, this patch allows the use of usleep_range for waits less that 20ms. usleep_range is a finer precision implementation of msleep and is designed to be a drop-in replacement for udelay where a precise sleep/busy-wait is unnecessary. More details can be found at http://lkml.org/lkml/2007/8/3/250 and in Documentation/timers/timers-howto.txt. This change has been done to improve the performace in PIO6 mode which is used by viking flash. Cc: xe-kernel@external.cisco.com Signed-off-by: Anil Veliyankara Madam Signed-off-by: Shikha Jain Signed-off-by: Tejun Heo --- diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 60e368610c74..f5ae6f43b659 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -6704,7 +6705,12 @@ void ata_msleep(struct ata_port *ap, unsigned int msecs) if (owns_eh) ata_eh_release(ap); - msleep(msecs); + if (msecs < 20) { + unsigned long usecs = msecs * USEC_PER_MSEC; + usleep_range(usecs, usecs + 50); + } else { + msleep(msecs); + } if (owns_eh) ata_eh_acquire(ap);