All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: ashwin.chaugule@celunite.com
Cc: linux-kernel@vger.kernel.org
Subject: Re: [RFC][PATCH 2/2] Swap token re-tuned
Date: Fri, 29 Sep 2006 21:23:31 +0200	[thread overview]
Message-ID: <1159557812.13651.23.camel@lappy> (raw)
In-Reply-To: <1159556740.2141.24.camel@localhost.localdomain>

On Sat, 2006-09-30 at 00:35 +0530, Ashwin Chaugule wrote:
> New scheme to preempt token. 
> 
> 
> Signed-off-by: Ashwin Chaugule <ashwin.chaugule@celunite.com>
> 
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index 34ed0d9..417bbe4 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -342,9 +342,15 @@ struct mm_struct {
>  	/* Architecture-specific MM context */
>  	mm_context_t context;
>  
> -	/* Token based thrashing protection. */
> -	unsigned long swap_token_time;
> -	char recent_pagein;
> +	/* Swap token stuff */
> +	/* Last value of global fault stamp as seen by this process. 
> +	 * In other words, this value gives an indication of how long
> +	 * it has been since this task got the token */
> +	unsigned int faultstamp;
> +
> +       /* Deciding factor ! Increment if (global_faults - faultstamp < 5) 
> +        * else decrement. High priority wins the token.*/
> +	int token_priority;

/*
 * multi line comments look like this
 */

> --- a/kernel/sysctl.c
> +++ b/kernel/sysctl.c
> @@ -910,6 +910,7 @@ #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
>  		.extra1		= &zero,
>  	},
>  #endif
> +#if 0	/* Not needed anymore */
>  #ifdef CONFIG_SWAP
>  	{
>  		.ctl_name	= VM_SWAP_TOKEN_TIMEOUT,
> @@ -921,6 +922,7 @@ #ifdef CONFIG_SWAP
>  		.strategy	= &sysctl_jiffies,
>  	},
>  #endif
> +#endif

Just remove it.

>  static int should_release_swap_token(struct mm_struct *mm)
>  {
>  	int ret = 0;
> -	if (!mm->recent_pagein)
> -		ret = SWAP_TOKEN_ENOUGH_RSS;
> -	else if (time_after(jiffies, swap_token_timeout))
> -		ret = SWAP_TOKEN_TIMED_OUT;
> -	mm->recent_pagein = 0;
> -	return ret;
> +	if ( current->mm->token_priority > mm->token_priority )
> +		return ret = SWAP_TOKEN_PREEMPT;
> +	else
> +		return ret;
>  }

if (..)
  ret = SWAP_TOKEN_PREEMPT;

return ret;

> -/*
> - * Try to grab the swapout protection token.  We only try to
> - * grab it once every TOKEN_CHECK_INTERVAL, both to prevent
> - * SMP lock contention and to check that the process that held
> - * the token before is no longer thrashing.
> - */
>  void grab_swap_token(void)
>  {
> -	struct mm_struct *mm;
> +	struct mm_struct *mm_temp;
>  	int reason;
>  
> -	/* We have the token. Let others know we still need it. */
> -	if (has_swap_token(current->mm)) {
> -		current->mm->recent_pagein = 1;
> -		if (unlikely(!swap_token_default_timeout))
> -			disable_swap_token();
> +	/* This gives an indication of the number of processes contending for the token.*/

80 char max

> +	global_faults++; 
> +
> +	if (!spin_trylock(&swap_token_lock))
>  		return;
> -	}
>  
> -	if (time_after(jiffies, swap_token_check)) {
> +	/* First come first served. If a process holding the token exits, its up for grabs immediately */

ditto

> +	if ( swap_token_mm == NULL ) {
> +		swap_token_mm = current->mm;
> +		swap_token_mm->faultstamp = global_faults;
> +		goto out;
> +	}
>  
> -		if (!swap_token_default_timeout) {
> -			swap_token_check = jiffies + SWAP_TOKEN_CHECK_INTERVAL;
> -			return;
> -		}
> +	if ((global_faults - current->mm->faultstamp) < FAULTSTAMP_DIFF )  {
>  
> -		/* ... or if we recently held the token. */
> -		if (time_before(jiffies, current->mm->swap_token_time))
> -			return;
> +	/*  This would mean that too many of the current tasks pages
> +	 *  have been evicted and therefore it's calling swap-in or no-page 
> +	 *  too frequently. */

/*
 * multi line coment
 */

> -		if (!spin_trylock(&swap_token_lock))
> -			return;
> +		current->mm->faultstamp = global_faults;
> +		current->mm->token_priority++;
> +		mm_temp = swap_token_mm;
> +	}
> +	else {
> +	/* Decrement priority to ensure that the token holder doesnt
> +	 * hold on to it for too long. */

more comments

> -		swap_token_check = jiffies + SWAP_TOKEN_CHECK_INTERVAL;
> +		if (current->mm->token_priority > 0)
> +			current->mm->token_priority--;
> +		else {
> +	/* After this, the process will be able to contend for the token 
> +	 * again.*/

ditto



  reply	other threads:[~2006-09-29 19:23 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-09-29 19:05 [RFC][PATCH 2/2] Swap token re-tuned Ashwin Chaugule
2006-09-29 19:23 ` Peter Zijlstra [this message]
2006-09-29 19:51   ` Ashwin Chaugule
  -- strict thread matches above, loose matches on Subject: below --
2006-09-28 17:00 Ashwin Chaugule
2006-09-28 14:12 Ashwin Chaugule
2006-09-28 14:09 Ashwin Chaugule

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=1159557812.13651.23.camel@lappy \
    --to=a.p.zijlstra@chello.nl \
    --cc=ashwin.chaugule@celunite.com \
    --cc=linux-kernel@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.