reader: Call schedule() between successful reads
authorReto Buerki <reet@codelabs.ch>
Fri, 22 May 2015 13:07:23 +0000 (15:07 +0200)
committerReto Buerki <reet@codelabs.ch>
Thu, 11 Jun 2015 07:11:37 +0000 (09:11 +0200)
Allow the kernel to schedule different threads more often. Without this
explicit schedule() call, other networking subsystems might be unable to
handle the workload injected by the reader work function (i.e. the UDP
receive queue drops packets when it is full).

reader.c

index 3255622..58bb6b5 100644 (file)
--- a/reader.c
+++ b/reader.c
@@ -83,7 +83,8 @@ static int get_skb(struct sk_buff **skb, struct dev_info *dev_info)
  * This work queue function will query the memory region for new data.
  *
  * As long as data is available, it will be read and injected into the
- * networking code.
+ * networking code. Between successive reads, re-schedule to give the kernel
+ * the possibility to run other tasks.
  *
  * If no data is available, the reader work will be re-scheduled with a timeout
  * as specified by the #dev_info::poll_interval value.
@@ -187,6 +188,9 @@ static void muennet_reader_work(struct work_struct *work)
 
                        /* now mark the skb as processed */
                        skb = NULL;
+
+                       /* allow the kernel to run other tasks */
+                       schedule();
                        break;
 
                default: