[PATCH 2/4] cobalt/kernel: drop support for preemptible context switching

Philippe Gerum rpm at xenomai.org
Sat Dec 5 13:00:12 CET 2020


From: Philippe Gerum <rpm at xenomai.org>

We have no architecture enabling this feature anymore.

Signed-off-by: Philippe Gerum <rpm at xenomai.org>
---
 include/cobalt/kernel/sched.h       | 34 ---------------
 include/cobalt/kernel/thread.h      |  2 +-
 include/cobalt/uapi/kernel/thread.h |  1 -
 kernel/cobalt/sched.c               | 66 ++---------------------------
 kernel/cobalt/thread.c              | 23 +---------
 5 files changed, 5 insertions(+), 121 deletions(-)

diff --git a/include/cobalt/kernel/sched.h b/include/cobalt/kernel/sched.h
index 1f5714fe0..5d278838f 100644
--- a/include/cobalt/kernel/sched.h
+++ b/include/cobalt/kernel/sched.h
@@ -94,9 +94,6 @@ struct xnsched {
 	struct xntimer rrbtimer;
 	/*!< Root thread control block. */
 	struct xnthread rootcb;
-#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH
-	struct xnthread *last;
-#endif
 #ifdef CONFIG_XENO_ARCH_FPU
 	/*!< Thread owning the current FPU context. */
 	struct xnthread *fpuholder;
@@ -351,37 +348,6 @@ static inline int xnsched_primary_p(void)
 	return !xnsched_unblockable_p();
 }
 
-#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH
-
-struct xnsched *xnsched_finish_unlocked_switch(struct xnsched *sched);
-
-#define xnsched_resched_after_unlocked_switch() xnsched_run()
-
-static inline
-int xnsched_maybe_resched_after_unlocked_switch(struct xnsched *sched)
-{
-	return sched->status & XNRESCHED;
-}
-
-#else /* !CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH */
-
-static inline struct xnsched *
-xnsched_finish_unlocked_switch(struct xnsched *sched)
-{
-	XENO_BUG_ON(COBALT, !hard_irqs_disabled());
-	return xnsched_current();
-}
-
-static inline void xnsched_resched_after_unlocked_switch(void) { }
-
-static inline int
-xnsched_maybe_resched_after_unlocked_switch(struct xnsched *sched)
-{
-	return 0;
-}
-
-#endif /* !CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH */
-
 bool xnsched_set_effective_priority(struct xnthread *thread,
 				    int prio);
 
diff --git a/include/cobalt/kernel/thread.h b/include/cobalt/kernel/thread.h
index 03adb2529..21a8603b4 100644
--- a/include/cobalt/kernel/thread.h
+++ b/include/cobalt/kernel/thread.h
@@ -38,7 +38,7 @@
  * @addtogroup cobalt_core_thread
  * @{
  */
-#define XNTHREAD_BLOCK_BITS   (XNSUSP|XNPEND|XNDELAY|XNDORMANT|XNRELAX|XNMIGRATE|XNHELD|XNDBGSTOP)
+#define XNTHREAD_BLOCK_BITS   (XNSUSP|XNPEND|XNDELAY|XNDORMANT|XNRELAX|XNHELD|XNDBGSTOP)
 #define XNTHREAD_MODE_BITS    (XNRRB|XNWARN|XNTRAPLB)
 
 struct xnthread;
diff --git a/include/cobalt/uapi/kernel/thread.h b/include/cobalt/uapi/kernel/thread.h
index 0802a16dc..664def08e 100644
--- a/include/cobalt/uapi/kernel/thread.h
+++ b/include/cobalt/uapi/kernel/thread.h
@@ -37,7 +37,6 @@
 #define XNZOMBIE  0x00000020 /**< Zombie thread in deletion process */
 #define XNMAPPED  0x00000040 /**< Thread is mapped to a linux task */
 #define XNRELAX   0x00000080 /**< Relaxed shadow thread (blocking bit) */
-#define XNMIGRATE 0x00000100 /**< Thread is currently migrating to another CPU. */
 #define XNHELD    0x00000200 /**< Thread is held to process emergency. */
 #define XNBOOST   0x00000400 /**< PI/PP boost undergoing */
 #define XNSSTEP   0x00000800 /**< Single-stepped by debugger */
diff --git a/kernel/cobalt/sched.c b/kernel/cobalt/sched.c
index 75adbc49e..7ff8a6c82 100644
--- a/kernel/cobalt/sched.c
+++ b/kernel/cobalt/sched.c
@@ -345,34 +345,6 @@ struct xnthread *xnsched_pick_next(struct xnsched *sched)
 #endif /* CONFIG_XENO_OPT_SCHED_CLASSES */
 }
 
-#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH
-
-struct xnsched *xnsched_finish_unlocked_switch(struct xnsched *sched)
-{
-	struct xnthread *last;
-	spl_t s;
-
-	xnlock_get_irqsave(&nklock, s);
-
-#ifdef CONFIG_SMP
-	/* If current thread migrated while suspended */
-	sched = xnsched_current();
-#endif /* CONFIG_SMP */
-
-	last = sched->last;
-	sched->status &= ~XNINSW;
-
-	/* Detect a thread which has migrated. */
-	if (last->sched != sched) {
-		xnsched_putback(last);
-		xnthread_clear_state(last, XNMIGRATE);
-	}
-
-	return sched;
-}
-
-#endif /* CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH */
-
 void xnsched_lock(void)
 {
 	struct xnsched *sched = xnsched_current();
@@ -628,17 +600,8 @@ void xnsched_migrate(struct xnthread *thread, struct xnsched *sched)
 {
 	xnsched_set_resched(thread->sched);
 	migrate_thread(thread, sched);
-
-#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH
-	/*
-	 * Mark the thread in flight, xnsched_finish_unlocked_switch()
-	 * will put the thread on the remote runqueue.
-	 */
-	xnthread_set_state(thread, XNMIGRATE);
-#else
 	/* Move thread to the remote run queue. */
 	xnsched_putback(thread);
-#endif
 }
 
 /*
@@ -840,18 +803,6 @@ struct xnthread *xnsched_rt_pick(struct xnsched *sched)
 
 #endif /* !CONFIG_XENO_OPT_SCALABLE_SCHED */
 
-static inline void switch_context(struct xnsched *sched,
-				  struct xnthread *prev, struct xnthread *next)
-{
-#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH
-	sched->last = prev;
-	sched->status |= XNINSW;
-	xnlock_clear_irqon(&nklock);
-#endif
-
-	xnarch_switch_to(prev, next);
-}
-
 /**
  * @fn int xnsched_run(void)
  * @brief The rescheduling procedure.
@@ -920,15 +871,9 @@ static inline int test_resched(struct xnsched *sched)
 
 static inline void enter_root(struct xnthread *root)
 {
-	struct xnarchtcb *rootcb __maybe_unused = xnthread_archtcb(root);
-
 #ifdef CONFIG_XENO_OPT_WATCHDOG
 	xntimer_stop(&root->sched->wdtimer);
 #endif
-#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH
-	if (rootcb->core.mm == NULL)
-		set_ti_thread_flag(rootcb->core.tip, TIF_MMSWITCH_INT);
-#endif
 }
 
 static inline void leave_root(struct xnthread *root)
@@ -984,7 +929,7 @@ int ___xnsched_run(struct xnsched *sched)
 	 * "current" for disambiguating.
 	 */
 	xntrace_pid(task_pid_nr(current), xnthread_current_priority(curr));
-reschedule:
+
 	if (xnthread_test_state(curr, XNUSER))
 		do_lazy_user_work(curr);
 
@@ -1030,8 +975,7 @@ reschedule:
 
 	xnstat_exectime_switch(sched, &next->stat.account);
 	xnstat_counter_inc(&next->stat.csw);
-
-	switch_context(sched, prev, next);
+	xnarch_switch_to(prev, next);
 
 	/*
 	 * Test whether we transitioned from primary mode to secondary
@@ -1043,7 +987,7 @@ reschedule:
 		goto shadow_epilogue;
 
 	switched = 1;
-	sched = xnsched_finish_unlocked_switch(sched);
+	sched = xnsched_current();
 	/*
 	 * Re-read the currently running thread, this is needed
 	 * because of relaxed/hardened transitions.
@@ -1052,10 +996,6 @@ reschedule:
 	xnthread_switch_fpu(sched);
 	xntrace_pid(task_pid_nr(current), xnthread_current_priority(curr));
 out:
-	if (switched &&
-	    xnsched_maybe_resched_after_unlocked_switch(sched))
-		goto reschedule;
-
 	xnlock_put_irqrestore(&nklock, s);
 
 	return switched;
diff --git a/kernel/cobalt/thread.c b/kernel/cobalt/thread.c
index 5260fb1e7..49f749f1c 100644
--- a/kernel/cobalt/thread.c
+++ b/kernel/cobalt/thread.c
@@ -406,22 +406,6 @@ void xnthread_prepare_wait(struct xnthread_wait_context *wc)
 }
 EXPORT_SYMBOL_GPL(xnthread_prepare_wait);
 
-static inline int moving_target(struct xnsched *sched, struct xnthread *thread)
-{
-	int ret = 0;
-#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH
-	/*
-	 * When deleting a thread in the course of a context switch or
-	 * in flight to another CPU with nklock unlocked on a distant
-	 * CPU, do nothing, this case will be caught in
-	 * xnsched_finish_unlocked_switch.
-	 */
-	ret = (sched->status & XNINSW) ||
-		xnthread_test_state(thread, XNMIGRATE);
-#endif
-	return ret;
-}
-
 #ifdef CONFIG_XENO_ARCH_FPU
 
 static inline void giveup_fpu(struct xnsched *sched,
@@ -494,10 +478,6 @@ static inline void cleanup_tcb(struct xnthread *curr) /* nklock held, irqs off *
 	release_all_ownerships(curr);
 
 	giveup_fpu(sched, curr);
-
-	if (moving_target(sched, curr))
-		return;
-
 	xnsched_forget(curr);
 	xnthread_deregister(curr);
 }
@@ -1954,11 +1934,10 @@ int xnthread_harden(void)
 	}
 
 	/* "current" is now running into the Xenomai domain. */
-	sched = xnsched_finish_unlocked_switch(thread->sched);
+	sched = xnsched_current();
 	xnthread_switch_fpu(sched);
 
 	xnlock_clear_irqon(&nklock);
-	xnsched_resched_after_unlocked_switch();
 	xnthread_test_cancel();
 
 	trace_cobalt_shadow_hardened(thread);
-- 
2.26.2




More information about the Xenomai mailing list