mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ingo Oeser <ingo.oeser@informatik.tu-chemnitz.de>
To: "Grover, Andrew" <andrew.grover@intel.com>
Cc: "'linux-kernel@vger.kernel.org'" <linux-kernel@vger.kernel.org>,
	"Moore, Robert" <robert.moore@intel.com>
Subject: Re: down_timeout
Date: Thu, 26 Apr 2001 01:49:13 +0200	[thread overview]
Message-ID: <20010426014913.B9089@nightmaster.csn.tu-chemnitz.de> (raw)
In-Reply-To: <4148FEAAD879D311AC5700A0C969E89006CDDDD2@orsmsx35.jf.intel.com>
In-Reply-To: <4148FEAAD879D311AC5700A0C969E89006CDDDD2@orsmsx35.jf.intel.com>; from andrew.grover@intel.com on Wed, Apr 25, 2001 at 04:21:22PM -0700

On Wed, Apr 25, 2001 at 04:21:22PM -0700, Grover, Andrew wrote:
> It seems like we need to implement down_timeout (and
> down_timeout_interruptible) to fully flesh out the semaphore implementation.
> It is difficult and inefficient to emulate this using wrapper functions, as
> far as I can see.
> 
> Seems like this is a fairly standard interface to have for OS semaphores. We
> have a prototype implementation, and could contribute this, if desired.
> 
> Thoughts?

Sure you can't implement this via waitqueues? semaphores use them
internally anyway.

I use this for interrupt or polling based waiting:


/* IO polling waits */
/* Timeout after this amount of jiffies */
#define IO_POLL_TIMEOUT (HZ) 	
/* Split timeout while polling into chunks of that many jiffies */
#define IO_POLL_SPLIT 	2

/* generic interrupt based wait with timeouts! */
#define __wait_event_timeout_int(wq, condition, timeout, ret) \
	do { \
		struct wait_queue __wait; \
		signed long __expire=timeout; \
		__wait.task=current; \
		add_wait_queue(wq, &__wait); \
		for (;;) { \
			current->state=TASK_UNINTERRUPTIBLE; \
			mb(); \
			if (condition) break; \
			__expire=schedule_timeout(__expire); \
			if (__expire == 0) {  \
				ret=-ETIMEDOUT; \
				break; \
			} \
		} \
		current->state = TASK_RUNNING; \
		remove_wait_queue(wq, &__wait); \
	} while (0)

/* polling wait, if we shouldn't use interrupts for this */
#define __wait_event_timeout_poll(wq, condition, timeout, ret) \
	do { \
		unsigned int __tries=0; \
		unsigned int __maxtry=timeout / IO_POLL_SPLIT; \
		do { \
			schedule_timeout(IO_POLL_SPLIT); \
			if (condition) \
				break; \
		} while (++__tries < __maxtry); \
		if (__tries == __maxtry && !condition) \
			ret=-ETIMEDOUT; \
	} while (0)
	
#ifdef INTS_ARE_CHEAP
#define __wait_event_timeout(wq, condition, timeout, ret) \
	__wait_event_timeout_int(wq, condition, timeout, ret)
#else /* INTS_ARE_CHEAP */
#define __wait_event_timeout(wq, condition, timeout, ret) \
	__wait_event_timeout_poll(wq, condition, timeout, ret)
#endif /* INTS_ARE_CHEAP */

#define wait_event_timeout(wq, condition, timeout, ret)	\
	do { \
		if (condition) \
			break; \
		__wait_event_timeout(wq, condition, timeout, ret); \
	} while (0)


What about that?

Use it just as you use wait_event() but check for -ETIMEDOUT as
value in ret.

Regards

Ingo Oeser
-- 
10.+11.03.2001 - 3. Chemnitzer LinuxTag <http://www.tu-chemnitz.de/linux/tag>
         <<<<<<<<<<<<     been there and had much fun   >>>>>>>>>>>>

  reply	other threads:[~2001-04-25 23:49 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-04-25 23:21 down_timeout Grover, Andrew
2001-04-25 23:49 ` Ingo Oeser [this message]
2001-04-26 16:27 down_timeout Moore, Robert
     [not found] <3F7D6DA1.9070801@namesys.com>
2003-10-03 14:25 ` down_timeout Matthew Wilcox
2003-10-03 20:36   ` down_timeout Andrew Morton
2003-10-03 18:03 down_timeout Grover, Andrew
2003-10-04  7:53 ` down_timeout Ingo Oeser

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=20010426014913.B9089@nightmaster.csn.tu-chemnitz.de \
    --to=ingo.oeser@informatik.tu-chemnitz.de \
    --cc=andrew.grover@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robert.moore@intel.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®