static void dowakeup(struct shmif_sc *sc) { struct rumpuser_iovec iov; uint32_t ver = SHMIF_VERSION; size_t n; iov.iov_base = &ver; iov.iov_len = sizeof(ver); rumpuser_iovwrite(sc->sc_memfd, &iov, 1, IFMEM_WAKEUP, &n); }
/* * Read requests from /dev/puffs and forward them to comfd * * XXX: the init detection is really sucky, but let's not * waste too much energy for a better one here */ static void readthread(void *arg) { struct ptargs *pap = arg; struct file *fp; register_t rv; char *buf; off_t off; int error, inited; buf = kmem_alloc(BUFSIZE, KM_SLEEP); inited = 0; retry: kpause(NULL, 0, hz/4, NULL); for (;;) { size_t n; off = 0; fp = fd_getfile(pap->fpfd); if (fp == NULL) error = EINVAL; else error = dofileread(pap->fpfd, fp, buf, BUFSIZE, &off, 0, &rv); if (error) { if (error == ENOENT && inited == 0) goto retry; if (error == ENXIO) break; panic("fileread failed: %d", error); } inited = 1; while (rv) { struct rumpuser_iovec iov; iov.iov_base = buf; iov.iov_len = rv; error = rumpuser_iovwrite(pap->comfd, &iov, 1, RUMPUSER_IOV_NOSEEK, &n); if (error) panic("fileread failed: %d", error); if (n == 0) panic("fileread failed: closed"); rv -= n; } } kthread_exit(0); }