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:
parent
1c376286e0
commit
435a09e625
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user