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);