Messages in this thread Patch in this message | | | Subject | Re: [RFC][PATCH 2/2] Swap token re-tuned | From | Peter Zijlstra <> | Date | Fri, 29 Sep 2006 21:23:31 +0200 |
| |
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
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |