Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 123333
b: refs/heads/master
c: 0871420
h: refs/heads/master
i:
  123331: 82874e7
v: v3
  • Loading branch information
David S. Miller committed Dec 4, 2008
1 parent d9e9250 commit 5868e3d
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 27137e5285a3388e8f86d7bc5fe0ed8b92bd4624
refs/heads/master: 0871420fad5844cb63cfcf85508c17bd9b15c08f
21 changes: 14 additions & 7 deletions trunk/arch/sparc/mm/tsb.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,18 @@ void __init pgtable_cache_init(void)
}
}

int sysctl_tsb_ratio = -2;

static unsigned long tsb_size_to_rss_limit(unsigned long new_size)
{
unsigned long num_ents = (new_size / sizeof(struct tsb));

if (sysctl_tsb_ratio < 0)
return num_ents - (num_ents >> -sysctl_tsb_ratio);
else
return num_ents + (num_ents >> sysctl_tsb_ratio);
}

/* When the RSS of an address space exceeds tsb_rss_limit for a TSB,
* do_sparc64_fault() invokes this routine to try and grow it.
*
Expand Down Expand Up @@ -295,19 +307,14 @@ void tsb_grow(struct mm_struct *mm, unsigned long tsb_index, unsigned long rss)

new_cache_index = 0;
for (new_size = 8192; new_size < max_tsb_size; new_size <<= 1UL) {
unsigned long n_entries = new_size / sizeof(struct tsb);

n_entries = (n_entries * 3) / 4;
if (n_entries > rss)
new_rss_limit = tsb_size_to_rss_limit(new_size);
if (new_rss_limit > rss)
break;

new_cache_index++;
}

if (new_size == max_tsb_size)
new_rss_limit = ~0UL;
else
new_rss_limit = ((new_size / sizeof(struct tsb)) * 3) / 4;

retry_tsb_alloc:
gfp_flags = GFP_KERNEL;
Expand Down
14 changes: 14 additions & 0 deletions trunk/kernel/sysctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,10 @@ extern int sg_big_buff;
#include <asm/system.h>
#endif

#ifdef CONFIG_SPARC64
extern int sysctl_tsb_ratio;
#endif

#ifdef __hppa__
extern int pwrsw_enabled;
extern int unaligned_enabled;
Expand Down Expand Up @@ -451,6 +455,16 @@ static struct ctl_table kern_table[] = {
.proc_handler = &proc_dointvec,
},
#endif
#ifdef CONFIG_SPARC64
{
.ctl_name = CTL_UNNUMBERED,
.procname = "tsb-ratio",
.data = &sysctl_tsb_ratio,
.maxlen = sizeof (int),
.mode = 0644,
.proc_handler = &proc_dointvec,
},
#endif
#ifdef __hppa__
{
.ctl_name = KERN_HPPA_PWRSW,
Expand Down

0 comments on commit 5868e3d

Please sign in to comment.