mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH rc5-rt2 3/3] plist: convert the code to new implementation
@ 2005-12-18 18:17 Oleg Nesterov
  2005-12-19 17:13 ` Daniel Walker
  0 siblings, 1 reply; 3+ messages in thread
From: Oleg Nesterov @ 2005-12-18 18:17 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: linux-kernel, Steven Rostedt, Daniel Walker, Inaky Perez-Gonzalez

This patch blindly fixes compilation errors caused by
a previous patch.

 include/linux/rt_lock.h   |    8 ++--
 include/linux/sched.h     |    2 -
 include/linux/init_task.h |    2 -
 kernel/fork.c             |    2 -
 kernel/rt.c               |   78 ++++++++++++++++++++--------------------------
 5 files changed, 42 insertions(+), 50 deletions(-)

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>

--- RT/include/linux/rt_lock.h~3_FIX	2005-12-17 19:59:45.000000000 +0300
+++ RT/include/linux/rt_lock.h	2005-12-18 22:23:40.000000000 +0300
@@ -24,7 +24,7 @@
  */
 struct rt_mutex {
 	raw_spinlock_t		wait_lock;
-	struct plist		wait_list;
+	struct pl_head		wait_list;
 	struct thread_info	*owner;
 # ifdef CONFIG_DEBUG_RT_LOCKING_MODE
 	raw_spinlock_t		debug_slock;
@@ -49,8 +49,8 @@ struct rt_mutex {
  */
 struct rt_mutex_waiter {
 	struct rt_mutex		*lock;
-	struct plist		list;
-	struct plist		pi_list;
+	struct pl_node		list;
+	struct pl_node		pi_list;
 	struct thread_info	*ti;
 #ifdef CONFIG_DEBUG_DEADLOCKS
 	unsigned long eip;
@@ -87,7 +87,7 @@ struct rt_mutex_waiter {
 # define __PLIST_INIT(lockname)
 #else
 # define __PLIST_INIT(lockname) \
-	, .wait_list = PLIST_INIT((lockname).wait_list, 140 /*MAX_PRIO*/)
+	, .wait_list = PL_HEAD_INIT((lockname).wait_list)
 #endif
 
 #define __RT_MUTEX_INITIALIZER(lockname) \
--- RT/include/linux/sched.h~3_FIX	2005-12-17 19:59:45.000000000 +0300
+++ RT/include/linux/sched.h	2005-12-18 00:21:43.000000000 +0300
@@ -1026,7 +1026,7 @@ struct task_struct {
 #endif
 	/* realtime bits */
 	struct list_head delayed_put;
-	struct plist pi_waiters;
+	struct pl_head pi_waiters;
 
 	/* RT deadlock detection and priority inheritance handling */
 	struct rt_mutex_waiter *blocked_on;
--- RT/include/linux/init_task.h~3_FIX	2005-12-17 19:59:45.000000000 +0300
+++ RT/include/linux/init_task.h	2005-12-18 00:27:31.000000000 +0300
@@ -121,7 +121,7 @@ extern struct group_info init_groups;
 	.alloc_lock	= SPIN_LOCK_UNLOCKED(tsk.alloc_lock),		\
 	.proc_lock	= SPIN_LOCK_UNLOCKED(tsk.proc_lock),		\
 	.delayed_put	= LIST_HEAD_INIT(tsk.delayed_put),		\
-	.pi_waiters	= PLIST_INIT(tsk.pi_waiters, MAX_PRIO),		\
+	.pi_waiters	= PL_HEAD_INIT(tsk.pi_waiters),			\
 	.pi_lock	= RAW_SPIN_LOCK_UNLOCKED,			\
 	.journal_info	= NULL,						\
 	.cpu_timers	= INIT_CPU_TIMERS(tsk.cpu_timers),		\
--- RT/kernel/fork.c~3_FIX	2005-12-17 19:59:45.000000000 +0300
+++ RT/kernel/fork.c	2005-12-18 00:55:41.000000000 +0300
@@ -1027,7 +1027,7 @@ static task_t *copy_process(unsigned lon
 #endif
 	INIT_LIST_HEAD(&p->delayed_put);
 	preempt_disable();
-	plist_init(&p->pi_waiters, MAX_PRIO);
+	pl_head_init(&p->pi_waiters);
 	preempt_enable();
 	p->blocked_on = NULL; /* not blocked yet */
 	spin_lock_init(&p->pi_lock);
--- RT/kernel/rt.c~3_FIX	2005-12-17 19:59:45.000000000 +0300
+++ RT/kernel/rt.c	2005-12-18 22:03:25.000000000 +0300
@@ -396,8 +396,8 @@ static void printk_waiter(struct rt_mute
 {
 	printk("-------------------------\n");
 	printk("| waiter struct %p:\n", w);
-	printk("| w->list: [DP:%p/%p|SP:%p/%p|PRI:%d]\n", w->list.dp_node.prev, w->list.dp_node.next, w->list.sp_node.prev, w->list.sp_node.next, w->list.prio);
-	printk("| w->pi_list: [DP:%p/%p|SP:%p/%p|PRI:%d]\n", w->pi_list.dp_node.prev, w->pi_list.dp_node.next, w->pi_list.sp_node.prev, w->pi_list.sp_node.next, w->pi_list.prio);
+	printk("| w->list: [DP:%p/%p|SP:%p/%p|PRI:%d]\n", w->list.plist.prio_list.prev, w->list.plist.prio_list.next, w->list.plist.node_list.prev, w->list.plist.node_list.next, w->list.prio);
+	printk("| w->pi_list: [DP:%p/%p|SP:%p/%p|PRI:%d]\n", w->pi_list.plist.prio_list.prev, w->pi_list.plist.prio_list.next, w->pi_list.plist.node_list.prev, w->pi_list.plist.node_list.next,
w->pi_list.prio);
 	printk("\n| lock:\n");
 	printk_lock(w->lock, 1);
 	printk("| w->ti->task:\n");
@@ -617,7 +617,6 @@ void check_no_held_locks(struct task_str
 {
 	struct thread_info *ti = task->thread_info;
 	struct list_head *curr, *next, *cursor = NULL;
-	struct plist *curr1;
 	struct rt_mutex *lock;
 	struct rt_mutex_waiter *w;
 	struct thread_info *t;
@@ -671,8 +670,7 @@ restart:
 		goto restart;
 	}
 	_raw_spin_lock(&task->pi_lock);
-	plist_for_each(curr1, &task->pi_waiters) {
-		w = plist_entry(curr1, struct rt_mutex_waiter, pi_list);
+	plist_for_each_entry(w, &task->pi_waiters, pi_list) {
 		TRACE_OFF();
 		_raw_spin_unlock(&task->pi_lock);
 		trace_unlock_irqrestore(&trace_lock, flags, ti);
@@ -734,13 +732,11 @@ check_pi_list_present(struct rt_mutex *l
 		      struct thread_info *old_owner)
 {
 	struct rt_mutex_waiter *w;
-	struct plist *curr1;
 
 	_raw_spin_lock(&old_owner->task->pi_lock);
-	TRACE_WARN_ON_LOCKED(plist_empty(&waiter->pi_list));
+	TRACE_WARN_ON_LOCKED(plist_unhashed(&waiter->pi_list));
 
-	plist_for_each(curr1, &old_owner->task->pi_waiters) {
-		w = plist_entry(curr1, struct rt_mutex_waiter, pi_list);
+	plist_for_each_entry(w, &old_owner->task->pi_waiters, pi_list) {
 		if (w == waiter)
 			goto ok;
 	}
@@ -754,11 +750,9 @@ static void
 check_pi_list_empty(struct rt_mutex *lock, struct thread_info *old_owner)
 {
 	struct rt_mutex_waiter *w;
-	struct plist *curr1;
 
 	_raw_spin_lock(&old_owner->task->pi_lock);
-	plist_for_each(curr1, &old_owner->task->pi_waiters) {
-		w = plist_entry(curr1, struct rt_mutex_waiter, pi_list);
+	plist_for_each_entry(w, &old_owner->task->pi_waiters, pi_list) {
 		if (w->lock == lock) {
 			TRACE_OFF();
 			printk("hm, PI interest but no waiter? Old owner:\n");
@@ -793,8 +787,7 @@ static void
 change_owner(struct rt_mutex *lock, struct thread_info *old_owner,
 	     struct thread_info *new_owner)
 {
-	struct plist *next1, *curr1;
-	struct rt_mutex_waiter *w;
+	struct rt_mutex_waiter *w, *tmp;
 	int requeued = 0, sum = 0;
 
 	if (old_owner == new_owner)
@@ -802,12 +795,11 @@ change_owner(struct rt_mutex *lock, stru
 
 	SMP_TRACE_BUG_ON_LOCKED(!spin_is_locked(&old_owner->task->pi_lock));
 	SMP_TRACE_BUG_ON_LOCKED(!spin_is_locked(&new_owner->task->pi_lock));
-	plist_for_each_safe(curr1, next1, &old_owner->task->pi_waiters) {
-		w = plist_entry(curr1, struct rt_mutex_waiter, pi_list);
+	plist_for_each_entry_safe(w, tmp, &old_owner->task->pi_waiters, pi_list) {
 		if (w->lock == lock) {
 			trace_special_pid(w->ti->task->pid, w->ti->task->prio, w->ti->task->normal_prio);
-			plist_del(&w->pi_list, &old_owner->task->pi_waiters);
-			plist_init(&w->pi_list, w->ti->task->prio);
+			plist_del(&w->pi_list);
+			w->pi_list.prio = w->ti->task->prio;
 			plist_add(&w->pi_list, &new_owner->task->pi_waiters);
 			requeued++;
 		}
@@ -917,7 +909,7 @@ static void pi_setprio(struct rt_mutex *
 
 		TRACE_BUG_ON_LOCKED(!lock_owner(l));
 
-		if (!plist_empty(&w->pi_list)) {
+		if (!plist_unhashed(&w->pi_list)) {
 			TRACE_BUG_ON_LOCKED(!was_rt && !ALL_TASKS_PI && !rt_task(p));
 			/*
 			 * If the task is blocked on a lock, and we just restored
@@ -927,17 +919,17 @@ static void pi_setprio(struct rt_mutex *
 			 * (TODO: this can be unfair to SCHED_NORMAL tasks if they
 			 *        get PI handled.)
 			 */
-			plist_del(&w->pi_list, &lock_owner(l)->task->pi_waiters);
+			plist_del(&w->pi_list);
 		} else
 			TRACE_BUG_ON_LOCKED((ALL_TASKS_PI || rt_task(p)) && was_rt);
 
 		if (ALL_TASKS_PI || rt_task(p)) {
-			plist_init(&w->pi_list,prio);
+			w->pi_list.prio = prio;
 			plist_add(&w->pi_list, &lock_owner(l)->task->pi_waiters);
 		}
 
-		plist_del(&w->list, &l->wait_list);
-		plist_init(&w->list, prio);
+		plist_del(&w->list);
+		w->list.prio = prio;
 		plist_add(&w->list, &l->wait_list);
 
 		pi_walk++;
@@ -1028,7 +1020,7 @@ task_blocks_on_lock(struct rt_mutex_wait
 	task->blocked_on = waiter;
 	waiter->lock = lock;
 	waiter->ti = ti;
-	plist_init(&waiter->pi_list, task->prio);
+	pl_node_init(&waiter->pi_list, task->prio);
 	/*
 	 * Add SCHED_NORMAL tasks to the end of the waitqueue (FIFO):
 	 */
@@ -1067,7 +1059,7 @@ static void __init_rt_mutex(struct rt_mu
 	lock->owner = NULL;
 	spin_lock_init(&lock->wait_lock);
 	preempt_disable();
-	plist_init(&lock->wait_list, MAX_PRIO);
+	pl_head_init(&lock->wait_list);
 	preempt_enable();
 #ifdef CONFIG_DEBUG_DEADLOCKS
 	lock->save_state = save_state;
@@ -1178,9 +1170,9 @@ pick_new_owner(struct rt_mutex *lock, st
 #endif
 		_raw_spin_lock(&old_owner->task->pi_lock);
 
-	plist_del_init(&waiter->list, &lock->wait_list);
-	plist_del(&waiter->pi_list, &old_owner->task->pi_waiters);
-	plist_init(&waiter->pi_list, waiter->ti->task->prio);
+	plist_del(&waiter->list);
+	plist_del(&waiter->pi_list);
+	waiter->pi_list.prio = waiter->ti->task->prio;
 
 	set_new_owner(lock, old_owner, new_owner __W_EIP__(waiter));
 	/* Don't touch waiter after ->task has been NULLed */
@@ -1203,8 +1195,8 @@ static inline void init_lists(struct rt_
 {
 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_DEADLOCKS)
 	// we have to do this until the static initializers get fixed:
-	if (unlikely(!lock->wait_list.dp_node.prev)) {
-		plist_init(&lock->wait_list, MAX_PRIO);
+	if (unlikely(!lock->wait_list.prio_list.prev)) {
+		pl_head_init(&lock->wait_list);
 #ifdef CONFIG_DEBUG_DEADLOCKS
 		pi_initialized++;
 #endif
@@ -1334,8 +1326,8 @@ capture_lock(struct rt_mutex_waiter *wai
 			ret = 0;
 		} else {
 			/* Add ourselves back to the list */
-			TRACE_BUG_ON_LOCKED(!plist_empty(&waiter->list));
-			plist_init(&waiter->list, task->prio);
+			TRACE_BUG_ON_LOCKED(!plist_unhashed(&waiter->list));
+			pl_node_init(&waiter->list, task->prio);
 			task_blocks_on_lock(waiter, ti, lock __W_EIP__(waiter));
 			ret = 1;
 		}
@@ -1355,16 +1347,16 @@ static inline void INIT_WAITER(struct rt
 {
 #ifdef CONFIG_DEBUG_DEADLOCKS
 	memset(waiter, 0x11, sizeof(*waiter));
-	plist_init(&waiter->list, MAX_PRIO);
-	plist_init(&waiter->pi_list, MAX_PRIO);
+	pl_node_init(&waiter->list, MAX_PRIO);
+	pl_node_init(&waiter->pi_list, MAX_PRIO);
 #endif
 }
 
 static inline void FREE_WAITER(struct rt_mutex_waiter *waiter)
 {
 #ifdef CONFIG_DEBUG_DEADLOCKS
-	TRACE_WARN_ON(!plist_empty(&waiter->list));
-	TRACE_WARN_ON(!plist_empty(&waiter->pi_list));
+	TRACE_WARN_ON(!plist_unhashed(&waiter->list));
+	TRACE_WARN_ON(!plist_unhashed(&waiter->pi_list));
 	TRACE_WARN_ON(current->blocked_on);
 	memset(waiter, 0x22, sizeof(*waiter));
 #endif
@@ -1409,7 +1401,7 @@ ____down(struct rt_mutex *lock __EIP_DEC
 
 	set_task_state(task, TASK_UNINTERRUPTIBLE);
 
-	plist_init(&waiter.list, task->prio);
+	pl_node_init(&waiter.list, task->prio);
 	task_blocks_on_lock(&waiter, ti, lock __EIP__);
 
 	TRACE_BUG_ON_LOCKED(!raw_irqs_disabled());
@@ -1490,7 +1482,7 @@ ____down_mutex(struct rt_mutex *lock __E
 		return;
 	}
 
-	plist_init(&waiter.list, task->prio);
+	pl_node_init(&waiter.list, task->prio);
 	task_blocks_on_lock(&waiter, ti, lock __EIP__);
 
 	TRACE_BUG_ON_LOCKED(!raw_irqs_disabled());
@@ -1589,7 +1581,7 @@ ____up_mutex(struct rt_mutex *lock, int 
 	trace_lock_irqsave(&trace_lock, flags, ti);
 	TRACE_BUG_ON_LOCKED(!raw_irqs_disabled());
 	_raw_spin_lock(&lock->wait_lock);
-	TRACE_BUG_ON_LOCKED(!lock->wait_list.dp_node.prev && !lock->wait_list.dp_node.next);
+	TRACE_BUG_ON_LOCKED(!lock->wait_list.prio_list.prev && !lock->wait_list.prio_list.next);
 
 #ifdef CONFIG_DEBUG_DEADLOCKS
 	TRACE_WARN_ON_LOCKED(lock_owner(lock) != ti);
@@ -1873,7 +1865,7 @@ static int __sched __down_interruptible(
 
 	set_task_state(task, TASK_INTERRUPTIBLE);
 
-	plist_init(&waiter.list, task->prio);
+	pl_node_init(&waiter.list, task->prio);
 	task_blocks_on_lock(&waiter, ti, lock __EIP__);
 
 	TRACE_BUG_ON_LOCKED(!raw_irqs_disabled());
@@ -1908,7 +1900,7 @@ wait_again:
 			_raw_spin_lock(&task->pi_lock);
 			_raw_spin_lock(&lock->wait_lock);
 			if (waiter.ti || time) {
-				plist_del_init(&waiter.list, &lock->wait_list);
+				plist_del(&waiter.list);
 				/*
 				 * Just remove ourselves from the PI list.
 				 * (No big problem if our PI effect lingers
@@ -1916,8 +1908,8 @@ wait_again:
 				 */
 				TRACE_WARN_ON_LOCKED(waiter.ti != ti);
 				TRACE_WARN_ON_LOCKED(current->blocked_on != &waiter);
-				plist_del(&waiter.pi_list, &task->pi_waiters);
-				plist_init(&waiter.pi_list, task->prio);
+				plist_del(&waiter.pi_list);
+				waiter.pi_list.prio = task->prio;
 				waiter.ti = NULL;
 				current->blocked_on = NULL;
 				if (time) {

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH rc5-rt2 3/3] plist: convert the code to new implementation
  2005-12-18 18:17 [PATCH rc5-rt2 3/3] plist: convert the code to new implementation Oleg Nesterov
@ 2005-12-19 17:13 ` Daniel Walker
  2005-12-19 19:19   ` [PATCH rc5-rt2 3/3] plist: convert the code to newimplementation Oleg Nesterov
  0 siblings, 1 reply; 3+ messages in thread
From: Daniel Walker @ 2005-12-19 17:13 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Ingo Molnar, linux-kernel, Steven Rostedt, Inaky Perez-Gonzalez


I think firstly, if you want to have success with this patch you'll need
to clean it up a bit. I'm not an authority on clean code , but below
isn't clean to my eyes. However, this is cleaner than your last
attempt .

Hard coding MAX_PRIO isn't really acceptable. If your going to make it
more similar to list_head , why not name it plist_head instead of
pl_head that way it's easy to switch between them. Part of what I wanted
out of plist was to switch between a regular list , and a plist easily.
You seem to add something to that, and take something away. Like you
remove a lot of the API which makes it less similar to a regular list .

Also, making any changes to the internals of the plist structure outside
of plist.c (or similar) isn't acceptable. For instance you set the node
priority in several places, that should be hidden inside another
function or macro. That makes it easier for people to change the
internal structure without treading though tons of code. 

Changing plist_empty() doesn't make any sense to me. Also changing
dp_node to prio_list doesn't make much sense either.

Daniel

On Sun, 2005-12-18 at 21:17 +0300, Oleg Nesterov wrote:
> This patch blindly fixes compilation errors caused by
> a previous patch.
> 
>  include/linux/rt_lock.h   |    8 ++--
>  include/linux/sched.h     |    2 -
>  include/linux/init_task.h |    2 -
>  kernel/fork.c             |    2 -
>  kernel/rt.c               |   78 ++++++++++++++++++++--------------------------
>  5 files changed, 42 insertions(+), 50 deletions(-)
> 
> Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
> 
> --- RT/include/linux/rt_lock.h~3_FIX	2005-12-17 19:59:45.000000000 +0300
> +++ RT/include/linux/rt_lock.h	2005-12-18 22:23:40.000000000 +0300
> @@ -24,7 +24,7 @@
>   */
>  struct rt_mutex {
>  	raw_spinlock_t		wait_lock;
> -	struct plist		wait_list;
> +	struct pl_head		wait_list;
>  	struct thread_info	*owner;
>  # ifdef CONFIG_DEBUG_RT_LOCKING_MODE
>  	raw_spinlock_t		debug_slock;
> @@ -49,8 +49,8 @@ struct rt_mutex {
>   */
>  struct rt_mutex_waiter {
>  	struct rt_mutex		*lock;
> -	struct plist		list;
> -	struct plist		pi_list;
> +	struct pl_node		list;
> +	struct pl_node		pi_list;
>  	struct thread_info	*ti;
>  #ifdef CONFIG_DEBUG_DEADLOCKS
>  	unsigned long eip;
> @@ -87,7 +87,7 @@ struct rt_mutex_waiter {
>  # define __PLIST_INIT(lockname)
>  #else
>  # define __PLIST_INIT(lockname) \
> -	, .wait_list = PLIST_INIT((lockname).wait_list, 140 /*MAX_PRIO*/)
> +	, .wait_list = PL_HEAD_INIT((lockname).wait_list)
>  #endif
>  
>  #define __RT_MUTEX_INITIALIZER(lockname) \
> --- RT/include/linux/sched.h~3_FIX	2005-12-17 19:59:45.000000000 +0300
> +++ RT/include/linux/sched.h	2005-12-18 00:21:43.000000000 +0300
> @@ -1026,7 +1026,7 @@ struct task_struct {
>  #endif
>  	/* realtime bits */
>  	struct list_head delayed_put;
> -	struct plist pi_waiters;
> +	struct pl_head pi_waiters;
>  
>  	/* RT deadlock detection and priority inheritance handling */
>  	struct rt_mutex_waiter *blocked_on;
> --- RT/include/linux/init_task.h~3_FIX	2005-12-17 19:59:45.000000000 +0300
> +++ RT/include/linux/init_task.h	2005-12-18 00:27:31.000000000 +0300
> @@ -121,7 +121,7 @@ extern struct group_info init_groups;
>  	.alloc_lock	= SPIN_LOCK_UNLOCKED(tsk.alloc_lock),		\
>  	.proc_lock	= SPIN_LOCK_UNLOCKED(tsk.proc_lock),		\
>  	.delayed_put	= LIST_HEAD_INIT(tsk.delayed_put),		\
> -	.pi_waiters	= PLIST_INIT(tsk.pi_waiters, MAX_PRIO),		\
> +	.pi_waiters	= PL_HEAD_INIT(tsk.pi_waiters),			\
>  	.pi_lock	= RAW_SPIN_LOCK_UNLOCKED,			\
>  	.journal_info	= NULL,						\
>  	.cpu_timers	= INIT_CPU_TIMERS(tsk.cpu_timers),		\
> --- RT/kernel/fork.c~3_FIX	2005-12-17 19:59:45.000000000 +0300
> +++ RT/kernel/fork.c	2005-12-18 00:55:41.000000000 +0300
> @@ -1027,7 +1027,7 @@ static task_t *copy_process(unsigned lon
>  #endif
>  	INIT_LIST_HEAD(&p->delayed_put);
>  	preempt_disable();
> -	plist_init(&p->pi_waiters, MAX_PRIO);
> +	pl_head_init(&p->pi_waiters);
>  	preempt_enable();
>  	p->blocked_on = NULL; /* not blocked yet */
>  	spin_lock_init(&p->pi_lock);
> --- RT/kernel/rt.c~3_FIX	2005-12-17 19:59:45.000000000 +0300
> +++ RT/kernel/rt.c	2005-12-18 22:03:25.000000000 +0300
> @@ -396,8 +396,8 @@ static void printk_waiter(struct rt_mute
>  {
>  	printk("-------------------------\n");
>  	printk("| waiter struct %p:\n", w);
> -	printk("| w->list: [DP:%p/%p|SP:%p/%p|PRI:%d]\n", w->list.dp_node.prev, w->list.dp_node.next, w->list.sp_node.prev, w->list.sp_node.next, w->list.prio);
> -	printk("| w->pi_list: [DP:%p/%p|SP:%p/%p|PRI:%d]\n", w->pi_list.dp_node.prev, w->pi_list.dp_node.next, w->pi_list.sp_node.prev, w->pi_list.sp_node.next, w->pi_list.prio);
> +	printk("| w->list: [DP:%p/%p|SP:%p/%p|PRI:%d]\n", w->list.plist.prio_list.prev, w->list.plist.prio_list.next, w->list.plist.node_list.prev, w->list.plist.node_list.next, w->list.prio);
> +	printk("| w->pi_list: [DP:%p/%p|SP:%p/%p|PRI:%d]\n", w->pi_list.plist.prio_list.prev, w->pi_list.plist.prio_list.next, w->pi_list.plist.node_list.prev, w->pi_list.plist.node_list.next,
> w->pi_list.prio);
>  	printk("\n| lock:\n");
>  	printk_lock(w->lock, 1);
>  	printk("| w->ti->task:\n");
> @@ -617,7 +617,6 @@ void check_no_held_locks(struct task_str
>  {
>  	struct thread_info *ti = task->thread_info;
>  	struct list_head *curr, *next, *cursor = NULL;
> -	struct plist *curr1;
>  	struct rt_mutex *lock;
>  	struct rt_mutex_waiter *w;
>  	struct thread_info *t;
> @@ -671,8 +670,7 @@ restart:
>  		goto restart;
>  	}
>  	_raw_spin_lock(&task->pi_lock);
> -	plist_for_each(curr1, &task->pi_waiters) {
> -		w = plist_entry(curr1, struct rt_mutex_waiter, pi_list);
> +	plist_for_each_entry(w, &task->pi_waiters, pi_list) {
>  		TRACE_OFF();
>  		_raw_spin_unlock(&task->pi_lock);
>  		trace_unlock_irqrestore(&trace_lock, flags, ti);
> @@ -734,13 +732,11 @@ check_pi_list_present(struct rt_mutex *l
>  		      struct thread_info *old_owner)
>  {
>  	struct rt_mutex_waiter *w;
> -	struct plist *curr1;
>  
>  	_raw_spin_lock(&old_owner->task->pi_lock);
> -	TRACE_WARN_ON_LOCKED(plist_empty(&waiter->pi_list));
> +	TRACE_WARN_ON_LOCKED(plist_unhashed(&waiter->pi_list));
>  
> -	plist_for_each(curr1, &old_owner->task->pi_waiters) {
> -		w = plist_entry(curr1, struct rt_mutex_waiter, pi_list);
> +	plist_for_each_entry(w, &old_owner->task->pi_waiters, pi_list) {
>  		if (w == waiter)
>  			goto ok;
>  	}
> @@ -754,11 +750,9 @@ static void
>  check_pi_list_empty(struct rt_mutex *lock, struct thread_info *old_owner)
>  {
>  	struct rt_mutex_waiter *w;
> -	struct plist *curr1;
>  
>  	_raw_spin_lock(&old_owner->task->pi_lock);
> -	plist_for_each(curr1, &old_owner->task->pi_waiters) {
> -		w = plist_entry(curr1, struct rt_mutex_waiter, pi_list);
> +	plist_for_each_entry(w, &old_owner->task->pi_waiters, pi_list) {
>  		if (w->lock == lock) {
>  			TRACE_OFF();
>  			printk("hm, PI interest but no waiter? Old owner:\n");
> @@ -793,8 +787,7 @@ static void
>  change_owner(struct rt_mutex *lock, struct thread_info *old_owner,
>  	     struct thread_info *new_owner)
>  {
> -	struct plist *next1, *curr1;
> -	struct rt_mutex_waiter *w;
> +	struct rt_mutex_waiter *w, *tmp;
>  	int requeued = 0, sum = 0;
>  
>  	if (old_owner == new_owner)
> @@ -802,12 +795,11 @@ change_owner(struct rt_mutex *lock, stru
>  
>  	SMP_TRACE_BUG_ON_LOCKED(!spin_is_locked(&old_owner->task->pi_lock));
>  	SMP_TRACE_BUG_ON_LOCKED(!spin_is_locked(&new_owner->task->pi_lock));
> -	plist_for_each_safe(curr1, next1, &old_owner->task->pi_waiters) {
> -		w = plist_entry(curr1, struct rt_mutex_waiter, pi_list);
> +	plist_for_each_entry_safe(w, tmp, &old_owner->task->pi_waiters, pi_list) {
>  		if (w->lock == lock) {
>  			trace_special_pid(w->ti->task->pid, w->ti->task->prio, w->ti->task->normal_prio);
> -			plist_del(&w->pi_list, &old_owner->task->pi_waiters);
> -			plist_init(&w->pi_list, w->ti->task->prio);
> +			plist_del(&w->pi_list);
> +			w->pi_list.prio = w->ti->task->prio;
>  			plist_add(&w->pi_list, &new_owner->task->pi_waiters);
>  			requeued++;
>  		}
> @@ -917,7 +909,7 @@ static void pi_setprio(struct rt_mutex *
>  
>  		TRACE_BUG_ON_LOCKED(!lock_owner(l));
>  
> -		if (!plist_empty(&w->pi_list)) {
> +		if (!plist_unhashed(&w->pi_list)) {
>  			TRACE_BUG_ON_LOCKED(!was_rt && !ALL_TASKS_PI && !rt_task(p));
>  			/*
>  			 * If the task is blocked on a lock, and we just restored
> @@ -927,17 +919,17 @@ static void pi_setprio(struct rt_mutex *
>  			 * (TODO: this can be unfair to SCHED_NORMAL tasks if they
>  			 *        get PI handled.)
>  			 */
> -			plist_del(&w->pi_list, &lock_owner(l)->task->pi_waiters);
> +			plist_del(&w->pi_list);
>  		} else
>  			TRACE_BUG_ON_LOCKED((ALL_TASKS_PI || rt_task(p)) && was_rt);
>  
>  		if (ALL_TASKS_PI || rt_task(p)) {
> -			plist_init(&w->pi_list,prio);
> +			w->pi_list.prio = prio;
>  			plist_add(&w->pi_list, &lock_owner(l)->task->pi_waiters);
>  		}
>  
> -		plist_del(&w->list, &l->wait_list);
> -		plist_init(&w->list, prio);
> +		plist_del(&w->list);
> +		w->list.prio = prio;
>  		plist_add(&w->list, &l->wait_list);
>  
>  		pi_walk++;
> @@ -1028,7 +1020,7 @@ task_blocks_on_lock(struct rt_mutex_wait
>  	task->blocked_on = waiter;
>  	waiter->lock = lock;
>  	waiter->ti = ti;
> -	plist_init(&waiter->pi_list, task->prio);
> +	pl_node_init(&waiter->pi_list, task->prio);
>  	/*
>  	 * Add SCHED_NORMAL tasks to the end of the waitqueue (FIFO):
>  	 */
> @@ -1067,7 +1059,7 @@ static void __init_rt_mutex(struct rt_mu
>  	lock->owner = NULL;
>  	spin_lock_init(&lock->wait_lock);
>  	preempt_disable();
> -	plist_init(&lock->wait_list, MAX_PRIO);
> +	pl_head_init(&lock->wait_list);
>  	preempt_enable();
>  #ifdef CONFIG_DEBUG_DEADLOCKS
>  	lock->save_state = save_state;
> @@ -1178,9 +1170,9 @@ pick_new_owner(struct rt_mutex *lock, st
>  #endif
>  		_raw_spin_lock(&old_owner->task->pi_lock);
>  
> -	plist_del_init(&waiter->list, &lock->wait_list);
> -	plist_del(&waiter->pi_list, &old_owner->task->pi_waiters);
> -	plist_init(&waiter->pi_list, waiter->ti->task->prio);
> +	plist_del(&waiter->list);
> +	plist_del(&waiter->pi_list);
> +	waiter->pi_list.prio = waiter->ti->task->prio;
>  
>  	set_new_owner(lock, old_owner, new_owner __W_EIP__(waiter));
>  	/* Don't touch waiter after ->task has been NULLed */
> @@ -1203,8 +1195,8 @@ static inline void init_lists(struct rt_
>  {
>  #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_DEADLOCKS)
>  	// we have to do this until the static initializers get fixed:
> -	if (unlikely(!lock->wait_list.dp_node.prev)) {
> -		plist_init(&lock->wait_list, MAX_PRIO);
> +	if (unlikely(!lock->wait_list.prio_list.prev)) {
> +		pl_head_init(&lock->wait_list);
>  #ifdef CONFIG_DEBUG_DEADLOCKS
>  		pi_initialized++;
>  #endif
> @@ -1334,8 +1326,8 @@ capture_lock(struct rt_mutex_waiter *wai
>  			ret = 0;
>  		} else {
>  			/* Add ourselves back to the list */
> -			TRACE_BUG_ON_LOCKED(!plist_empty(&waiter->list));
> -			plist_init(&waiter->list, task->prio);
> +			TRACE_BUG_ON_LOCKED(!plist_unhashed(&waiter->list));
> +			pl_node_init(&waiter->list, task->prio);
>  			task_blocks_on_lock(waiter, ti, lock __W_EIP__(waiter));
>  			ret = 1;
>  		}
> @@ -1355,16 +1347,16 @@ static inline void INIT_WAITER(struct rt
>  {
>  #ifdef CONFIG_DEBUG_DEADLOCKS
>  	memset(waiter, 0x11, sizeof(*waiter));
> -	plist_init(&waiter->list, MAX_PRIO);
> -	plist_init(&waiter->pi_list, MAX_PRIO);
> +	pl_node_init(&waiter->list, MAX_PRIO);
> +	pl_node_init(&waiter->pi_list, MAX_PRIO);
>  #endif
>  }
>  
>  static inline void FREE_WAITER(struct rt_mutex_waiter *waiter)
>  {
>  #ifdef CONFIG_DEBUG_DEADLOCKS
> -	TRACE_WARN_ON(!plist_empty(&waiter->list));
> -	TRACE_WARN_ON(!plist_empty(&waiter->pi_list));
> +	TRACE_WARN_ON(!plist_unhashed(&waiter->list));
> +	TRACE_WARN_ON(!plist_unhashed(&waiter->pi_list));
>  	TRACE_WARN_ON(current->blocked_on);
>  	memset(waiter, 0x22, sizeof(*waiter));
>  #endif
> @@ -1409,7 +1401,7 @@ ____down(struct rt_mutex *lock __EIP_DEC
>  
>  	set_task_state(task, TASK_UNINTERRUPTIBLE);
>  
> -	plist_init(&waiter.list, task->prio);
> +	pl_node_init(&waiter.list, task->prio);
>  	task_blocks_on_lock(&waiter, ti, lock __EIP__);
>  
>  	TRACE_BUG_ON_LOCKED(!raw_irqs_disabled());
> @@ -1490,7 +1482,7 @@ ____down_mutex(struct rt_mutex *lock __E
>  		return;
>  	}
>  
> -	plist_init(&waiter.list, task->prio);
> +	pl_node_init(&waiter.list, task->prio);
>  	task_blocks_on_lock(&waiter, ti, lock __EIP__);
>  
>  	TRACE_BUG_ON_LOCKED(!raw_irqs_disabled());
> @@ -1589,7 +1581,7 @@ ____up_mutex(struct rt_mutex *lock, int 
>  	trace_lock_irqsave(&trace_lock, flags, ti);
>  	TRACE_BUG_ON_LOCKED(!raw_irqs_disabled());
>  	_raw_spin_lock(&lock->wait_lock);
> -	TRACE_BUG_ON_LOCKED(!lock->wait_list.dp_node.prev && !lock->wait_list.dp_node.next);
> +	TRACE_BUG_ON_LOCKED(!lock->wait_list.prio_list.prev && !lock->wait_list.prio_list.next);
>  
>  #ifdef CONFIG_DEBUG_DEADLOCKS
>  	TRACE_WARN_ON_LOCKED(lock_owner(lock) != ti);
> @@ -1873,7 +1865,7 @@ static int __sched __down_interruptible(
>  
>  	set_task_state(task, TASK_INTERRUPTIBLE);
>  
> -	plist_init(&waiter.list, task->prio);
> +	pl_node_init(&waiter.list, task->prio);
>  	task_blocks_on_lock(&waiter, ti, lock __EIP__);
>  
>  	TRACE_BUG_ON_LOCKED(!raw_irqs_disabled());
> @@ -1908,7 +1900,7 @@ wait_again:
>  			_raw_spin_lock(&task->pi_lock);
>  			_raw_spin_lock(&lock->wait_lock);
>  			if (waiter.ti || time) {
> -				plist_del_init(&waiter.list, &lock->wait_list);
> +				plist_del(&waiter.list);
>  				/*
>  				 * Just remove ourselves from the PI list.
>  				 * (No big problem if our PI effect lingers
> @@ -1916,8 +1908,8 @@ wait_again:
>  				 */
>  				TRACE_WARN_ON_LOCKED(waiter.ti != ti);
>  				TRACE_WARN_ON_LOCKED(current->blocked_on != &waiter);
> -				plist_del(&waiter.pi_list, &task->pi_waiters);
> -				plist_init(&waiter.pi_list, task->prio);
> +				plist_del(&waiter.pi_list);
> +				waiter.pi_list.prio = task->prio;
>  				waiter.ti = NULL;
>  				current->blocked_on = NULL;
>  				if (time) {


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH rc5-rt2 3/3] plist: convert the code to newimplementation
  2005-12-19 17:13 ` Daniel Walker
@ 2005-12-19 19:19   ` Oleg Nesterov
  0 siblings, 0 replies; 3+ messages in thread
From: Oleg Nesterov @ 2005-12-19 19:19 UTC (permalink / raw)
  To: Daniel Walker
  Cc: Ingo Molnar, linux-kernel, Steven Rostedt, Inaky Perez-Gonzalez

Daniel Walker wrote:
> 
> I think firstly, if you want to have success with this patch you'll need
> to clean it up a bit. I'm not an authority on clean code , but below
> isn't clean to my eyes.

Cleanups are always good, I am open to any suggestions.

>                         However, this is cleaner than your last
> attempt .

Thanks, but it was NOT changed from my last attempt. Just rediff.

> Hard coding MAX_PRIO isn't really acceptable.

I don't do that? Could you clarify?

>                                               If your going to make it
> more similar to list_head , why not name it plist_head instead of
> pl_head that way it's easy to switch between them.

I don't mind to rename, probably plist_head is better. I'd like to know
Ingo's opinion first.

>                                                              Like you
> remove a lot of the API which makes it less similar to a regular list .

For example?

> Also, making any changes to the internals of the plist structure outside
> of plist.c (or similar) isn't acceptable. For instance you set the node
> priority in several places, that should be hidden inside another
> function or macro. That makes it easier for people to change the
> internal structure without treading though tons of code.

Agreed, I already thought it makes sense to add plist_add_prio() helper.
Note that ->prio is set directly mostly right before plist_add() call.

> Changing plist_empty() doesn't make any sense to me.

plist_empty(head) means this list empty. plist_unhashed(node) means
this node is not on list. 

>                                                       Also changing
> dp_node to prio_list doesn't make much sense either.

Again, this patch is unchanged. I don't mind to rename, but recall
that it was sent before the current implementation become functional.
And honestly I don't like 'sp_node', this name is misleading, and
reflects first buggy implementation. It should be called 'all_nodes'
or something like this.

Oleg.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-12-19 18:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-12-18 18:17 [PATCH rc5-rt2 3/3] plist: convert the code to new implementation Oleg Nesterov
2005-12-19 17:13 ` Daniel Walker
2005-12-19 19:19   ` [PATCH rc5-rt2 3/3] plist: convert the code to newimplementation Oleg Nesterov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®