#include <linux/udp.h>
 #include <linux/err.h>
 #include <linux/kthread.h>
+#include <linux/wait.h>
 
 #include <net/ip.h>
 #include <net/sock.h>
                   ip_vs_backup_mcast_ifn, ip_vs_backup_syncid);
 
        while (!kthread_should_stop()) {
+               wait_event_interruptible(*tinfo->sock->sk->sk_sleep,
+                        !skb_queue_empty(&tinfo->sock->sk->sk_receive_queue)
+                        || kthread_should_stop());
+
                /* do we have data now? */
                while (!skb_queue_empty(&(tinfo->sock->sk->sk_receive_queue))) {
                        len = ip_vs_receive(tinfo->sock, tinfo->buf,
                        ip_vs_process_message(tinfo->buf, len);
                        local_bh_enable();
                }
-
-               msleep_interruptible(1000);
        }
 
        /* release the sending multicast socket */