Lines Matching refs:entryp
172 static void aio_proc_move_done_locked(proc_t procp, aio_workq_entry *entryp);
173 static void aio_proc_remove_done_locked(proc_t procp, aio_workq_entry *entryp);
178 static boolean_t should_cancel(aio_workq_entry *entryp, user_addr_t aiocbp, int fd);
180 static void aio_entry_lock(aio_workq_entry *entryp);
181 static void aio_entry_lock_spin(aio_workq_entry *entryp);
182 static aio_workq_t aio_entry_workq(aio_workq_entry *entryp);
183 static lck_mtx_t* aio_entry_mutex(__unused aio_workq_entry *entryp);
184 static void aio_workq_remove_entry_locked(aio_workq_t queue, aio_workq_entry *entryp);
185 static void aio_workq_add_entry_locked(aio_workq_t queue, aio_workq_entry *entryp);
186 static void aio_entry_ref_locked(aio_workq_entry *entryp);
187 static void aio_entry_unref_locked(aio_workq_entry *entryp);
188 static void aio_entry_ref(aio_workq_entry *entryp);
189 static void aio_entry_unref(aio_workq_entry *entryp);
190 static void aio_entry_update_for_cancel(aio_workq_entry *entryp, boolean_t cancelled,
192 static int aio_entry_try_workq_remove(aio_workq_entry *entryp);
193 static boolean_t aio_delay_fsync_request( aio_workq_entry *entryp );
194 static int aio_free_request(aio_workq_entry *entryp);
206 static int aio_validate( aio_workq_entry *entryp );
211 static void do_aio_completion( aio_workq_entry *entryp );
212 static int do_aio_fsync( aio_workq_entry *entryp );
213 static int do_aio_read( aio_workq_entry *entryp );
214 static int do_aio_write( aio_workq_entry *entryp );
227 static void aio_enqueue_work( proc_t procp, aio_workq_entry *entryp, int proc_locked);
270 aio_entry_lock(__unused aio_workq_entry *entryp)
276 aio_entry_lock_spin(__unused aio_workq_entry *entryp)
282 aio_entry_unlock(__unused aio_workq_entry *entryp)
289 aio_entry_workq(__unused aio_workq_entry *entryp)
295 aio_entry_mutex(__unused aio_workq_entry *entryp)
314 aio_workq_remove_entry_locked(aio_workq_t queue, aio_workq_entry *entryp)
318 if (entryp->aio_workq_link.tqe_prev == NULL) {
322 TAILQ_REMOVE(&queue->aioq_entries, entryp, aio_workq_link);
324 entryp->aio_workq_link.tqe_prev = NULL; /* Not on a workq */
332 aio_workq_add_entry_locked(aio_workq_t queue, aio_workq_entry *entryp)
336 TAILQ_INSERT_TAIL(&queue->aioq_entries, entryp, aio_workq_link);
356 aio_proc_move_done_locked(proc_t procp, aio_workq_entry *entryp)
360 TAILQ_REMOVE(&procp->p_aio_activeq, entryp, aio_proc_link );
361 TAILQ_INSERT_TAIL( &procp->p_aio_doneq, entryp, aio_proc_link);
367 aio_proc_remove_done_locked(proc_t procp, aio_workq_entry *entryp)
369 TAILQ_REMOVE(&procp->p_aio_doneq, entryp, aio_proc_link);
388 aio_entry_ref_locked(aio_workq_entry *entryp)
390 ASSERT_AIO_ENTRY_LOCK_OWNED(entryp);
392 if (entryp->aio_refcount < 0) {
395 entryp->aio_refcount++;
401 aio_entry_unref_locked(aio_workq_entry *entryp)
403 ASSERT_AIO_ENTRY_LOCK_OWNED(entryp);
405 entryp->aio_refcount--;
406 if (entryp->aio_refcount < 0) {
412 aio_entry_ref(aio_workq_entry *entryp)
414 aio_entry_lock_spin(entryp);
415 aio_entry_ref_locked(entryp);
416 aio_entry_unlock(entryp);
419 aio_entry_unref(aio_workq_entry *entryp)
421 aio_entry_lock_spin(entryp);
422 aio_entry_unref_locked(entryp);
424 if ((entryp->aio_refcount == 0) && ((entryp->flags & AIO_DO_FREE) != 0)) {
425 aio_entry_unlock(entryp);
426 aio_free_request(entryp);
428 aio_entry_unlock(entryp);
435 aio_entry_update_for_cancel(aio_workq_entry *entryp, boolean_t cancelled, int wait_for_completion, boolean_t disable_notification)
437 aio_entry_lock_spin(entryp);
440 aio_entry_ref_locked(entryp);
441 entryp->errorval = ECANCELED;
442 entryp->returnval = -1;
446 entryp->flags |= wait_for_completion; /* flag for special completion processing */
450 entryp->flags |= AIO_DISABLE; /* Don't want a signal */
453 aio_entry_unlock(entryp);
457 aio_entry_try_workq_remove(aio_workq_entry *entryp)
460 if (entryp->aio_workq_link.tqe_prev != NULL) {
464 queue = aio_entry_workq(entryp);
466 if (entryp->aio_workq_link.tqe_prev != NULL) {
467 aio_workq_remove_entry_locked(queue, entryp);
634 aio_workq_entry *entryp;
648 TAILQ_FOREACH( entryp, &p->p_aio_doneq, aio_proc_link) {
649 if ( entryp->uaiocbp == uap->aiocbp ) {
650 ASSERT_AIO_FROM_PROC(entryp, p);
652 aio_entry_lock_spin(entryp);
653 *retval = entryp->errorval;
655 aio_entry_unlock(entryp);
663 TAILQ_FOREACH( entryp, &p->p_aio_activeq, aio_proc_link) {
664 if ( entryp->uaiocbp == uap->aiocbp ) {
665 ASSERT_AIO_FROM_PROC(entryp, p);
763 aio_workq_entry *entryp;
781 TAILQ_FOREACH( entryp, &p->p_aio_doneq, aio_proc_link) {
782 ASSERT_AIO_FROM_PROC(entryp, p);
783 if ( entryp->uaiocbp == uap->aiocbp ) {
785 aio_proc_remove_done_locked(p, entryp);
788 aio_entry_lock(entryp);
792 *retval = entryp->returnval;
796 if (entryp->aio_refcount == 0) {
797 aio_entry_unlock(entryp);
798 aio_free_request(entryp);
802 entryp->flags |= AIO_DO_FREE;
803 aio_entry_unlock(entryp);
814 TAILQ_FOREACH( entryp, &p->p_aio_activeq, aio_proc_link) {
815 ASSERT_AIO_FROM_PROC(entryp, p);
816 if ( entryp->uaiocbp == uap->aiocbp ) {
871 aio_workq_entry *entryp;
913 entryp = TAILQ_FIRST( &p->p_aio_doneq );
914 while ( entryp != NULL ) {
915 ASSERT_AIO_FROM_PROC(entryp, p);
918 next_entryp = TAILQ_NEXT( entryp, aio_proc_link);
919 aio_proc_remove_done_locked(p, entryp);
922 aio_entry_lock_spin(entryp);
923 if (entryp->aio_refcount == 0) {
925 aio_entry_unlock(entryp);
926 aio_free_request(entryp);
931 entryp = TAILQ_FIRST( &p->p_aio_doneq );
936 entryp->flags |= AIO_DO_FREE;
939 aio_entry_unlock(entryp);
940 entryp = next_entryp;
953 should_cancel(aio_workq_entry *entryp, user_addr_t aiocbp, int fd)
956 (aiocbp != USER_ADDR_NULL && entryp->uaiocbp == aiocbp) ||
957 (aiocbp == USER_ADDR_NULL && fd == entryp->aiocb.aio_fildes) ) {
986 aio_workq_entry *entryp;
992 entryp = TAILQ_FIRST(&p->p_aio_activeq);
993 while ( entryp != NULL ) {
994 ASSERT_AIO_FROM_PROC(entryp, p);
997 next_entryp = TAILQ_NEXT( entryp, aio_proc_link);
998 if (!should_cancel(entryp, aiocbp, fd)) {
999 entryp = next_entryp;
1004 if (aio_entry_try_workq_remove(entryp) != 0) {
1006 aio_entry_update_for_cancel(entryp, TRUE, 0, disable_notification);
1009 aio_proc_move_done_locked(p, entryp);
1015 (int)entryp->procp, (int)entryp->uaiocbp, fd, 0, 0 );
1016 do_aio_completion(entryp);
1019 aio_entry_unref(entryp);
1036 entryp = TAILQ_FIRST(&p->p_aio_activeq);
1046 (int)entryp->procp, (int)entryp->uaiocbp, fd, 0, 0 );
1049 aio_entry_update_for_cancel(entryp, FALSE, wait_for_completion, disable_notification);
1054 entryp = next_entryp;
1066 TAILQ_FOREACH(entryp, &p->p_aio_doneq, aio_proc_link) {
1067 ASSERT_AIO_FROM_PROC(entryp, p);
1068 if (should_cancel(entryp, aiocbp, fd)) {
1071 (int)entryp->procp, (int)entryp->uaiocbp, fd, 0, 0 );
1110 aio_workq_entry *entryp;
1181 TAILQ_FOREACH( entryp, &p->p_aio_doneq, aio_proc_link) {
1182 ASSERT_AIO_FROM_PROC(entryp, p);
1183 if ( entryp->uaiocbp == aiocbp ) {
1209 * (see entryp->uaiocbp == aiocbp after check_for_our_aiocbp label)
1362 * entryp The work queue entry being queued
1376 aio_enqueue_work( proc_t procp, aio_workq_entry *entryp, int proc_locked)
1381 aio_workq_t queue = aio_entry_workq(entryp);
1390 TAILQ_INSERT_TAIL(&procp->p_aio_activeq, entryp, aio_proc_link);
1396 aio_workq_add_entry_locked(queue, entryp);
1422 entryp->priority = (((2 * NZERO) - 1) - procp->p_nice);
1425 if (entryp->aiocb.aio_reqprio < 0)
1426 entryp->aiocb.aio_reqprio = 0;
1427 if (entryp->aiocb.aio_reqprio > 0) {
1428 entryp->priority -= entryp->aiocb.aio_reqprio;
1429 if (entryp->priority < 0)
1430 entryp->priority = 0;
1435 if ( entryp->priority <= my_entryp->priority) {
1436 TAILQ_INSERT_BEFORE(my_entryp, entryp, aio_workq_link);
1441 TAILQ_INSERT_TAIL( &aio_anchor.aio_async_workq, entryp, aio_workq_link );
1531 aio_workq_entry *entryp;
1558 entryp = *(entryp_listp + i);
1559 if ( entryp == NULL ) {
1568 entryp->aiocb.aio_sigevent = aiosigev;
1571 entryp->flags |= AIO_LIO_NOTIFY;
1579 aio_get_process_count( entryp->procp ) >= aio_max_requests_per_process ||
1580 is_already_queued( entryp->procp, entryp->uaiocbp ) == TRUE ) {
1589 aio_free_request(entryp);
1595 aio_enqueue_work(p, entryp, 1);
1599 (int)p, (int)entryp->uaiocbp, 0, 0, 0 );
1659 aio_workq_entry *entryp;
1671 entryp = aio_get_some_work();
1674 (int)entryp->procp, (int)entryp->uaiocbp, entryp->flags, 0, 0 );
1678 * of the IO. Note: don't need to have the entryp locked,
1682 if ( currentmap != entryp->aio_map ) {
1685 uthreadp->uu_aio_task = entryp->procp->task;
1686 oldmap = vm_map_switch( entryp->aio_map );
1689 if ( (entryp->flags & AIO_READ) != 0 ) {
1690 error = do_aio_read( entryp );
1692 else if ( (entryp->flags & AIO_WRITE) != 0 ) {
1693 error = do_aio_write( entryp );
1695 else if ( (entryp->flags & (AIO_FSYNC | AIO_DSYNC)) != 0 ) {
1696 error = do_aio_fsync( entryp );
1700 __FUNCTION__, entryp->flags );
1705 if ( currentmap != entryp->aio_map ) {
1711 (int)entryp->procp, (int)entryp->uaiocbp, entryp->errorval,
1712 entryp->returnval, 0 );
1716 aio_entry_lock_spin(entryp);
1717 entryp->errorval = error;
1718 aio_entry_unlock(entryp);
1722 aio_proc_lock(entryp->procp);
1723 aio_proc_move_done_locked(entryp->procp, entryp);
1724 aio_proc_unlock(entryp->procp);
1729 if ( VM_MAP_NULL != entryp->aio_map ) {
1732 my_map = entryp->aio_map;
1733 entryp->aio_map = VM_MAP_NULL;
1738 do_aio_completion( entryp );
1741 aio_entry_unref(entryp);
1759 aio_workq_entry *entryp = NULL;
1780 entryp = TAILQ_FIRST(&queue->aioq_entries);
1786 if (entryp == NULL) {
1790 aio_workq_remove_entry_locked(queue, entryp);
1798 if ( (entryp->flags & AIO_FSYNC) != 0 ) {
1803 aio_proc_lock_spin(entryp->procp);
1804 if ( aio_delay_fsync_request( entryp ) ) {
1807 (int)entryp->procp, (int)entryp->uaiocbp, 0, 0, 0 );
1809 aio_proc_unlock(entryp->procp);
1812 aio_workq_add_entry_locked(queue, entryp);
1815 aio_proc_unlock(entryp->procp);
1821 aio_entry_ref(entryp);
1824 return( entryp );
1842 aio_delay_fsync_request( aio_workq_entry *entryp )
1844 if (entryp == TAILQ_FIRST(&entryp->procp->p_aio_activeq)) {
1854 aio_workq_entry *entryp;
1857 entryp = (aio_workq_entry *) zalloc( aio_workq_zonep );
1858 if ( entryp == NULL ) {
1863 bzero( entryp, sizeof(*entryp) );
1866 entryp->procp = procp;
1867 entryp->uaiocbp = aiocbp;
1868 entryp->flags |= kindOfIO;
1869 entryp->group_tag = group_tag;
1870 entryp->aio_map = VM_MAP_NULL;
1871 entryp->aio_refcount = 0;
1878 do_munge_aiocb_user64_to_user(&aiocb64, &entryp->aiocb);
1885 do_munge_aiocb_user32_to_user( &aiocb32, &entryp->aiocb );
1894 entryp->aio_map = get_task_map( procp->task );
1895 vm_map_reference( entryp->aio_map );
1898 result = aio_validate( entryp );
1901 if ( result && entryp != NULL ) {
1902 zfree( aio_workq_zonep, entryp );
1903 entryp = NULL;
1906 return ( entryp );
1919 aio_workq_entry *entryp;
1929 entryp = aio_create_queue_entry( procp, aiocbp, 0, kindOfIO);
1930 if ( entryp == NULL ) {
1938 if ( is_already_queued( entryp->procp, entryp->uaiocbp ) == TRUE ) {
1952 aio_enqueue_work(procp, entryp, 1);
1967 aio_free_request(entryp);
2009 aio_workq_entry *entryp;
2012 entryp = aio_create_queue_entry( procp, aiocbp, group_tag, AIO_LIO);
2013 if ( entryp == NULL ) {
2022 if ( entryp->aiocb.aio_lio_opcode == LIO_NOP ) {
2027 *entrypp = entryp;
2032 if ( entryp != NULL ) {
2037 aio_free_request(entryp);
2052 aio_free_request(aio_workq_entry *entryp)
2055 if ( VM_MAP_NULL != entryp->aio_map) {
2056 vm_map_deallocate(entryp->aio_map);
2059 entryp->aio_refcount = -1; /* A bit of poisoning in case of bad refcounting. */
2061 zfree( aio_workq_zonep, entryp );
2074 aio_validate( aio_workq_entry *entryp )
2082 if ( (entryp->flags & AIO_LIO) != 0 ) {
2083 if ( entryp->aiocb.aio_lio_opcode == LIO_READ )
2084 entryp->flags |= AIO_READ;
2085 else if ( entryp->aiocb.aio_lio_opcode == LIO_WRITE )
2086 entryp->flags |= AIO_WRITE;
2087 else if ( entryp->aiocb.aio_lio_opcode == LIO_NOP )
2094 if ( (entryp->flags & (AIO_WRITE | AIO_FSYNC | AIO_DSYNC)) != 0 ) {
2098 if ( (entryp->flags & (AIO_READ | AIO_WRITE)) != 0 ) {
2099 if ( entryp->aiocb.aio_nbytes > INT_MAX ||
2100 entryp->aiocb.aio_buf == USER_ADDR_NULL ||
2101 entryp->aiocb.aio_offset < 0 )
2112 switch ( entryp->aiocb.aio_sigevent.sigev_notify ) {
2118 signum = entryp->aiocb.aio_sigevent.sigev_signo;
2138 proc_fdlock(entryp->procp);
2140 result = fp_lookup( entryp->procp, entryp->aiocb.aio_fildes, &fp , 1);
2152 fp_drop(entryp->procp, entryp->aiocb.aio_fildes, fp , 1);
2158 proc_fdunlock(entryp->procp);
2200 do_aio_completion( aio_workq_entry *entryp )
2207 lio_context = (aio_lio_context *)entryp->group_tag;
2211 aio_proc_lock_spin(entryp->procp);
2224 if ((entryp->flags & AIO_LIO_NOTIFY) && (lastLioCompleted) && (waiter != 0)) {
2229 aio_proc_unlock(entryp->procp);
2232 if ( entryp->aiocb.aio_sigevent.sigev_notify == SIGEV_SIGNAL &&
2233 (entryp->flags & AIO_DISABLE) == 0 ) {
2250 (int)entryp->procp, (int)entryp->uaiocbp,
2251 entryp->aiocb.aio_sigevent.sigev_signo, 0, 0 );
2253 psignal( entryp->procp, entryp->aiocb.aio_sigevent.sigev_signo );
2257 if ((entryp->flags & AIO_EXIT_WAIT) && (entryp->flags & AIO_CLOSE_WAIT)) {
2271 * set for cancellation, while the entryp is still on a proc list; now it's
2274 if ( (entryp->flags & AIO_EXIT_WAIT) != 0 ) {
2278 (int)entryp->procp, (int)entryp->uaiocbp, 0, 0, 0 );
2280 aio_proc_lock_spin(entryp->procp);
2281 active_requests = aio_active_requests_for_process( entryp->procp );
2287 wakeup_one((caddr_t)&entryp->procp->AIO_CLEANUP_SLEEP_CHAN);
2288 aio_proc_unlock(entryp->procp);
2291 (int)entryp->procp, (int)entryp->uaiocbp, 0, 0, 0 );
2293 aio_proc_unlock(entryp->procp);
2297 if ( (entryp->flags & AIO_CLOSE_WAIT) != 0 ) {
2301 (int)entryp->procp, (int)entryp->uaiocbp, 0, 0, 0 );
2303 aio_proc_lock_spin(entryp->procp);
2304 active_requests = aio_proc_active_requests_for_file( entryp->procp, entryp->aiocb.aio_fildes);
2307 wakeup(&entryp->procp->AIO_CLEANUP_SLEEP_CHAN);
2308 aio_proc_unlock(entryp->procp);
2311 (int)entryp->procp, (int)entryp->uaiocbp, 0, 0, 0 );
2313 aio_proc_unlock(entryp->procp);
2323 wakeup( (caddr_t) &entryp->procp->AIO_SUSPEND_SLEEP_CHAN );
2325 (int)entryp->procp, (int)entryp->uaiocbp, 0, 0, 0 );
2342 do_aio_read( aio_workq_entry *entryp )
2348 if ( (error = fp_lookup(entryp->procp, entryp->aiocb.aio_fildes, &fp , 0)) )
2351 fp_drop(entryp->procp, entryp->aiocb.aio_fildes, fp, 0);
2357 * Needs vfs_context_t from vfs_context_create() in entryp!
2359 context.vc_thread = proc_thread(entryp->procp); /* XXX */
2363 entryp->aiocb.aio_buf,
2364 entryp->aiocb.aio_nbytes,
2365 entryp->aiocb.aio_offset, FOF_OFFSET,
2366 &entryp->returnval);
2367 fp_drop(entryp->procp, entryp->aiocb.aio_fildes, fp, 0);
2378 do_aio_write( aio_workq_entry *entryp )
2384 if ( (error = fp_lookup(entryp->procp, entryp->aiocb.aio_fildes, &fp , 0)) )
2387 fp_drop(entryp->procp, entryp->aiocb.aio_fildes, fp, 0);
2398 * Needs vfs_context_t from vfs_context_create() in entryp!
2400 context.vc_thread = proc_thread(entryp->procp); /* XXX */
2406 entryp->aiocb.aio_buf,
2407 entryp->aiocb.aio_nbytes,
2408 entryp->aiocb.aio_offset,
2410 &entryp->returnval);
2412 fp_drop(entryp->procp, entryp->aiocb.aio_fildes, fp, 0);
2437 aio_workq_entry *entryp;
2438 TAILQ_FOREACH(entryp, &procp->p_aio_activeq, aio_proc_link) {
2439 if (entryp->aiocb.aio_fildes == fd) {
2453 do_aio_fsync( aio_workq_entry *entryp )
2475 if (entryp->flags & AIO_FSYNC)
2480 error = fp_getfvp( entryp->procp, entryp->aiocb.aio_fildes, &fp, &vp);
2483 fp_drop(entryp->procp, entryp->aiocb.aio_fildes, fp, 0);
2484 entryp->returnval = -1;
2494 fp_drop(entryp->procp, entryp->aiocb.aio_fildes, fp, 0);
2497 entryp->returnval = -1;
2515 aio_workq_entry *entryp;
2521 TAILQ_FOREACH( entryp, &procp->p_aio_doneq, aio_proc_link ) {
2522 if ( aiocbp == entryp->uaiocbp ) {
2529 TAILQ_FOREACH( entryp, &procp->p_aio_activeq, aio_proc_link ) {
2530 if ( aiocbp == entryp->uaiocbp ) {