Ensure that ZFS ARC free memory checks include cached pages

Also restore kmem_used() check for i386 as it has KVA limits that the raw
page counts above don't consider

PR:		187594
Reviewed by:	peter
X-MFC-With: r270759
Review:	D700
Sponsored by:	Multiplay
This commit is contained in:
Steven Hartland 2014-08-30 21:44:32 +00:00
parent 65d495a87e
commit 92ac3eb59f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=270861
3 changed files with 17 additions and 1 deletions

View File

@ -152,7 +152,7 @@ u_int
kmem_free_count(void)
{
return (vm_cnt.v_free_count);
return (vm_cnt.v_free_count + vm_cnt.v_cache_count);
}
u_int
@ -169,6 +169,13 @@ kmem_size(void)
return (kmem_size_val);
}
uint64_t
kmem_used(void)
{
return (vmem_size(kmem_arena, VMEM_ALLOC));
}
static int
kmem_std_constructor(void *mem, int size __unused, void *private, int flags)
{

View File

@ -66,6 +66,7 @@ typedef struct kmem_cache {
void *zfs_kmem_alloc(size_t size, int kmflags);
void zfs_kmem_free(void *buf, size_t size);
uint64_t kmem_size(void);
uint64_t kmem_used(void);
u_int kmem_page_count(void);
/*

View File

@ -2563,6 +2563,14 @@ arc_reclaim_needed(void)
#endif /* sun */
#else
#ifdef __i386__
/* i386 has KVA limits that the raw page counts above don't consider */
if (kmem_used() > (kmem_size() * 3) / 4) {
DTRACE_PROBE2(arc__reclaim_used, uint64_t,
kmem_used(), uint64_t, (kmem_size() * 3) / 4);
return (1);
}
#endif
if (spa_get_random(100) == 0)
return (1);
#endif