void npf_stats_inc(npf_stats_t st) { uint64_t *stats = percpu_getref(npf_stats_percpu); stats[st]++; percpu_putref(npf_stats_percpu); }
void npf_stats_dec(npf_stats_t st) { uint64_t *stats = percpu_getref(npf_stats_percpu); stats[st]--; percpu_putref(npf_stats_percpu); }
/* * Fetch a per-CPU CPRNG, or create and save one if necessary. */ static struct cprng_strong * rnd_percpu_cprng(void) { struct cprng_strong **cprngp, *cprng, *tmp = NULL; /* Fast path: if there already is a CPRNG for this CPU, use it. */ cprngp = percpu_getref(percpu_urandom_cprng); cprng = *cprngp; if (__predict_true(cprng != NULL)) goto out; percpu_putref(percpu_urandom_cprng); /* * Slow path: create a CPRNG named by this CPU. * * XXX The CPU of the name may be different from the CPU to * which it is assigned, because we need to choose a name and * allocate a cprng while preemption is enabled. This could be * fixed by changing the cprng_strong API (e.g., by adding a * cprng_strong_setname or by separating allocation from * initialization), but it's not clear that's worth the * trouble. */ char name[32]; (void)snprintf(name, sizeof(name), "urandom%u", cpu_index(curcpu())); tmp = cprng_strong_create(name, IPL_NONE, (CPRNG_INIT_ANY | CPRNG_REKEY_ANY)); /* Try again, but we may have been preempted and lost a race. */ cprngp = percpu_getref(percpu_urandom_cprng); cprng = *cprngp; if (__predict_false(cprng != NULL)) goto out; /* Commit the CPRNG we just created. */ cprng = tmp; tmp = NULL; *cprngp = cprng; out: percpu_putref(percpu_urandom_cprng); if (tmp != NULL) cprng_strong_destroy(tmp); KASSERT(cprng != NULL); return cprng; }
void pic_dispatch(struct intrsource *is, void *frame) { int rv __unused; if (__predict_false(is->is_arg == NULL) && __predict_true(frame != NULL)) { rv = (*is->is_func)(frame); } else if (__predict_true(is->is_arg != NULL)) { rv = (*is->is_func)(is->is_arg); } else { pic_deferral_ev.ev_count++; return; } struct pic_percpu * const pcpu = percpu_getref(is->is_pic->pic_percpu); KASSERT(pcpu->pcpu_magic == PICPERCPU_MAGIC); pcpu->pcpu_evs[is->is_irq].ev_count++; percpu_putref(is->is_pic->pic_percpu); }