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