[syslinux:lwip] pxe: Cleanup interrupt handling making it reliabe and in spec

syslinux-bot for Eric W. Biederman ebiederm at xmission.com
Fri Apr 22 20:06:13 PDT 2011


Commit-ID:  6a54b8029280339e6b54c8c0f2780c74713cdffb
Gitweb:     http://syslinux.zytor.com/commit/6a54b8029280339e6b54c8c0f2780c74713cdffb
Author:     Eric W. Biederman <ebiederm at xmission.com>
AuthorDate: Tue, 12 Apr 2011 04:38:21 -0700
Committer:  Eric W. Biederman <ebiederm at xmission.com>
CommitDate: Tue, 12 Apr 2011 14:41:24 -0700

pxe: Cleanup interrupt handling making it reliabe and in spec

- Rework pm_return into pxe_poll_wakeups and use the new
  sched_hook_funk to call it from schedule.  That is a
  little extra work but it is always correct to do.

- Unconditionally call schedule from the pm_core_hook.
  schedule now does everything pm_return used to do
  if perhaps in a more braindead way so this is correct
  and safe.

- Declare undiif_input in pxe.h

- Stop exporting pxe_poll.  Having it exported helped
  me track down what was going on but it was the wrong
  way to do things and exporting it is no longer needed.

- Rename pxe_poll pxe_process_irq for clarity.

Signed-off-by: Eric W. Biederman <ebiederm at xmission.com>


---
 core/fs/pxe/isr.c |   27 +++++++++------------------
 core/fs/pxe/pxe.h |    2 +-
 2 files changed, 10 insertions(+), 19 deletions(-)

diff --git a/core/fs/pxe/isr.c b/core/fs/pxe/isr.c
index 4dcadc1..cb2300e 100644
--- a/core/fs/pxe/isr.c
+++ b/core/fs/pxe/isr.c
@@ -53,34 +53,23 @@ bool uninstall_irq_vector(uint8_t irq, void (*isr), far_ptr_t *old)
     return true;
 }
 
-static void pm_return(void)
+static void pxe_poll_wakeups(void)
 {
     static jiffies_t last_jiffies = 0;
     jiffies_t now = jiffies();
-    
-    __schedule_lock++;
 
     if (now != last_jiffies) {
 	last_jiffies = now;
 	__thread_process_timeouts();
-	__need_schedule = true; /* Switch threads if more than one runnable */
     }
-
+   
     if (pxe_irq_pending) {
 	pxe_irq_pending = 0;
-	if (pxe_receive_thread_sem.count <= 0)
-	  sem_up(&pxe_receive_thread_sem);
+	sem_up(&pxe_receive_thread_sem);
     }
-
-    __schedule_lock--;
-
-    if (__need_schedule)
-	__schedule();
 }
 
-void undiif_input(t_PXENV_UNDI_ISR *);
-
-void pxe_poll(void)
+static void pxe_process_irq(void)
 {
     static __lowmem t_PXENV_UNDI_ISR isr;
 
@@ -104,7 +93,7 @@ void pxe_poll(void)
     	break;
     
         case PXENV_UNDI_ISR_OUT_RECEIVE:
-    	undiif_input(&isr);
+	undiif_input(&isr);
     	break;
     	
         case PXENV_UNDI_ISR_OUT_BUSY:
@@ -126,13 +115,14 @@ static void pxe_receive_thread(void *dummy)
 
     for (;;) {
 	sem_down(&pxe_receive_thread_sem, 0);
-	pxe_poll();
+	pxe_process_irq();
     }
 }
 
 void pxe_init_isr(void)
 {
     start_idle_thread();
+    sched_hook_func = pxe_poll_wakeups;
     /*
      * Run the pxe receive thread at elevated priority, since the UNDI
      * stack is likely to have very limited memory available; therefore to
@@ -140,7 +130,7 @@ void pxe_init_isr(void)
      * manage, as soon as possible.
      */
     pxe_thread = start_thread("pxe receive", 16384, -20, pxe_receive_thread, NULL);
-    core_pm_hook = pm_return;
+    core_pm_hook = __schedule;
 }
 
 
@@ -149,6 +139,7 @@ void pxe_cleanup_isr(void)
     static __lowmem struct s_PXENV_UNDI_CLOSE undi_close;
     int err;
 
+    sched_hook_func = NULL;
     core_pm_hook = core_pm_null_hook;
     kill_thread(pxe_thread);
  
diff --git a/core/fs/pxe/pxe.h b/core/fs/pxe/pxe.h
index 9236b10..d30e783 100644
--- a/core/fs/pxe/pxe.h
+++ b/core/fs/pxe/pxe.h
@@ -244,7 +244,6 @@ extern far_ptr_t pxe_irq_chain;
 /* isr.c */
 void pxe_init_isr(void);
 void pxe_cleanup_isr(void);
-void pxe_poll(void);
 bool install_irq_vector(uint8_t irq, void (*isr)(void), far_ptr_t *old);
 bool uninstall_irq_vector(uint8_t irq, void (*isr), far_ptr_t *old);
 
@@ -257,6 +256,7 @@ int pxe_getc(struct inode *inode);
 
 /* undiif.c */
 int undiif_start(uint32_t ip, uint32_t netmask, uint32_t gw);
+void undiif_input(t_PXENV_UNDI_ISR *isr);
 
 /* dhcp_options.c */
 void parse_dhcp(int);



More information about the Syslinux-commits mailing list