]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/md/bcache/io.c
Merge branch 'for-4.8/core' of git://git.kernel.dk/linux-block
[karo-tx-linux.git] / drivers / md / bcache / io.c
1 /*
2  * Some low level IO code, and hacks for various block layer limitations
3  *
4  * Copyright 2010, 2011 Kent Overstreet <kent.overstreet@gmail.com>
5  * Copyright 2012 Google, Inc.
6  */
7
8 #include "bcache.h"
9 #include "bset.h"
10 #include "debug.h"
11
12 #include <linux/blkdev.h>
13
14 /* Bios with headers */
15
16 void bch_bbio_free(struct bio *bio, struct cache_set *c)
17 {
18         struct bbio *b = container_of(bio, struct bbio, bio);
19         mempool_free(b, c->bio_meta);
20 }
21
22 struct bio *bch_bbio_alloc(struct cache_set *c)
23 {
24         struct bbio *b = mempool_alloc(c->bio_meta, GFP_NOIO);
25         struct bio *bio = &b->bio;
26
27         bio_init(bio);
28         bio->bi_flags           |= BIO_POOL_NONE << BIO_POOL_OFFSET;
29         bio->bi_max_vecs         = bucket_pages(c);
30         bio->bi_io_vec           = bio->bi_inline_vecs;
31
32         return bio;
33 }
34
35 void __bch_submit_bbio(struct bio *bio, struct cache_set *c)
36 {
37         struct bbio *b = container_of(bio, struct bbio, bio);
38
39         bio->bi_iter.bi_sector  = PTR_OFFSET(&b->key, 0);
40         bio->bi_bdev            = PTR_CACHE(c, &b->key, 0)->bdev;
41
42         b->submit_time_us = local_clock_us();
43         closure_bio_submit(bio, bio->bi_private);
44 }
45
46 void bch_submit_bbio(struct bio *bio, struct cache_set *c,
47                      struct bkey *k, unsigned ptr)
48 {
49         struct bbio *b = container_of(bio, struct bbio, bio);
50         bch_bkey_copy_single_ptr(&b->key, k, ptr);
51         __bch_submit_bbio(bio, c);
52 }
53
54 /* IO errors */
55
56 void bch_count_io_errors(struct cache *ca, int error, const char *m)
57 {
58         /*
59          * The halflife of an error is:
60          * log2(1/2)/log2(127/128) * refresh ~= 88 * refresh
61          */
62
63         if (ca->set->error_decay) {
64                 unsigned count = atomic_inc_return(&ca->io_count);
65
66                 while (count > ca->set->error_decay) {
67                         unsigned errors;
68                         unsigned old = count;
69                         unsigned new = count - ca->set->error_decay;
70
71                         /*
72                          * First we subtract refresh from count; each time we
73                          * succesfully do so, we rescale the errors once:
74                          */
75
76                         count = atomic_cmpxchg(&ca->io_count, old, new);
77
78                         if (count == old) {
79                                 count = new;
80
81                                 errors = atomic_read(&ca->io_errors);
82                                 do {
83                                         old = errors;
84                                         new = ((uint64_t) errors * 127) / 128;
85                                         errors = atomic_cmpxchg(&ca->io_errors,
86                                                                 old, new);
87                                 } while (old != errors);
88                         }
89                 }
90         }
91
92         if (error) {
93                 char buf[BDEVNAME_SIZE];
94                 unsigned errors = atomic_add_return(1 << IO_ERROR_SHIFT,
95                                                     &ca->io_errors);
96                 errors >>= IO_ERROR_SHIFT;
97
98                 if (errors < ca->set->error_limit)
99                         pr_err("%s: IO error on %s, recovering",
100                                bdevname(ca->bdev, buf), m);
101                 else
102                         bch_cache_set_error(ca->set,
103                                             "%s: too many IO errors %s",
104                                             bdevname(ca->bdev, buf), m);
105         }
106 }
107
108 void bch_bbio_count_io_errors(struct cache_set *c, struct bio *bio,
109                               int error, const char *m)
110 {
111         struct bbio *b = container_of(bio, struct bbio, bio);
112         struct cache *ca = PTR_CACHE(c, &b->key, 0);
113
114         unsigned threshold = op_is_write(bio_op(bio))
115                 ? c->congested_write_threshold_us
116                 : c->congested_read_threshold_us;
117
118         if (threshold) {
119                 unsigned t = local_clock_us();
120
121                 int us = t - b->submit_time_us;
122                 int congested = atomic_read(&c->congested);
123
124                 if (us > (int) threshold) {
125                         int ms = us / 1024;
126                         c->congested_last_us = t;
127
128                         ms = min(ms, CONGESTED_MAX + congested);
129                         atomic_sub(ms, &c->congested);
130                 } else if (congested < 0)
131                         atomic_inc(&c->congested);
132         }
133
134         bch_count_io_errors(ca, error, m);
135 }
136
137 void bch_bbio_endio(struct cache_set *c, struct bio *bio,
138                     int error, const char *m)
139 {
140         struct closure *cl = bio->bi_private;
141
142         bch_bbio_count_io_errors(c, bio, error, m);
143         bio_put(bio);
144         closure_put(cl);
145 }