Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_aio.c
Show First 20 Lines • Show All 242 Lines • ▼ Show 20 Lines | struct aioproc { | ||||
struct proc *aioproc; /* (*) the AIO proc */ | struct proc *aioproc; /* (*) the AIO proc */ | ||||
}; | }; | ||||
/* | /* | ||||
* data-structure for lio signal management | * data-structure for lio signal management | ||||
*/ | */ | ||||
struct aioliojob { | struct aioliojob { | ||||
int lioj_flags; /* (a) listio flags */ | int lioj_flags; /* (a) listio flags */ | ||||
int lioj_count; /* (a) listio flags */ | int lioj_count; /* (a) count of jobs */ | ||||
int lioj_finished_count; /* (a) listio flags */ | int lioj_finished_count; /* (a) count of finished jobs */ | ||||
struct sigevent lioj_signal; /* (a) signal on all I/O done */ | struct sigevent lioj_signal; /* (a) signal on all I/O done */ | ||||
TAILQ_ENTRY(aioliojob) lioj_list; /* (a) lio list */ | TAILQ_ENTRY(aioliojob) lioj_list; /* (a) lio list */ | ||||
struct knlist klist; /* (a) list of knotes */ | struct knlist klist; /* (a) list of knotes */ | ||||
ksiginfo_t lioj_ksi; /* (a) Realtime signal info */ | ksiginfo_t lioj_ksi; /* (a) Realtime signal info */ | ||||
}; | }; | ||||
#define LIOJ_SIGNAL 0x1 /* signal on all done (lio) */ | #define LIOJ_SIGNAL 0x1 /* signal on all done (lio) */ | ||||
#define LIOJ_SIGNAL_POSTED 0x2 /* signal has been posted */ | #define LIOJ_SIGNAL_POSTED 0x2 /* signal has been posted */ | ||||
▲ Show 20 Lines • Show All 200 Lines • ▼ Show 20 Lines | if (p->p_aioinfo == NULL) { | ||||
uma_zfree(kaio_zone, ki); | uma_zfree(kaio_zone, ki); | ||||
} | } | ||||
while (num_aio_procs < MIN(target_aio_procs, max_aio_procs)) | while (num_aio_procs < MIN(target_aio_procs, max_aio_procs)) | ||||
aio_newproc(NULL); | aio_newproc(NULL); | ||||
} | } | ||||
static int | static int | ||||
aio_sendsig(struct proc *p, struct sigevent *sigev, ksiginfo_t *ksi) | aio_sendsig(struct proc *p, struct sigevent *sigev, ksiginfo_t *ksi, bool ext) | ||||
{ | { | ||||
struct thread *td; | struct thread *td; | ||||
int error; | int error; | ||||
error = sigev_findtd(p, sigev, &td); | error = sigev_findtd(p, sigev, &td); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
if (!KSI_ONQ(ksi)) { | if (!KSI_ONQ(ksi)) { | ||||
ksiginfo_set_sigev(ksi, sigev); | ksiginfo_set_sigev(ksi, sigev); | ||||
ksi->ksi_code = SI_ASYNCIO; | ksi->ksi_code = SI_ASYNCIO; | ||||
ksi->ksi_flags |= KSI_EXT | KSI_INS; | ksi->ksi_flags |= ext ? (KSI_EXT | KSI_INS) : 0; | ||||
tdsendsignal(p, td, ksi->ksi_signo, ksi); | tdsendsignal(p, td, ksi->ksi_signo, ksi); | ||||
} | } | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Free a job entry. Wait for completion if it is currently active, but don't | * Free a job entry. Wait for completion if it is currently active, but don't | ||||
▲ Show 20 Lines • Show All 402 Lines • ▼ Show 20 Lines | aio_bio_done_notify(struct proc *userp, struct kaiocb *job) | ||||
TAILQ_INSERT_TAIL(&ki->kaio_done, job, plist); | TAILQ_INSERT_TAIL(&ki->kaio_done, job, plist); | ||||
MPASS(job->jobflags & KAIOCB_FINISHED); | MPASS(job->jobflags & KAIOCB_FINISHED); | ||||
if (ki->kaio_flags & KAIO_RUNDOWN) | if (ki->kaio_flags & KAIO_RUNDOWN) | ||||
goto notification_done; | goto notification_done; | ||||
if (job->uaiocb.aio_sigevent.sigev_notify == SIGEV_SIGNAL || | if (job->uaiocb.aio_sigevent.sigev_notify == SIGEV_SIGNAL || | ||||
job->uaiocb.aio_sigevent.sigev_notify == SIGEV_THREAD_ID) | job->uaiocb.aio_sigevent.sigev_notify == SIGEV_THREAD_ID) | ||||
aio_sendsig(userp, &job->uaiocb.aio_sigevent, &job->ksi); | aio_sendsig(userp, &job->uaiocb.aio_sigevent, &job->ksi, true); | ||||
KNOTE_LOCKED(&job->klist, 1); | KNOTE_LOCKED(&job->klist, 1); | ||||
if (lj_done) { | if (lj_done) { | ||||
if (lj->lioj_signal.sigev_notify == SIGEV_KEVENT) { | if (lj->lioj_signal.sigev_notify == SIGEV_KEVENT) { | ||||
lj->lioj_flags |= LIOJ_KEVENT_POSTED; | lj->lioj_flags |= LIOJ_KEVENT_POSTED; | ||||
KNOTE_LOCKED(&lj->klist, 1); | KNOTE_LOCKED(&lj->klist, 1); | ||||
} | } | ||||
if ((lj->lioj_flags & (LIOJ_SIGNAL|LIOJ_SIGNAL_POSTED)) | if ((lj->lioj_flags & (LIOJ_SIGNAL | LIOJ_SIGNAL_POSTED)) | ||||
== LIOJ_SIGNAL | == LIOJ_SIGNAL && | ||||
&& (lj->lioj_signal.sigev_notify == SIGEV_SIGNAL || | (lj->lioj_signal.sigev_notify == SIGEV_SIGNAL || | ||||
lj->lioj_signal.sigev_notify == SIGEV_THREAD_ID)) { | lj->lioj_signal.sigev_notify == SIGEV_THREAD_ID)) { | ||||
aio_sendsig(userp, &lj->lioj_signal, &lj->lioj_ksi); | aio_sendsig(userp, &lj->lioj_signal, &lj->lioj_ksi, | ||||
true); | |||||
lj->lioj_flags |= LIOJ_SIGNAL_POSTED; | lj->lioj_flags |= LIOJ_SIGNAL_POSTED; | ||||
} | } | ||||
} | } | ||||
notification_done: | notification_done: | ||||
if (job->jobflags & KAIOCB_CHECKSYNC) { | if (job->jobflags & KAIOCB_CHECKSYNC) { | ||||
schedule_fsync = false; | schedule_fsync = false; | ||||
TAILQ_FOREACH_SAFE(sjob, &ki->kaio_syncqueue, list, sjobn) { | TAILQ_FOREACH_SAFE(sjob, &ki->kaio_syncqueue, list, sjobn) { | ||||
▲ Show 20 Lines • Show All 1,308 Lines • ▼ Show 20 Lines | while (lj->lioj_count - 1 != lj->lioj_finished_count) { | ||||
break; | break; | ||||
} | } | ||||
} else { | } else { | ||||
if (lj->lioj_count - 1 == lj->lioj_finished_count) { | if (lj->lioj_count - 1 == lj->lioj_finished_count) { | ||||
if (lj->lioj_signal.sigev_notify == SIGEV_KEVENT) { | if (lj->lioj_signal.sigev_notify == SIGEV_KEVENT) { | ||||
lj->lioj_flags |= LIOJ_KEVENT_POSTED; | lj->lioj_flags |= LIOJ_KEVENT_POSTED; | ||||
KNOTE_LOCKED(&lj->klist, 1); | KNOTE_LOCKED(&lj->klist, 1); | ||||
} | } | ||||
if ((lj->lioj_flags & (LIOJ_SIGNAL|LIOJ_SIGNAL_POSTED)) | if ((lj->lioj_flags & (LIOJ_SIGNAL | LIOJ_SIGNAL_POSTED)) | ||||
== LIOJ_SIGNAL | == LIOJ_SIGNAL && | ||||
&& (lj->lioj_signal.sigev_notify == SIGEV_SIGNAL || | (lj->lioj_signal.sigev_notify == SIGEV_SIGNAL || | ||||
lj->lioj_signal.sigev_notify == SIGEV_THREAD_ID)) { | lj->lioj_signal.sigev_notify == SIGEV_THREAD_ID)) { | ||||
aio_sendsig(p, &lj->lioj_signal, | aio_sendsig(p, &lj->lioj_signal, &lj->lioj_ksi, | ||||
&lj->lioj_ksi); | lj->lioj_count != 1); | ||||
lj->lioj_flags |= LIOJ_SIGNAL_POSTED; | lj->lioj_flags |= LIOJ_SIGNAL_POSTED; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
lj->lioj_count--; | lj->lioj_count--; | ||||
if (lj->lioj_count == 0) { | if (lj->lioj_count == 0) { | ||||
TAILQ_REMOVE(&ki->kaio_liojoblist, lj, lioj_list); | TAILQ_REMOVE(&ki->kaio_liojoblist, lj, lioj_list); | ||||
knlist_delete(&lj->klist, curthread, 1); | knlist_delete(&lj->klist, curthread, 1); | ||||
▲ Show 20 Lines • Show All 744 Lines • Show Last 20 Lines |