u8 version_minor;
 
        struct task_struct *task;
+       wait_queue_head_t wq;
 
        int type;
        u32 size;
 static void gb_loopback_reset_stats(struct gb_loopback *gb);
 static void gb_loopback_check_attr(struct gb_loopback *gb)
 {
+       if (gb->ms_wait > GB_LOOPBACK_MS_WAIT_MAX)
+               gb->ms_wait = GB_LOOPBACK_MS_WAIT_MAX;
+       if (gb->size > gb->size_max)
+               gb->size = gb->size_max;
+       gb->error = 0;
+       gb->iteration_count = 0;
+       gb_loopback_reset_stats(gb);
+
        switch (gb->type) {
        case GB_LOOPBACK_TYPE_PING:
        case GB_LOOPBACK_TYPE_TRANSFER:
        case GB_LOOPBACK_TYPE_SINK:
+               wake_up(&gb->wq);
                break;
        default:
                gb->type = 0;
                break;
        }
-       if (gb->ms_wait > GB_LOOPBACK_MS_WAIT_MAX)
-               gb->ms_wait = GB_LOOPBACK_MS_WAIT_MAX;
-       if (gb->size > gb->size_max)
-               gb->size = gb->size_max;
-       gb->error = 0;
-       gb->iteration_count = 0;
-       gb_loopback_reset_stats(gb);
 }
 
 /* Time to send and receive one message */
        struct timeval tlat = {0, 0};
        struct gb_loopback *gb = (struct gb_loopback *)data;
 
-       while (!kthread_should_stop()) {
-               if (!gb->type) {
-                       msleep(1000);
-                       continue;
-               }
+       while (1) {
+               if (!gb->type)
+                       wait_event_interruptible(gb->wq, gb->type ||
+                                                kthread_should_stop());
+               if (kthread_should_stop())
+                       break;
                if (gb->iteration_max) {
                        if (gb->iteration_count < gb->iteration_max) {
                                gb->iteration_count++;
                gb->ts = gb->te;
                if (gb->ms_wait)
                        msleep(gb->ms_wait);
-
        }
        return 0;
 }
        gb->size_max -= sizeof(struct gb_loopback_transfer_request);
 
        gb_loopback_reset_stats(gb);
+       init_waitqueue_head(&gb->wq);
        gb->task = kthread_run(gb_loopback_fn, gb, "gb_loopback");
        if (IS_ERR(gb->task)) {
                retval = PTR_ERR(gb->task);