Change type of kmem_used() and kmem_size() functions to uint64_t, so it

doesn't overflow in arc.c in this check:

	if (kmem_used() > (kmem_size() * 4) / 5)
		return (1);

With this bug ZFS almost doesn't cache.

Only 32bit machines are affected that have vm.kmem_size set to values >=1GB.

Reported by:	David Taylor <davidt@yadt.co.uk>
This commit is contained in:
pjd 2008-01-24 11:21:54 +00:00
parent 1c376286e0
commit 435a09e625
4 changed files with 12 additions and 12 deletions
sys
cddl/compat/opensolaris
compat/opensolaris

@ -108,18 +108,18 @@ zfs_kmem_free(void *buf, size_t size __unused)
free(buf, M_SOLARIS);
}
u_long
uint64_t
kmem_size(void)
{
return ((u_long)vm_kmem_size);
return ((uint64_t)vm_kmem_size);
}
u_long
uint64_t
kmem_used(void)
{
return ((u_long)kmem_map->size);
return ((uint64_t)kmem_map->size);
}
static int

@ -56,8 +56,8 @@ typedef struct kmem_cache {
void *zfs_kmem_alloc(size_t size, int kmflags);
void zfs_kmem_free(void *buf, size_t size);
u_long kmem_size(void);
u_long kmem_used(void);
uint64_t kmem_size(void);
uint64_t kmem_used(void);
kmem_cache_t *kmem_cache_create(char *name, size_t bufsize, size_t align,
int (*constructor)(void *, void *, int), void (*destructor)(void *, void *),
void (*reclaim)(void *) __unused, void *private, vmem_t *vmp, int cflags);

@ -108,18 +108,18 @@ zfs_kmem_free(void *buf, size_t size __unused)
free(buf, M_SOLARIS);
}
u_long
uint64_t
kmem_size(void)
{
return ((u_long)vm_kmem_size);
return ((uint64_t)vm_kmem_size);
}
u_long
uint64_t
kmem_used(void)
{
return ((u_long)kmem_map->size);
return ((uint64_t)kmem_map->size);
}
static int

@ -56,8 +56,8 @@ typedef struct kmem_cache {
void *zfs_kmem_alloc(size_t size, int kmflags);
void zfs_kmem_free(void *buf, size_t size);
u_long kmem_size(void);
u_long kmem_used(void);
uint64_t kmem_size(void);
uint64_t kmem_used(void);
kmem_cache_t *kmem_cache_create(char *name, size_t bufsize, size_t align,
int (*constructor)(void *, void *, int), void (*destructor)(void *, void *),
void (*reclaim)(void *) __unused, void *private, vmem_t *vmp, int cflags);