Author: hselasky
Date: Fri Feb 16 15:41:16 2018
New Revision: 329376
URL: https://svnweb.freebsd.org/changeset/base/329376

Log:
  Implement tasklet_enable() and tasklet_disable() in the LinuxKPI.
  
  MFC after:    1 week
  Requested by: Johannes Lundberg <johal...@gmail.com>
  Sponsored by: Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/include/linux/interrupt.h
  head/sys/compat/linuxkpi/common/src/linux_tasklet.c

Modified: head/sys/compat/linuxkpi/common/include/linux/interrupt.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/interrupt.h   Fri Feb 16 
15:41:03 2018        (r329375)
+++ head/sys/compat/linuxkpi/common/include/linux/interrupt.h   Fri Feb 16 
15:41:16 2018        (r329376)
@@ -200,5 +200,7 @@ extern void tasklet_schedule(struct tasklet_struct *);
 extern void tasklet_kill(struct tasklet_struct *);
 extern void tasklet_init(struct tasklet_struct *, tasklet_func_t *,
     unsigned long data);
+extern void tasklet_enable(struct tasklet_struct *);
+extern void tasklet_disable(struct tasklet_struct *);
 
 #endif /* _LINUX_INTERRUPT_H_ */

Modified: head/sys/compat/linuxkpi/common/src/linux_tasklet.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_tasklet.c Fri Feb 16 15:41:03 
2018        (r329375)
+++ head/sys/compat/linuxkpi/common/src/linux_tasklet.c Fri Feb 16 15:41:16 
2018        (r329376)
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
 #define        TASKLET_ST_BUSY 1
 #define        TASKLET_ST_EXEC 2
 #define        TASKLET_ST_LOOP 3
+#define        TASKLET_ST_PAUSED 4
 
 #define        TASKLET_ST_CMPSET(ts, old, new) \
        atomic_cmpset_ptr((volatile uintptr_t *)&(ts)->entry.tqe_prev, old, new)
@@ -195,4 +196,22 @@ tasklet_kill(struct tasklet_struct *ts)
        /* wait until tasklet is no longer busy */
        while (TASKLET_ST_GET(ts) != TASKLET_ST_IDLE)
                pause("W", 1);
+}
+
+void
+tasklet_enable(struct tasklet_struct *ts)
+{
+       (void) TASKLET_ST_CMPSET(ts, TASKLET_ST_PAUSED, TASKLET_ST_IDLE);
+}
+
+void
+tasklet_disable(struct tasklet_struct *ts)
+{
+       while (1) {
+               if (TASKLET_ST_GET(ts) == TASKLET_ST_PAUSED) 
+                       break;
+               if (TASKLET_ST_CMPSET(ts, TASKLET_ST_IDLE, TASKLET_ST_PAUSED))
+                       break;
+               pause("W", 1);
+       }
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to