aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/hwpmc/hwpmc_mod.c
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2018-10-30 18:26:34 +0000
committerMark Johnston <markj@FreeBSD.org>2018-10-30 18:26:34 +0000
commit9978bd996b69dc6b320efce25e9d42dbdb25ac8c (patch)
tree47954eac39c356ecb0ade9e84a293f66f084ca1b /sys/dev/hwpmc/hwpmc_mod.c
parent58b6812de1ecbad84ccbd914b87c84a7e94abbb9 (diff)
Add malloc_domainset(9) and _domainset variants to other allocator KPIs.
Remove malloc_domain(9) and most other _domain KPIs added in r327900. The new functions allow the caller to specify a general NUMA domain selection policy, rather than specifically requesting an allocation from a specific domain. The latter policy tends to interact poorly with M_WAITOK, resulting in situations where a caller is blocked indefinitely because the specified domain is depleted. Most existing consumers of the _domain KPIs are converted to instead use a DOMAINSET_PREF() policy, in which we fall back to other domains to satisfy the allocation request. This change also defines a set of DOMAINSET_FIXED() policies, which only permit allocations from the specified domain. Discussed with: gallatin, jeff Reported and tested by: pho (previous version) MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D17418
Notes
Notes: svn path=/head/; revision=339927
Diffstat (limited to 'sys/dev/hwpmc/hwpmc_mod.c')
-rw-r--r--sys/dev/hwpmc/hwpmc_mod.c54
1 files changed, 20 insertions, 34 deletions
diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c
index 1fad25c55702..f94f645b2e39 100644
--- a/sys/dev/hwpmc/hwpmc_mod.c
+++ b/sys/dev/hwpmc/hwpmc_mod.c
@@ -36,6 +36,7 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/domainset.h>
#include <sys/eventhandler.h>
#include <sys/gtaskqueue.h>
#include <sys/jail.h>
@@ -78,14 +79,6 @@ __FBSDID("$FreeBSD$");
#include "hwpmc_soft.h"
-#ifdef NUMA
-#define NDOMAINS vm_ndomains
-#else
-#define NDOMAINS 1
-#define malloc_domain(size, type, domain, flags) malloc((size), (type), (flags))
-#define free_domain(addr, type) free(addr, type)
-#endif
-
#define PMC_EPOCH_ENTER() struct epoch_tracker pmc_et; epoch_enter_preempt(global_epoch_preempt, &pmc_et)
#define PMC_EPOCH_EXIT() epoch_exit_preempt(global_epoch_preempt, &pmc_et)
@@ -5643,15 +5636,16 @@ pmc_initialize(void)
continue;
pc = pcpu_find(cpu);
domain = pc->pc_domain;
- sb = malloc_domain(sizeof(struct pmc_samplebuffer) +
- pmc_nsamples * sizeof(struct pmc_sample), M_PMC, domain,
- M_WAITOK|M_ZERO);
+ sb = malloc_domainset(sizeof(struct pmc_samplebuffer) +
+ pmc_nsamples * sizeof(struct pmc_sample), M_PMC,
+ DOMAINSET_PREF(domain), M_WAITOK | M_ZERO);
KASSERT(pmc_pcpu[cpu] != NULL,
("[pmc,%d] cpu=%d Null per-cpu data", __LINE__, cpu));
- sb->ps_callchains = malloc_domain(pmc_callchaindepth * pmc_nsamples *
- sizeof(uintptr_t), M_PMC, domain, M_WAITOK|M_ZERO);
+ sb->ps_callchains = malloc_domainset(pmc_callchaindepth *
+ pmc_nsamples * sizeof(uintptr_t), M_PMC,
+ DOMAINSET_PREF(domain), M_WAITOK | M_ZERO);
for (n = 0, ps = sb->ps_samples; n < pmc_nsamples; n++, ps++)
ps->ps_pc = sb->ps_callchains +
@@ -5659,35 +5653,27 @@ pmc_initialize(void)
pmc_pcpu[cpu]->pc_sb[PMC_HR] = sb;
- sb = malloc_domain(sizeof(struct pmc_samplebuffer) +
- pmc_nsamples * sizeof(struct pmc_sample), M_PMC, domain,
- M_WAITOK|M_ZERO);
-
- KASSERT(pmc_pcpu[cpu] != NULL,
- ("[pmc,%d] cpu=%d Null per-cpu data", __LINE__, cpu));
-
- sb->ps_callchains = malloc_domain(pmc_callchaindepth * pmc_nsamples *
- sizeof(uintptr_t), M_PMC, domain, M_WAITOK|M_ZERO);
+ sb = malloc_domainset(sizeof(struct pmc_samplebuffer) +
+ pmc_nsamples * sizeof(struct pmc_sample), M_PMC,
+ DOMAINSET_PREF(domain), M_WAITOK | M_ZERO);
+ sb->ps_callchains = malloc_domainset(pmc_callchaindepth *
+ pmc_nsamples * sizeof(uintptr_t), M_PMC,
+ DOMAINSET_PREF(domain), M_WAITOK | M_ZERO);
for (n = 0, ps = sb->ps_samples; n < pmc_nsamples; n++, ps++)
ps->ps_pc = sb->ps_callchains +
(n * pmc_callchaindepth);
pmc_pcpu[cpu]->pc_sb[PMC_SR] = sb;
- sb = malloc_domain(sizeof(struct pmc_samplebuffer) +
- pmc_nsamples * sizeof(struct pmc_sample), M_PMC, domain,
- M_WAITOK|M_ZERO);
-
- KASSERT(pmc_pcpu[cpu] != NULL,
- ("[pmc,%d] cpu=%d Null per-cpu data", __LINE__, cpu));
-
- sb->ps_callchains = malloc_domain(pmc_callchaindepth * pmc_nsamples *
- sizeof(uintptr_t), M_PMC, domain, M_WAITOK|M_ZERO);
-
+ sb = malloc_domainset(sizeof(struct pmc_samplebuffer) +
+ pmc_nsamples * sizeof(struct pmc_sample), M_PMC,
+ DOMAINSET_PREF(domain), M_WAITOK | M_ZERO);
+ sb->ps_callchains = malloc_domainset(pmc_callchaindepth *
+ pmc_nsamples * sizeof(uintptr_t), M_PMC,
+ DOMAINSET_PREF(domain), M_WAITOK | M_ZERO);
for (n = 0, ps = sb->ps_samples; n < pmc_nsamples; n++, ps++)
- ps->ps_pc = sb->ps_callchains +
- (n * pmc_callchaindepth);
+ ps->ps_pc = sb->ps_callchains + n * pmc_callchaindepth;
pmc_pcpu[cpu]->pc_sb[PMC_UR] = sb;
}