Home | History | Annotate | Download | only in puffs

Lines Matching defs:park

60  * While a request is going to userspace, park the caller within the
101 struct puffs_msgpark *park = obj;
103 mutex_init(&park->park_mtx, MUTEX_DEFAULT, IPL_NONE);
104 cv_init(&park->park_cv, "puffsrpl");
112 struct puffs_msgpark *park = obj;
114 cv_destroy(&park->park_cv);
115 mutex_destroy(&park->park_mtx);
136 struct puffs_msgpark *park;
140 park = pool_cache_get(parkpc, waitok ? PR_WAITOK : PR_NOWAIT);
141 if (park == NULL)
142 return park;
144 park->park_refcount = 1;
145 park->park_preq = park->park_creq = NULL;
146 park->park_flags = PARKFLAG_WANTREPLY;
152 return park;
156 puffs_msgpark_reference(struct puffs_msgpark *park)
159 KASSERT(mutex_owned(&park->park_mtx));
160 park->park_refcount++;
164 * Release reference to park structure.
167 puffs_msgpark_release1(struct puffs_msgpark *park, int howmany)
169 struct puffs_req *preq = park->park_preq;
170 struct puffs_req *creq = park->park_creq;
173 KASSERT(mutex_owned(&park->park_mtx));
174 refcnt = park->park_refcount -= howmany;
175 mutex_exit(&park->park_mtx);
181 kmem_free(preq, park->park_maxlen);
184 kmem_free(creq, park->park_creqlen);
186 pool_cache_put(parkpc, park);
197 parkdump(struct puffs_msgpark *park)
200 DPRINTF(("park %p, preq %p, id %" PRIu64 "\n"
203 park, park->park_preq, park->park_preq->preq_id,
204 park->park_copylen, park->park_maxlen,
205 park->park_done, park->park_donearg,
206 park->park_flags, park->park_refcount,
207 &park->park_cv, &park->park_mtx));
213 struct puffs_msgpark *park;
216 TAILQ_FOREACH(park, q, park_entries) {
218 parkdump(park);
227 * A word about locking in the park structures: the lock protects the
228 * fields of the *park* structure (not preq) and acts as an interlock
237 struct puffs_msgpark *park;
247 park = puffs_msgpark_alloc(cansleep);
248 if (park == NULL) {
254 park->park_preq = m;
255 park->park_maxlen = park->park_copylen = len;
257 *ppark = park;
264 puffs_msgmem_release(struct puffs_msgpark *park)
267 if (park == NULL)
270 mutex_enter(&park->park_mtx);
271 puffs_msgpark_release(park);
275 puffs_msg_setfaf(struct puffs_msgpark *park)
278 KASSERT((park->park_flags & PARKFLAG_CALL) == 0);
279 park->park_flags &= ~PARKFLAG_WANTREPLY;
283 puffs_msg_setdelta(struct puffs_msgpark *park, size_t delta)
286 KASSERT(delta < park->park_maxlen); /* "<=" wouldn't make sense */
287 park->park_copylen = park->park_maxlen - delta;
291 puffs_msg_setinfo(struct puffs_msgpark *park, int opclass, int type,
295 park->park_preq->preq_opclass = PUFFSOP_OPCLASS(opclass);
296 park->park_preq->preq_optype = type;
297 park->park_preq->preq_cookie = ck;
301 puffs_msg_setcall(struct puffs_msgpark *park, parkdone_fn donefn, void *donearg)
304 KASSERT(park->park_flags & PARKFLAG_WANTREPLY);
305 park->park_done = donefn;
306 park->park_donearg = donearg;
307 park->park_flags |= PARKFLAG_CALL;
328 * when accessing a park and additionally when it is on a queue. So
334 puffs_msg_enqueue(struct puffs_mount *pmp, struct puffs_msgpark *park)
344 * Some clients reuse a park, so reset some flags. We might
348 park->park_flags &= ~(PARKFLAG_DONE | PARKFLAG_HASERROR);
349 KASSERT((park->park_flags & PARKFLAG_WAITERGONE) == 0);
351 preq = park->park_preq;
359 park->park_creq = park->park_preq;
360 park->park_creqlen = park->park_maxlen;
362 park->park_maxlen += delta;
363 park->park_copylen += delta;
364 park->park_preq = preq = creq;
369 preq->preq_buflen = park->park_maxlen;
373 if ((park->park_flags & PARKFLAG_WANTREPLY) == 0)
389 if (__predict_false((park->park_flags & PARKFLAG_WANTREPLY)
390 && (park->park_flags & PARKFLAG_CALL) == 0
403 park->park_flags |= PARKFLAG_HASERROR;
408 park->park_preq->preq_opclass |=
410 park->park_flags &= ~PARKFLAG_WANTREPLY;
412 "converted to FAF %p\n", park));
422 park->park_flags |= PARKFLAG_HASERROR;
433 * Note: we don't need to lock park since we have the only
436 TAILQ_INSERT_TAIL(&pmp->pmp_msg_touser, park, park_entries);
437 park->park_flags |= PARKFLAG_ONQUEUE1;
439 park->park_refcount++;
445 DPRINTF(("touser: req %" PRIu64 ", preq: %p, park: %p, "
446 "c/t: 0x%x/0x%x, f: 0x%x\n", preq->preq_id, preq, park,
447 preq->preq_opclass, preq->preq_optype, park->park_flags));
451 puffs_msg_wait(struct puffs_mount *pmp, struct puffs_msgpark *park)
455 struct puffs_req *preq = park->park_preq; /* XXX: hmmm */
481 mutex_enter(&park->park_mtx);
483 if (__predict_false((park->park_flags & PARKFLAG_DONE)
484 || (park->park_flags & PARKFLAG_HASERROR))) {
485 rv = park->park_preq->preq_rv;
486 mutex_exit(&park->park_mtx);
490 if ((park->park_flags & PARKFLAG_WANTREPLY) == 0
491 || (park->park_flags & PARKFLAG_CALL)) {
492 mutex_exit(&park->park_mtx);
497 error = cv_wait_sig(&park->park_cv, &park->park_mtx);
499 park, error));
501 park->park_flags |= PARKFLAG_WAITERGONE;
502 if (park->park_flags & PARKFLAG_DONE) {
504 mutex_exit(&park->park_mtx);
515 mutex_exit(&park->park_mtx);
517 mutex_enter(&park->park_mtx);
527 if (park->park_flags & PARKFLAG_ONQUEUE1) {
529 park, park_entries);
530 puffs_msgpark_release(park);
532 park->park_flags &= ~PARKFLAG_ONQUEUE1;
534 mutex_exit(&park->park_mtx);
542 mutex_exit(&park->park_mtx);
562 puffs_msg_wait2(struct puffs_mount *pmp, struct puffs_msgpark *park,
568 rv = puffs_msg_wait(pmp, park);
570 preq = park->park_preq;
593 struct puffs_msgpark *park;
596 puffs_msgmem_alloc(sizeof(struct puffs_req), &park, (void *)&preq, 1);
597 puffs_msg_setfaf(park); /* XXXXXX: avoids reqid override */
603 puffs_msg_enqueue(pmp, park);
604 puffs_msgmem_release(park);
617 struct puffs_msgpark *park = NULL;
649 park = TAILQ_FIRST(&pmp->pmp_msg_touser);
650 if (park == NULL)
653 mutex_enter(&park->park_mtx);
654 puffs_msgpark_reference(park);
656 park at %p, ", park));
659 if (park->park_flags & PARKFLAG_WAITERGONE) {
661 puffs_msgpark_release(park);
664 preq = park->park_preq;
675 puffs_msgpark_release(park);
691 TAILQ_REMOVE(&pmp->pmp_msg_touser, park, park_entries);
692 KASSERT(park->park_flags & PARKFLAG_ONQUEUE1);
693 park->park_flags &= ~PARKFLAG_ONQUEUE1;
694 mutex_exit(&park->park_mtx);
706 preq->preq_pth.pth_framelen = park->park_copylen;
708 *parkptr = park;
723 struct puffs_msgpark *park = parkptr;
725 DPRINTF(("puffs_releaseout: returning park %p, errno %d: " ,
726 park, status));
728 mutex_enter(&park->park_mtx);
729 if (park->park_flags & PARKFLAG_WANTREPLY) {
732 TAILQ_INSERT_TAIL(&pmp->pmp_msg_replywait, park,
734 park->park_flags |= PARKFLAG_ONQUEUE2;
737 park->park_preq->preq_rv = status;
738 park->park_flags |= PARKFLAG_DONE;
739 cv_signal(&park->park_cv);
741 puffs_msgpark_release(park);
744 puffs_msgpark_release1(park, 2);
770 struct puffs_msgpark *park;
776 TAILQ_FOREACH(park, &pmp->pmp_msg_replywait, park_entries) {
777 if (park->park_preq->preq_id == preq->preq_id)
780 if (park == NULL) {
787 mutex_enter(&park->park_mtx);
788 puffs_msgpark_reference(park);
789 if (pth->pth_framelen > park->park_maxlen) {
793 park->park_preq->preq_rv = EPROTO;
794 cv_signal(&park->park_cv);
795 puffs_msgpark_release1(park, 2);
799 wgone = park->park_flags & PARKFLAG_WAITERGONE;
801 KASSERT(park->park_flags & PARKFLAG_ONQUEUE2);
802 TAILQ_REMOVE(&pmp->pmp_msg_replywait, park, park_entries);
803 park->park_flags &= ~PARKFLAG_ONQUEUE2;
808 "park %p\n", park));
811 if (park->park_creq) {
817 (preq, park->park_creq), __nothing);
818 creq = park->park_creq;
819 csize = park->park_creqlen;
820 park->park_creq = park->park_preq;
821 park->park_creqlen = park->park_maxlen;
823 park->park_preq = creq;
824 park->park_maxlen = csize;
826 memcpy(park->park_creq, preq, pth->pth_framelen);
829 memcpy(park->park_preq, preq, pth->pth_framelen);
832 if (park->park_flags & PARKFLAG_CALL) {
834 park->park_preq, park->park_donearg));
835 park->park_done(pmp, preq, park->park_donearg);
841 "park %p\n", park));
842 cv_signal(&park->park_cv);
845 park->park_flags |= PARKFLAG_DONE;
846 puffs_msgpark_release1(park, 2);
1215 struct puffs_msgpark *park, *park_next;
1224 for (park = TAILQ_FIRST(&pmp->pmp_msg_touser); park; park = park_next) {
1226 mutex_enter(&park->park_mtx);
1227 puffs_msgpark_reference(park);
1228 park_next = TAILQ_NEXT(park, park_entries);
1230 KASSERT(park->park_flags & PARKFLAG_ONQUEUE1);
1231 TAILQ_REMOVE(&pmp->pmp_msg_touser, park, park_entries);
1232 park->park_flags &= ~PARKFLAG_ONQUEUE1;
1242 if (park->park_flags & PARKFLAG_WAITERGONE) {
1243 KASSERT((park->park_flags & PARKFLAG_CALL) == 0);
1244 KASSERT(park->park_flags & PARKFLAG_WANTREPLY);
1245 puffs_msgpark_release(park);
1248 park->park_preq->preq_rv = ENXIO;
1250 if (park->park_flags & PARKFLAG_CALL) {
1251 park->park_done(pmp, park->park_preq,
1252 park->park_donearg);
1253 puffs_msgpark_release1(park, 2);
1254 } else if ((park->park_flags & PARKFLAG_WANTREPLY)==0) {
1255 puffs_msgpark_release1(park, 2);
1257 park->park_preq->preq_rv = ENXIO;
1258 cv_signal(&park->park_cv);
1259 puffs_msgpark_release(park);
1265 for (park=TAILQ_FIRST(&pmp->pmp_msg_replywait); park; park=park_next) {
1266 mutex_enter(&park->park_mtx);
1267 puffs_msgpark_reference(park);
1268 park_next = TAILQ_NEXT(park, park_entries);
1270 KASSERT(park->park_flags & PARKFLAG_ONQUEUE2);
1271 KASSERT(park->park_flags & PARKFLAG_WANTREPLY);
1273 TAILQ_REMOVE(&pmp->pmp_msg_replywait, park, park_entries);
1274 park->park_flags &= ~PARKFLAG_ONQUEUE2;
1276 if (park->park_flags & PARKFLAG_WAITERGONE) {
1277 KASSERT((park->park_flags & PARKFLAG_CALL) == 0);
1278 puffs_msgpark_release(park);
1280 park
1281 if (park->park_flags & PARKFLAG_CALL) {
1282 park->park_done(pmp, park->park_preq,
1283 park->park_donearg);
1284 puffs_msgpark_release1(park, 2);
1286 cv_signal(&park->park_cv);
1287 puffs_msgpark_release(park);