mirror of https://gitee.com/openkylin/linux.git
drbd: Add read_requests tree
We do not do collision detection for read requests, but we still need to look up the request objects when we receive a package over the network. Using the same data structure for read and write requests results in simpler code once the tl_hash and app_reads_hash tables are removed. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
de696716e8
commit
dac1389ccc
|
@ -1019,7 +1019,8 @@ struct drbd_conf {
|
||||||
struct hlist_head *tl_hash;
|
struct hlist_head *tl_hash;
|
||||||
unsigned int tl_hash_s;
|
unsigned int tl_hash_s;
|
||||||
|
|
||||||
/* Interval tree of pending local write requests */
|
/* Interval tree of pending local requests */
|
||||||
|
struct rb_root read_requests;
|
||||||
struct rb_root write_requests;
|
struct rb_root write_requests;
|
||||||
|
|
||||||
/* blocks to resync in this run [unit BM_BLOCK_SIZE] */
|
/* blocks to resync in this run [unit BM_BLOCK_SIZE] */
|
||||||
|
|
|
@ -3473,6 +3473,7 @@ struct drbd_conf *drbd_new_device(unsigned int minor)
|
||||||
/* no need to lock access, we are still initializing this minor device. */
|
/* no need to lock access, we are still initializing this minor device. */
|
||||||
if (!tl_init(mdev))
|
if (!tl_init(mdev))
|
||||||
goto out_no_tl;
|
goto out_no_tl;
|
||||||
|
mdev->read_requests = RB_ROOT;
|
||||||
mdev->write_requests = RB_ROOT;
|
mdev->write_requests = RB_ROOT;
|
||||||
|
|
||||||
mdev->app_reads_hash = kzalloc(APP_R_HSIZE*sizeof(void *), GFP_KERNEL);
|
mdev->app_reads_hash = kzalloc(APP_R_HSIZE*sizeof(void *), GFP_KERNEL);
|
||||||
|
|
|
@ -260,10 +260,15 @@ void _req_may_be_done(struct drbd_request *req, struct bio_and_error *m)
|
||||||
|
|
||||||
/* remove the request from the conflict detection
|
/* remove the request from the conflict detection
|
||||||
* respective block_id verification hash */
|
* respective block_id verification hash */
|
||||||
if (!hlist_unhashed(&req->collision)) {
|
if (!drbd_interval_empty(&req->i)) {
|
||||||
|
struct rb_root *root;
|
||||||
|
|
||||||
hlist_del(&req->collision);
|
hlist_del(&req->collision);
|
||||||
if (!drbd_interval_empty(&req->i))
|
if (rw == WRITE)
|
||||||
drbd_remove_interval(&mdev->write_requests, &req->i);
|
root = &mdev->write_requests;
|
||||||
|
else
|
||||||
|
root = &mdev->read_requests;
|
||||||
|
drbd_remove_interval(root, &req->i);
|
||||||
} else
|
} else
|
||||||
D_ASSERT((s & (RQ_NET_MASK & ~RQ_NET_DONE)) == 0);
|
D_ASSERT((s & (RQ_NET_MASK & ~RQ_NET_DONE)) == 0);
|
||||||
|
|
||||||
|
@ -332,6 +337,7 @@ static int _req_conflicts(struct drbd_request *req)
|
||||||
struct hlist_head *slot;
|
struct hlist_head *slot;
|
||||||
|
|
||||||
D_ASSERT(hlist_unhashed(&req->collision));
|
D_ASSERT(hlist_unhashed(&req->collision));
|
||||||
|
D_ASSERT(drbd_interval_empty(&req->i));
|
||||||
|
|
||||||
if (!get_net_conf(mdev))
|
if (!get_net_conf(mdev))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -493,6 +499,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
|
||||||
/* so we can verify the handle in the answer packet
|
/* so we can verify the handle in the answer packet
|
||||||
* corresponding hlist_del is in _req_may_be_done() */
|
* corresponding hlist_del is in _req_may_be_done() */
|
||||||
hlist_add_head(&req->collision, ar_hash_slot(mdev, req->i.sector));
|
hlist_add_head(&req->collision, ar_hash_slot(mdev, req->i.sector));
|
||||||
|
drbd_insert_interval(&mdev->read_requests, &req->i);
|
||||||
|
|
||||||
set_bit(UNPLUG_REMOTE, &mdev->flags);
|
set_bit(UNPLUG_REMOTE, &mdev->flags);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue