pcq
struct perfuse_cc_queue pcq;
pcq.pcq_type = type;
pcq.pcq_cc = puffs_cc_getcc(pu);
TAILQ_INSERT_TAIL(&pnd->pnd_pcq, &pcq, pcq_next);
__func__, (void *)opc, pcq.pcq_cc,
puffs_cc_yield(pcq.pcq_cc);
TAILQ_REMOVE(&pnd->pnd_pcq, &pcq, pcq_next);
__func__, (void *)opc, pcq.pcq_cc,
struct perfuse_cc_queue *pcq;
TAILQ_FOREACH(pcq, &pnd->pnd_pcq, pcq_next) {
if (pcq->pcq_type != type)
__func__, (void *)opc, pcq->pcq_cc,
puffs_cc_schedule(pcq->pcq_cc);
struct mfi_prod_cons *pcq;
pcq = MFIMEM_KVA(sc->sc_pcq);
DNPRINTF(MFI_D_INTR, "%s: mfi_intr %p %p\n", DEVNAME(sc), sc, pcq);
producer = pcq->mpc_producer;
consumer = pcq->mpc_consumer;
ctx = pcq->mpc_reply_q[consumer];
pcq->mpc_reply_q[consumer] = MFI_INVALID_CTX;
pcq->mpc_consumer = consumer;
pcq_put(sc->pcq, qi.qi_ptr);
if (sc->pcq)
pcq_destroy(sc->pcq);
sc->pcq = pcq_create(SEQ_MAXQ, KM_SLEEP);
if (sc->pcq == NULL) {
qi.qi_ptr = pcq_get(sc->pcq);
pcq_t *pcq;
pcq_advance(pcq_t *pcq, u_int pc)
if (__predict_false(++pc == pcq->pcq_nitems)) {
pcq_put(pcq_t *pcq, void *item)
v = atomic_load_relaxed(&pcq->pcq_pc);
p = pcq_advance(pcq, op);
} while (atomic_cas_32(&pcq->pcq_pc, v, nv) != v);
atomic_store_release(&pcq->pcq_items[op], item);
pcq_peek(pcq_t *pcq)
const uint32_t v = atomic_load_relaxed(&pcq->pcq_pc);
return (p == c) ? NULL : atomic_load_consume(&pcq->pcq_items[c]);
pcq_get(pcq_t *pcq)
v = atomic_load_relaxed(&pcq->pcq_pc);
item = atomic_load_consume(&pcq->pcq_items[c]);
pcq->pcq_items[c] = NULL;
c = pcq_advance(pcq, c);
while (__predict_false(atomic_cas_32(&pcq->pcq_pc, v, nv) != v)) {
v = atomic_load_relaxed(&pcq->pcq_pc);
c = pcq_advance(pcq, c);
pcq_t *pcq;
pcq = kmem_zalloc(offsetof(pcq_t, pcq_items[nitems]), kmflags);
if (pcq != NULL) {
pcq->pcq_nitems = nitems;
return pcq;
pcq_destroy(pcq_t *pcq)
kmem_free(pcq, offsetof(pcq_t, pcq_items[pcq->pcq_nitems]));
pcq_maxitems(pcq_t *pcq)
return pcq->pcq_nitems;
struct pcq **qp = vqp;
struct pcq **qp = vqp, *q = *qp;
static struct pcq *
struct pcq **qp, *q;
pq->pq_pcq = percpu_create(sizeof(struct pcq *),
percpu_free(pq->pq_pcq, sizeof(struct pcq *));
struct pcq *q;
struct pcq *q;
struct pcq **qp, *q, **qs = vqs;
struct pcq *q;
typedef struct pcq pcq_t;