Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Split deep vmem_alloc()/vmem_xalloc() stacks #94

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions include/os/macos/spl/sys/vmem_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,14 @@ typedef struct vmem_kstat {
kstat_named_t vk_threads_waiting; /* threads in cv_wait in vmem */
/* allocator function */
kstat_named_t vk_excess; /* count of retained excess imports */
kstat_named_t vk_lowest_stack; /* least remaining stack seen */
kstat_named_t vk_async_stack_calls; /* times allocated off-thread */
} vmem_kstat_t;


/* forward declaration of opaque xnu struct */
typedef struct thread_call *thread_call_t;

struct vmem {
char vm_name[VMEM_NAMELEN]; /* arena name */
kcondvar_t vm_cv; /* cv for blocking allocations */
Expand Down Expand Up @@ -146,6 +152,9 @@ struct vmem {
void *vm_qcache[VMEM_NQCACHE_MAX]; /* quantum caches */
vmem_freelist_t vm_freelist[VMEM_FREELISTS + 1]; /* power-of-2 flists */
vmem_kstat_t vm_kstat; /* kstat data */
thread_call_t vm_stack_call_thread;
kmutex_t vm_stack_lock;
kcondvar_t vm_stack_cv;
};

#ifdef __cplusplus
Expand Down
23 changes: 19 additions & 4 deletions module/os/macos/spl/spl-kmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
* Copyright (C) 2008 MacZFS
* Copyright (C) 2013, 2020 Jorgen Lundman <[email protected]>
* Copyright (C) 2014 Brendon Humphrey <[email protected]>
* Copyright (C) 2017 Sean Doran <[email protected]>
* Copyright (C) 2017, 2021 Sean Doran <[email protected]>
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*
*/
Expand Down Expand Up @@ -510,6 +510,9 @@ uint64_t spl_arc_reclaim_avoided = 0;

uint64_t kmem_free_to_slab_when_fragmented = 0;

extern _Atomic unsigned int spl_lowest_stack_remaining;
extern unsigned int spl_vmem_split_stack_below;

typedef struct spl_stats {
kstat_named_t spl_os_alloc;
kstat_named_t spl_active_threads;
Expand Down Expand Up @@ -574,6 +577,8 @@ typedef struct spl_stats {
kstat_named_t spl_vm_pages_reclaimed;
kstat_named_t spl_vm_pages_wanted;
kstat_named_t spl_vm_pressure_level;
kstat_named_t spl_lowest_stack_remaining;
kstat_named_t spl_vmem_split_stack_below;
} spl_stats_t;

static spl_stats_t spl_stats = {
Expand Down Expand Up @@ -640,6 +645,8 @@ static spl_stats_t spl_stats = {
{"spl_vm_pages_reclaimed", KSTAT_DATA_UINT64},
{"spl_vm_pages_wanted", KSTAT_DATA_UINT64},
{"spl_vm_pressure_level", KSTAT_DATA_UINT64},
{"lowest_stack_remaining", KSTAT_DATA_UINT64},
{"split_stack_below", KSTAT_DATA_UINT64},
};

static kstat_t *spl_ksp = 0;
Expand Down Expand Up @@ -4422,7 +4429,6 @@ static void
spl_free_thread()
{
callb_cpr_t cpr;
uint64_t last_update = zfs_lbolt();
int64_t last_spl_free;

CALLB_CPR_INIT(&cpr, &spl_free_thread_lock, callb_generic_cpr, FTAG);
Expand Down Expand Up @@ -4827,8 +4833,6 @@ spl_free_thread()
new_spl_free = -1024LL;
}

double delta = (double)new_spl_free - (double)last_spl_free;

boolean_t spl_free_is_negative = false;

if (new_spl_free < 0LL) {
Expand Down Expand Up @@ -4948,6 +4952,13 @@ spl_kstat_update(kstat_t *ksp, int rw)
ks->kmem_free_to_slab_when_fragmented.value.ui64;
}

if ((unsigned int) ks->spl_vmem_split_stack_below.value.ui64 !=
spl_vmem_split_stack_below) {
spl_vmem_split_stack_below =
(unsigned int)
ks->spl_vmem_split_stack_below.value.ui64;
}

} else {
ks->spl_os_alloc.value.ui64 = segkmem_total_mem_allocated;
ks->spl_active_threads.value.ui64 = zfs_threads;
Expand Down Expand Up @@ -5036,6 +5047,10 @@ spl_kstat_update(kstat_t *ksp, int rw)
ks->spl_vm_pressure_level.value.ui64 =
spl_vm_pressure_level;

ks->spl_lowest_stack_remaining.value.ui64 =
spl_lowest_stack_remaining;
ks->spl_vmem_split_stack_below.value.ui64 =
spl_vmem_split_stack_below;
}

return (0);
Expand Down
Loading