|
@@ -500,15 +500,56 @@ unsigned int jiffies_to_usecs(const unsigned long j)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(jiffies_to_usecs);
|
|
EXPORT_SYMBOL(jiffies_to_usecs);
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * When we convert to jiffies then we interpret incoming values
|
|
|
|
+ * the following way:
|
|
|
|
+ *
|
|
|
|
+ * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
|
|
|
|
+ *
|
|
|
|
+ * - 'too large' values [that would result in larger than
|
|
|
|
+ * MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
|
|
|
|
+ *
|
|
|
|
+ * - all other values are converted to jiffies by either multiplying
|
|
|
|
+ * the input value by a factor or dividing it with a factor
|
|
|
|
+ *
|
|
|
|
+ * We must also be careful about 32-bit overflows.
|
|
|
|
+ */
|
|
unsigned long msecs_to_jiffies(const unsigned int m)
|
|
unsigned long msecs_to_jiffies(const unsigned int m)
|
|
{
|
|
{
|
|
- if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Negative value, means infinite timeout:
|
|
|
|
+ */
|
|
|
|
+ if ((int)m < 0)
|
|
return MAX_JIFFY_OFFSET;
|
|
return MAX_JIFFY_OFFSET;
|
|
|
|
+
|
|
#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
|
|
#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
|
|
|
|
+ /*
|
|
|
|
+ * HZ is equal to or smaller than 1000, and 1000 is a nice
|
|
|
|
+ * round multiple of HZ, divide with the factor between them,
|
|
|
|
+ * but round upwards:
|
|
|
|
+ */
|
|
return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
|
|
return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
|
|
#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
|
|
#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
|
|
|
|
+ /*
|
|
|
|
+ * HZ is larger than 1000, and HZ is a nice round multiple of
|
|
|
|
+ * 1000 - simply multiply with the factor between them.
|
|
|
|
+ *
|
|
|
|
+ * But first make sure the multiplication result cannot
|
|
|
|
+ * overflow:
|
|
|
|
+ */
|
|
|
|
+ if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
|
|
|
|
+ return MAX_JIFFY_OFFSET;
|
|
|
|
+
|
|
return m * (HZ / MSEC_PER_SEC);
|
|
return m * (HZ / MSEC_PER_SEC);
|
|
#else
|
|
#else
|
|
|
|
+ /*
|
|
|
|
+ * Generic case - multiply, round and divide. But first
|
|
|
|
+ * check that if we are doing a net multiplication, that
|
|
|
|
+ * we wouldnt overflow:
|
|
|
|
+ */
|
|
|
|
+ if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
|
|
|
|
+ return MAX_JIFFY_OFFSET;
|
|
|
|
+
|
|
return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC;
|
|
return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC;
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|