svn commit: r329376 - in head/sys/compat/linuxkpi/common: include/linux src

Hans Petter Selasky hselasky at FreeBSD.org
Fri Feb 16 15:41:17 UTC 2018


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 <johalun0 at 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);
+	}
 }


More information about the svn-src-head mailing list