The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh7-3.10.0-123.1.2.vz7.4.9 ------> commit c249e3f666674d4d4ff315d9119fe25371f1384d Author: Dmitry Monakhov <dmonak...@openvz.org> Date: Tue May 5 13:44:37 2015 +0400
vziolimit: port diff-iolimit-wakup-at-kill-and-limit-change iolimit: wakeable and killable iolimit wait * Make iolimit wait killable. * Wakeup all tasks after iolimit speed change. https://jira.sw.ru/browse/PCLIN-28566 Signed-off-by: Konstantin Khlebnikov <khlebni...@openvz.org> ==================================== https://jira.sw.ru/browse/PSBM-20104 Signed-off-by: Dmitry Monakhov <dmonak...@openvz.org> --- kernel/ve/vziolimit.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/kernel/ve/vziolimit.c b/kernel/ve/vziolimit.c index 72b8d51..af16182 100644 --- a/kernel/ve/vziolimit.c +++ b/kernel/ve/vziolimit.c @@ -87,8 +87,25 @@ static unsigned long throttle_timeout(struct throttle *th, unsigned long now) struct iolimit { struct throttle throttle; + wait_queue_head_t wq; }; +static void iolimit_wait(struct iolimit *iolimit, unsigned long timeout) +{ + DEFINE_WAIT(wait); + + do { + prepare_to_wait(&iolimit->wq, &wait, TASK_KILLABLE); + timeout = schedule_timeout(timeout); + if (fatal_signal_pending(current)) + break; + if (unlikely(timeout)) + timeout = min(throttle_timeout(&iolimit->throttle, + jiffies), timeout); + } while (timeout); + finish_wait(&iolimit->wq, &wait); +} + static int iolimit_virtinfo(struct vnotifier_block *nb, unsigned long cmd, void *arg, int old_ret) { @@ -113,10 +130,8 @@ static int iolimit_virtinfo(struct vnotifier_block *nb, if (current->flags & PF_FLUSHER) break; timeout = throttle_timeout(&iolimit->throttle, jiffies); - if (timeout) { - __set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(timeout); - } + if (timeout && !fatal_signal_pending(current)) + iolimit_wait(iolimit, timeout); break; case VIRTINFO_IO_READAHEAD: case VIRTINFO_IO_CONGESTION: @@ -159,6 +174,7 @@ static int iolimit_ioctl(struct file *file, unsigned int cmd, unsigned long arg) err = -ENOMEM; if (!new_iolimit) break; + init_waitqueue_head(&new_iolimit->wq); } spin_lock_irq(&ub->ub_lock); @@ -177,6 +193,8 @@ static int iolimit_ioctl(struct file *file, unsigned int cmd, unsigned long arg) spin_unlock_irq(&ub->ub_lock); + wake_up_all(&iolimit->wq); + err = 0; break; case VZCTL_GET_IOLIMIT: _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel