mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: linux-kernel@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	John Stultz <john.stultz@linaro.org>,
	Arnd Bergmann <arnd@arndb.de>, Ingo Molnar <mingo@kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Eric Dumazet <edumazet@google.com>,
	Prarit Bhargava <prarit@redhat.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Dong Zhu <bluezhudong@gmail.com>
Subject: [PATCH v2 1/8] time: add *_to_jiffies_timeout helpers to guarantee a minimum duration
Date: Tue, 14 May 2013 17:48:31 +0300	[thread overview]
Message-ID: <1368542918-8861-2-git-send-email-imre.deak@intel.com> (raw)
In-Reply-To: <1368542918-8861-1-git-send-email-imre.deak@intel.com>
In-Reply-To: <1368188011-23661-1-git-send-email-imre.deak@intel.com>

The *_to_jiffies(x) macros return a jiffy value, which if used as a
delta to wait for a specific amount of time, may result in a wait time
that is less than x. Many callers already compensate for this by adding
one to the returned value. Instead of having this adjustment open-coded
at every call site add helpers that return the adjusted value. This will
make the intention for the adjustment more explicit and also provide
documentation for why it is needed.

Later patches will convert the currently open-coded call sites to use
the new helpers.

Also this can serve as a basis for auditing those users of *_to_jiffies
that most likely do the wrong thing - for example set a timeout value of
msecs_to_jiffies(1) - and converting them to use the new helpers.

Kudos to Daniel Vetter for the idea of the new helpers.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 include/linux/jiffies.h |    6 ++++++
 kernel/time.c           |   27 +++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
index 8fb8edf..e77a5a0 100644
--- a/include/linux/jiffies.h
+++ b/include/linux/jiffies.h
@@ -311,6 +311,12 @@ extern u64 nsec_to_clock_t(u64 x);
 extern u64 nsecs_to_jiffies64(u64 n);
 extern unsigned long nsecs_to_jiffies(u64 n);
 
+extern unsigned long msecs_to_jiffies_timeout(const unsigned int m);
+extern unsigned long usecs_to_jiffies_timeout(const unsigned int u);
+extern unsigned long nsecs_to_jiffies_timeout(const u64 n);
+extern unsigned long timespec_to_jiffies_timeout(const struct timespec *value);
+extern unsigned long timeval_to_jiffies_timeout(const struct timeval *value);
+
 #define TIMESTAMP_SIZE	30
 
 #endif
diff --git a/kernel/time.c b/kernel/time.c
index d3617db..759d897 100644
--- a/kernel/time.c
+++ b/kernel/time.c
@@ -712,3 +712,30 @@ struct timespec timespec_add_safe(const struct timespec lhs,
 
 	return res;
 }
+
+/**
+ * msecs_to_jiffies_timeout - Convert msecs to jiffies with guaranteed minimum
+ *
+ * Works similarly to msecs_to_jiffies(), but returns a value that represents
+ * a wait time that is guaranteed to be at least the given msecs duration. In
+ * contrast the value returned by msecs_to_jiffies() represents a wait time
+ * that can be up to 1 jiffy less than the specified msecs duration, depending
+ * on which point in time between two scheduling clock ticks we use the
+ * returned jiffy value.
+ *
+ * Similar helpers are available corresponding to the rest of *_to_jiffies()
+ * functions.
+ */
+#define __define_time_to_jiffies_timeout(tname, ttype)			\
+unsigned long tname ## _to_jiffies_timeout(const ttype v)		\
+{									\
+	unsigned long j = tname ## _to_jiffies(v);			\
+	return min_t(unsigned long, MAX_JIFFY_OFFSET, j + 1);		\
+}									\
+EXPORT_SYMBOL(tname ## _to_jiffies_timeout);
+
+__define_time_to_jiffies_timeout(msecs, unsigned int)
+__define_time_to_jiffies_timeout(usecs, unsigned int)
+__define_time_to_jiffies_timeout(nsecs, u64)
+__define_time_to_jiffies_timeout(timespec, struct timespec *)
+__define_time_to_jiffies_timeout(timeval, struct timeval *)
-- 
1.7.10.4


  parent reply	other threads:[~2013-05-14 14:48 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-10 12:13 [PATCH 01/11] time: add *_to_jiffies_min " Imre Deak
2013-05-10 12:13 ` [PATCH 02/11] sched: msleep: take msecs_to_jiffies_min into use Imre Deak
2013-05-10 12:13 ` [PATCH 03/11] drm/i915: " Imre Deak
2013-05-10 12:13 ` [PATCH 04/11] hwmon/lm63,lm90: " Imre Deak
2013-05-12 23:55   ` Guenter Roeck
2013-05-13  7:47   ` Jean Delvare
2013-05-13 11:56     ` Imre Deak
2013-05-13 12:23       ` Jean Delvare
2013-05-10 12:13 ` [PATCH 05/11] media/si4713-i2c: take usecs_to_jiffies_min " Imre Deak
2013-05-10 12:13 ` [PATCH 06/11] net/bonding: take msecs_to_jiffies_min " Imre Deak
2013-05-10 13:58   ` Michal Kubecek
2013-05-10 21:19     ` Imre Deak
2013-05-10 12:13 ` [PATCH 07/11] net/peak_pcmcia: " Imre Deak
2013-05-15  9:12   ` Marc Kleine-Budde
2013-05-15 11:45     ` Marc Kleine-Budde
2013-05-10 12:13 ` [PATCH 08/11] usb/isp116x-hcd: " Imre Deak
2013-05-10 12:13 ` [PATCH 09/11] net/sunrpc: " Imre Deak
2013-05-10 12:13 ` [PATCH 10/11] net/tipc: " Imre Deak
2013-05-10 12:13 ` [PATCH 11/11] sound/oxygen_io: " Imre Deak
2013-05-13 14:00   ` Takashi Iwai
2013-05-13 14:24     ` Imre Deak
2013-05-13 14:35       ` Takashi Iwai
2013-05-13 14:30     ` Clemens Ladisch
2013-05-10 12:24 ` [PATCH 01/11] time: add *_to_jiffies_min helpers to guarantee a minimum duration Daniel Vetter
2013-05-10 13:49   ` Imre Deak
2013-05-13  7:29 ` Jean Delvare
2013-05-13 11:27   ` Imre Deak
2013-05-13 12:28     ` Jean Delvare
2013-05-13 13:07       ` Imre Deak
2013-05-13  8:17 ` Jean Delvare
2013-05-13 12:01   ` Imre Deak
2013-05-14 14:48 ` [PATCH v2 0/8] add *_to_jiffies_timeout " Imre Deak
2013-05-14 14:48 ` Imre Deak [this message]
2013-05-15 15:26   ` [PATCH v2 1/8] time: " Arnd Bergmann
2013-05-15 17:56     ` Imre Deak
2013-05-17 13:35       ` Arnd Bergmann
2013-05-17 15:14         ` Imre Deak
2013-05-14 14:48 ` [PATCH v2 2/8] sched: msleep: take msecs_to_jiffies_timeout into use Imre Deak
2013-05-14 14:48 ` [PATCH v2 3/8] drm/i915: " Imre Deak
2013-05-14 14:48 ` [PATCH v2 4/8] media/si4713-i2c: take usecs_to_jiffies_timeout " Imre Deak
2013-05-14 17:45   ` edubezval
2013-05-14 14:48 ` [PATCH v2 5/8] usb/isp116x-hcd: take msecs_to_jiffies_timeout " Imre Deak
2013-05-14 14:48 ` [PATCH v2 6/8] net/sunrpc: " Imre Deak
2013-05-14 14:48 ` [PATCH v2 7/8] net/tipc: " Imre Deak
2013-05-14 14:48 ` [PATCH v2 8/8] sound/oxygen_io: " Imre Deak
2013-05-14 14:50   ` Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1368542918-8861-2-git-send-email-imre.deak@intel.com \
    --to=imre.deak@intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=bluezhudong@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=edumazet@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=john.stultz@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=prarit@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®