diff options
| -rw-r--r-- | fs/aio.c | 77 |
1 files changed, 73 insertions, 4 deletions
| @@ -141,6 +141,7 @@ struct kioctx { | |||
| 141 | 141 | ||
| 142 | struct { | 142 | struct { |
| 143 | unsigned tail; | 143 | unsigned tail; |
| 144 | unsigned completed_events; | ||
| 144 | spinlock_t completion_lock; | 145 | spinlock_t completion_lock; |
| 145 | } ____cacheline_aligned_in_smp; | 146 | } ____cacheline_aligned_in_smp; |
| 146 | 147 | ||
| @@ -857,6 +858,68 @@ out: | |||
| 857 | return ret; | 858 | return ret; |
| 858 | } | 859 | } |
| 859 | 860 | ||
| 861 | /* refill_reqs_available | ||
| 862 | * Updates the reqs_available reference counts used for tracking the | ||
| 863 | * number of free slots in the completion ring. This can be called | ||
| 864 | * from aio_complete() (to optimistically update reqs_available) or | ||
| 865 | * from aio_get_req() (the we're out of events case). It must be | ||
| 866 | * called holding ctx->completion_lock. | ||
| 867 | */ | ||
| 868 | static void refill_reqs_available(struct kioctx *ctx, unsigned head, | ||
| 869 | unsigned tail) | ||
| 870 | { | ||
| 871 | unsigned events_in_ring, completed; | ||
| 872 | |||
| 873 | /* Clamp head since userland can write to it. */ | ||
| 874 | head %= ctx->nr_events; | ||
| 875 | if (head <= tail) | ||
| 876 | events_in_ring = tail - head; | ||
| 877 | else | ||
| 878 | events_in_ring = ctx->nr_events - (head - tail); | ||
| 879 | |||
| 880 | completed = ctx->completed_events; | ||
| 881 | if (events_in_ring < completed) | ||
| 882 | completed -= events_in_ring; | ||
| 883 | else | ||
| 884 | completed = 0; | ||
| 885 | |||
| 886 | if (!completed) | ||
| 887 | return; | ||
| 888 | |||
| 889 | ctx->completed_events -= completed; | ||
| 890 | put_reqs_available(ctx, completed); | ||
| 891 | } | ||
| 892 | |||
| 893 | /* user_refill_reqs_available | ||
| 894 | * Called to refill reqs_available when aio_get_req() encounters an | ||
| 895 | * out of space in the completion ring. | ||
| 896 | */ | ||
| 897 | static void user_refill_reqs_available(struct kioctx *ctx) | ||
| 898 | { | ||
| 899 | spin_lock_irq(&ctx->completion_lock); | ||
| 900 | if (ctx->completed_events) { | ||
| 901 | struct aio_ring *ring; | ||
| 902 | unsigned head; | ||
| 903 | |||
| 904 | /* Access of ring->head may race with aio_read_events_ring() | ||
| 905 | * here, but that's okay since whether we read the old version | ||
| 906 | * or the new version, and either will be valid. The important | ||
| 907 | * part is that head cannot pass tail since we prevent | ||
| 908 | * aio_complete() from updating tail by holding | ||
| 909 | * ctx->completion_lock. Even if head is invalid, the check | ||
| 910 | * against ctx->completed_events below will make sure we do the | ||
| 911 | * safe/right thing. | ||
| 912 | */ | ||
| 913 | ring = kmap_atomic(ctx->ring_pages[0]); | ||
| 914 | head = ring->head; | ||
| 915 | kunmap_atomic(ring); | ||
| 916 | |||
| 917 | refill_reqs_available(ctx, head, ctx->tail); | ||
| 918 | } | ||
| 919 | |||
| 920 | spin_unlock_irq(&ctx->completion_lock); | ||
| 921 | } | ||
| 922 | |||
| 860 | /* aio_get_req | 923 | /* aio_get_req |
| 861 | * Allocate a slot for an aio request. | 924 | * Allocate a slot for an aio request. |
| 862 | * Returns NULL if no requests are free. | 925 | * Returns NULL if no requests are free. |
| @@ -865,8 +928,11 @@ static inline struct kiocb *aio_get_req(struct kioctx *ctx) | |||
| 865 | { | 928 | { |
| 866 | struct kiocb *req; | 929 | struct kiocb *req; |
| 867 | 930 | ||
| 868 | if (!get_reqs_available(ctx)) | 931 | if (!get_reqs_available(ctx)) { |
| 869 | return NULL; | 932 | user_refill_reqs_available(ctx); |
| 933 | if (!get_reqs_available(ctx)) | ||
| 934 | return NULL; | ||
| 935 | } | ||
| 870 | 936 | ||
| 871 | req = kmem_cache_alloc(kiocb_cachep, GFP_KERNEL|__GFP_ZERO); | 937 | req = kmem_cache_alloc(kiocb_cachep, GFP_KERNEL|__GFP_ZERO); |
| 872 | if (unlikely(!req)) | 938 | if (unlikely(!req)) |
| @@ -925,8 +991,8 @@ void aio_complete(struct kiocb *iocb, long res, long res2) | |||
| 925 | struct kioctx *ctx = iocb->ki_ctx; | 991 | struct kioctx *ctx = iocb->ki_ctx; |
| 926 | struct aio_ring *ring; | 992 | struct aio_ring *ring; |
| 927 | struct io_event *ev_page, *event; | 993 | struct io_event *ev_page, *event; |
| 994 | unsigned tail, pos, head; | ||
| 928 | unsigned long flags; | 995 | unsigned long flags; |
| 929 | unsigned tail, pos; | ||
| 930 | 996 | ||
| 931 | /* | 997 | /* |
| 932 | * Special case handling for sync iocbs: | 998 | * Special case handling for sync iocbs: |
| @@ -987,10 +1053,14 @@ void aio_complete(struct kiocb *iocb, long res, long res2) | |||
| 987 | ctx->tail = tail; | 1053 | ctx->tail = tail; |
| 988 | 1054 | ||
| 989 | ring = kmap_atomic(ctx->ring_pages[0]); | 1055 | ring = kmap_atomic(ctx->ring_pages[0]); |
| 1056 | head = ring->head; | ||
| 990 | ring->tail = tail; | 1057 | ring->tail = tail; |
| 991 | kunmap_atomic(ring); | 1058 | kunmap_atomic(ring); |
| 992 | flush_dcache_page(ctx->ring_pages[0]); | 1059 | flush_dcache_page(ctx->ring_pages[0]); |
| 993 | 1060 | ||
| 1061 | ctx->completed_events++; | ||
| 1062 | if (ctx->completed_events > 1) | ||
| 1063 | refill_reqs_available(ctx, head, tail); | ||
| 994 | spin_unlock_irqrestore(&ctx->completion_lock, flags); | 1064 | spin_unlock_irqrestore(&ctx->completion_lock, flags); |
| 995 | 1065 | ||
| 996 | pr_debug("added to ring %p at [%u]\n", iocb, tail); | 1066 | pr_debug("added to ring %p at [%u]\n", iocb, tail); |
| @@ -1005,7 +1075,6 @@ void aio_complete(struct kiocb *iocb, long res, long res2) | |||
| 1005 | 1075 | ||
| 1006 | /* everything turned out well, dispose of the aiocb. */ | 1076 | /* everything turned out well, dispose of the aiocb. */ |
| 1007 | kiocb_free(iocb); | 1077 | kiocb_free(iocb); |
| 1008 | put_reqs_available(ctx, 1); | ||
| 1009 | 1078 | ||
| 1010 | /* | 1079 | /* |
| 1011 | * We have to order our ring_info tail store above and test | 1080 | * We have to order our ring_info tail store above and test |
