mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 22:51:42 +00:00
drbd: Control the actual resync rate based on the queuing delay of data packets
In a setup with a high bandwidth and high latency network, eventually involving deep queues in routers, it is beneficial to only fill those queues up to an limited extend with resync data. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
bd26bfc5b4
commit
cdd67a7460
@ -414,6 +414,18 @@ void resync_timer_fn(unsigned long data)
|
||||
drbd_queue_work(&mdev->data.work, &mdev->resync_work);
|
||||
}
|
||||
|
||||
static int calc_resync_rate(struct drbd_conf *mdev)
|
||||
{
|
||||
int d = mdev->data_delay / 1000; /* us -> ms */
|
||||
int td = mdev->sync_conf.throttle_th * 100; /* 0.1s -> ms */
|
||||
int hd = mdev->sync_conf.hold_off_th * 100; /* 0.1s -> ms */
|
||||
int cr = mdev->sync_conf.rate;
|
||||
|
||||
return d <= td ? cr :
|
||||
d >= hd ? 0 :
|
||||
cr + (cr * (td - d) / (hd - td));
|
||||
}
|
||||
|
||||
int w_make_resync_request(struct drbd_conf *mdev,
|
||||
struct drbd_work *w, int cancel)
|
||||
{
|
||||
@ -446,7 +458,8 @@ int w_make_resync_request(struct drbd_conf *mdev,
|
||||
return 1;
|
||||
}
|
||||
|
||||
number = SLEEP_TIME * mdev->sync_conf.rate / ((BM_BLOCK_SIZE/1024)*HZ);
|
||||
mdev->c_sync_rate = calc_resync_rate(mdev);
|
||||
number = SLEEP_TIME * mdev->c_sync_rate / ((BM_BLOCK_SIZE / 1024) * HZ);
|
||||
pe = atomic_read(&mdev->rs_pending_cnt);
|
||||
|
||||
mutex_lock(&mdev->data.mutex);
|
||||
|
Loading…
Reference in New Issue
Block a user