All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tobias DiPasquale <codeslinger@gmail.com>
To: akpm@digeo.com, linux-kernel@vger.kernel.org, torvalds@osdl.org
Subject: [PATCH][REVISED] add list_del_head[_init] functions
Date: Fri, 26 Nov 2004 19:38:38 -0500	[thread overview]
Message-ID: <876ef97a0411261638988b9aa@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 726 bytes --]

Hi all,

I revised my earlier list_del_head patch and took Jens' suggestions.
There were two function additions:

list_del_head() - removes the head of a list and returns it
list_del_head_init() - removes the head of a list, reinitializes it
and returns it

I have also converted several obvious pieces of code in kernel/, net/
and mm/ to use these new functions. The patch for all of this is
attached. Thanks :)

Name: Add list_del_head[_init] functions for full queue API
Status: Tested (smoke tests, mostly)
Signed-off-by: Toby DiPasquale <codeslinger@gmail.com>

P.S. Again, please CC me on any replies as I'm not subscribed to LKML.
Thanks again :)

-- 
[ Tobias DiPasquale ]
0x636f6465736c696e67657240676d61696c2e636f6d

[-- Attachment #2: listdelhead.patch --]
[-- Type: application/octet-stream, Size: 9755 bytes --]

diff -Nrup linux-2.6.9/include/linux/list.h linux/include/linux/list.h
--- linux-2.6.9/include/linux/list.h	2004-10-18 21:54:31.000000000 +0000
+++ linux/include/linux/list.h	2004-11-26 23:07:35.000000000 +0000
@@ -166,6 +166,35 @@ static inline void list_del(struct list_
 }
 
 /**
+ * list_del_head - deletes head entry from list.
+ * @head : list head to delete
+ *
+ * Caller must be sure that the list is not empty before calling 
+ * this function.
+ */
+static inline struct list_head *list_del_head(struct list_head *head)
+{
+	struct list_head *entry = head->next;
+	list_del(head->next);
+	return entry;
+}
+
+/**
+ * list_del_head_init - deletes head entry from list and reinitializes it.
+ * @head : list head to delete
+ *
+ * Caller must be sure that the list is not empty before calling 
+ * this function.
+ */
+static inline struct list_head *list_del_head_init(struct list_head *head)
+{
+	struct list_head *entry = head->next;
+	list_del(head->next);
+	INIT_LIST_HEAD(entry);
+	return entry;
+}
+
+/**
  * list_del_rcu - deletes entry from list without re-initialization
  * @entry: the element to delete from the list.
  *
diff -Nrup linux-2.6.9/kernel/audit.c linux/kernel/audit.c
--- linux-2.6.9/kernel/audit.c	2004-10-18 21:55:36.000000000 +0000
+++ linux/kernel/audit.c	2004-11-26 21:15:52.000000000 +0000
@@ -612,9 +612,8 @@ struct audit_buffer *audit_log_start(str
 
 	spin_lock_irqsave(&audit_freelist_lock, flags);
 	if (!list_empty(&audit_freelist)) {
-		ab = list_entry(audit_freelist.next,
+		ab = list_entry(list_del_head(&audit_freelist),
 				struct audit_buffer, list);
-		list_del(&ab->list);
 		--audit_freelist_count;
 	}
 	spin_unlock_irqrestore(&audit_freelist_lock, flags);
@@ -732,8 +731,7 @@ static void audit_tasklet_handler(unsign
 	spin_unlock_irqrestore(&audit_txlist_lock, flags);
 
 	while (!list_empty(&list)) {
-		ab = list_entry(list.next, struct audit_buffer, list);
-		list_del(&ab->list);
+		ab = list_entry(list_del_head(&list), struct audit_buffer, list);
 		audit_log_end_fast(ab);
 	}
 }
diff -Nrup linux-2.6.9/kernel/posix-timers.c linux/kernel/posix-timers.c
--- linux-2.6.9/kernel/posix-timers.c	2004-10-18 21:54:22.000000000 +0000
+++ linux/kernel/posix-timers.c	2004-11-26 23:08:36.000000000 +0000
@@ -1132,7 +1132,6 @@ retry_delete:
 #else
 	p_timer_del(&posix_clocks[timer->it_clock], timer);
 #endif
-	list_del(&timer->list);
 	/*
 	 * This keeps any tasks waiting on the spin lock from thinking
 	 * they got something (see the lock code above).
@@ -1155,7 +1154,8 @@ void exit_itimers(struct signal_struct *
 	struct k_itimer *tmr;
 
 	while (!list_empty(&sig->posix_timers)) {
-		tmr = list_entry(sig->posix_timers.next, struct k_itimer, list);
+		tmr = list_entry(list_del_head(&sig->posix_timers), 
+				 struct k_itimer, list);
 		itimer_delete(tmr);
 	}
 }
@@ -1369,10 +1369,8 @@ void clock_was_set(void)
 			spin_unlock_irq(&abs_list.lock);
 			break;
 		}
-		timr = list_entry(cws_list.next, struct k_itimer,
-				   abs_timer_entry);
-
-		list_del_init(&timr->abs_timer_entry);
+		timr = list_entry(list_del_head_init(&cws_list), 
+				  struct k_itimer, abs_timer_entry);
 		if (add_clockset_delta(timr, &new_wall_to) &&
 		    del_timer(&timr->it_timer))  /* timer run yet? */
 			add_timer(&timr->it_timer);
diff -Nrup linux-2.6.9/kernel/sched.c linux/kernel/sched.c
--- linux-2.6.9/kernel/sched.c	2004-10-18 21:54:55.000000000 +0000
+++ linux/kernel/sched.c	2004-11-26 23:09:02.000000000 +0000
@@ -4162,10 +4162,9 @@ static int migration_call(struct notifie
 		spin_lock_irq(&rq->lock);
 		while (!list_empty(&rq->migration_queue)) {
 			migration_req_t *req;
-			req = list_entry(rq->migration_queue.next,
+			req = list_entry(list_del_head_init(&rq->migration_queue),
 					 migration_req_t, list);
 			BUG_ON(req->type != REQ_MOVE_TASK);
-			list_del_init(&req->list);
 			complete(&req->done);
 		}
 		spin_unlock_irq(&rq->lock);
diff -Nrup linux-2.6.9/kernel/signal.c linux/kernel/signal.c
--- linux-2.6.9/kernel/signal.c	2004-10-18 21:53:51.000000000 +0000
+++ linux/kernel/signal.c	2004-11-26 23:09:15.000000000 +0000
@@ -296,8 +296,8 @@ static void flush_sigqueue(struct sigpen
 
 	sigemptyset(&queue->signal);
 	while (!list_empty(&queue->list)) {
-		q = list_entry(queue->list.next, struct sigqueue , list);
-		list_del_init(&q->list);
+		q = list_entry(list_del_head_init(&queue->list), 
+			       struct sigqueue, list);
 		__sigqueue_free(q);
 	}
 }
diff -Nrup linux-2.6.9/kernel/workqueue.c linux/kernel/workqueue.c
--- linux-2.6.9/kernel/workqueue.c	2004-10-18 21:55:29.000000000 +0000
+++ linux/kernel/workqueue.c	2004-11-26 23:10:01.000000000 +0000
@@ -159,12 +159,12 @@ static inline void run_workqueue(struct 
 		dump_stack();
 	}
 	while (!list_empty(&cwq->worklist)) {
-		struct work_struct *work = list_entry(cwq->worklist.next,
-						struct work_struct, entry);
+		struct work_struct *work = 
+			list_entry(list_del_head_init(&cwq->worklist),
+				   struct work_struct, entry);
 		void (*f) (void *) = work->func;
 		void *data = work->data;
 
-		list_del_init(cwq->worklist.next);
 		spin_unlock_irqrestore(&cwq->lock, flags);
 
 		BUG_ON(work->wq_data != cwq);
@@ -457,8 +457,7 @@ static void take_over_work(struct workqu
 
 	while (!list_empty(&list)) {
 		printk("Taking work for %s\n", wq->name);
-		work = list_entry(list.next,struct work_struct,entry);
-		list_del(&work->entry);
+		work = list_entry(list_del_head(&list),struct work_struct,entry);
 		__queue_work(wq->cpu_wq + smp_processor_id(), work);
 	}
 	spin_unlock_irq(&cwq->lock);
diff -Nrup linux-2.6.9/mm/highmem.c linux/mm/highmem.c
--- linux-2.6.9/mm/highmem.c	2004-10-18 21:54:37.000000000 +0000
+++ linux/mm/highmem.c	2004-11-26 21:20:30.000000000 +0000
@@ -557,9 +557,8 @@ void set_page_address(struct page *page,
 		BUG_ON(list_empty(&page_address_pool));
 
 		spin_lock_irqsave(&pool_lock, flags);
-		pam = list_entry(page_address_pool.next,
+		pam = list_entry(list_del_head(&page_address_pool),
 				struct page_address_map, list);
-		list_del(&pam->list);
 		spin_unlock_irqrestore(&pool_lock, flags);
 
 		pam->page = page;
diff -Nrup linux-2.6.9/mm/hugetlb.c linux/mm/hugetlb.c
--- linux-2.6.9/mm/hugetlb.c	2004-10-18 21:54:37.000000000 +0000
+++ linux/mm/hugetlb.c	2004-11-26 21:27:08.000000000 +0000
@@ -39,9 +39,8 @@ static struct page *dequeue_huge_page(vo
 	}
 	if (nid >= 0 && nid < MAX_NUMNODES &&
 	    !list_empty(&hugepage_freelists[nid])) {
-		page = list_entry(hugepage_freelists[nid].next,
+		page = list_entry(list_del_head(&hugepage_freelists[nid]),
 				  struct page, lru);
-		list_del(&page->lru);
 		free_huge_pages--;
 		free_huge_pages_node[nid]--;
 	}
diff -Nrup linux-2.6.9/mm/page_alloc.c linux/mm/page_alloc.c
--- linux-2.6.9/mm/page_alloc.c	2004-10-18 21:53:11.000000000 +0000
+++ linux/mm/page_alloc.c	2004-11-26 21:21:48.000000000 +0000
@@ -375,8 +375,7 @@ static struct page *__rmqueue(struct zon
 		if (list_empty(&area->free_list))
 			continue;
 
-		page = list_entry(area->free_list.next, struct page, lru);
-		list_del(&page->lru);
+		page = list_entry(list_del_head(&area->free_list), struct page, lru);
 		index = page - zone->zone_mem_map;
 		if (current_order != MAX_ORDER-1)
 			MARK_USED(index, current_order, area);
@@ -554,8 +553,7 @@ buffered_rmqueue(struct zone *zone, int 
 			pcp->count += rmqueue_bulk(zone, 0,
 						pcp->batch, &pcp->list);
 		if (pcp->count) {
-			page = list_entry(pcp->list.next, struct page, lru);
-			list_del(&page->lru);
+			page = list_entry(list_del_head(&pcp->list), struct page, lru);
 			pcp->count--;
 		}
 		local_irq_restore(flags);
diff -Nrup linux-2.6.9/mm/pdflush.c linux/mm/pdflush.c
--- linux-2.6.9/mm/pdflush.c	2004-10-18 21:55:36.000000000 +0000
+++ linux/mm/pdflush.c	2004-11-26 23:10:30.000000000 +0000
@@ -201,8 +201,8 @@ int pdflush_operation(void (*fn)(unsigne
 	} else {
 		struct pdflush_work *pdf;
 
-		pdf = list_entry(pdflush_list.next, struct pdflush_work, list);
-		list_del_init(&pdf->list);
+		pdf = list_entry(list_del_head_init(&pdflush_list), 
+				 struct pdflush_work, list);
 		if (list_empty(&pdflush_list))
 			last_empty_jifs = jiffies;
 		pdf->fn = fn;
diff -Nrup linux-2.6.9/mm/swapfile.c linux/mm/swapfile.c
--- linux-2.6.9/mm/swapfile.c	2004-10-18 21:53:43.000000000 +0000
+++ linux/mm/swapfile.c	2004-11-26 21:27:36.000000000 +0000
@@ -890,9 +890,8 @@ static void destroy_swap_extents(struct 
 	while (!list_empty(&sis->extent_list)) {
 		struct swap_extent *se;
 
-		se = list_entry(sis->extent_list.next,
+		se = list_entry(list_del_head(&sis->extent_list),
 				struct swap_extent, list);
-		list_del(&se->list);
 		kfree(se);
 	}
 	sis->nr_extents = 0;
diff -Nrup linux-2.6.9/net/core/dev.c linux/net/core/dev.c
--- linux-2.6.9/net/core/dev.c	2004-10-18 21:54:08.000000000 +0000
+++ linux/net/core/dev.c	2004-11-27 00:09:18.706494032 +0000
@@ -1885,12 +1885,12 @@ static void net_rx_action(struct softirq
 
 		local_irq_enable();
 
-		dev = list_entry(queue->poll_list.next,
-				 struct net_device, poll_list);
+		dev = list_entry(list_del_head_init(&queue->poll_list), 
+				 struct net_device, 
+				 poll_list);
 
 		if (dev->quota <= 0 || dev->poll(dev, &budget)) {
 			local_irq_disable();
-			list_del(&dev->poll_list);
 			list_add_tail(&dev->poll_list, &queue->poll_list);
 			if (dev->quota < 0)
 				dev->quota += dev->weight;
@@ -3009,9 +3009,9 @@ void netdev_run_todo(void)
 	spin_unlock(&net_todo_list_lock);
 		
 	while (!list_empty(&list)) {
-		struct net_device *dev
-			= list_entry(list.next, struct net_device, todo_list);
-		list_del(&dev->todo_list);
+		struct net_device *dev = list_entry(list_del_head(&list), 
+						    struct net_device, 
+						    todo_list);
 
 		switch(dev->reg_state) {
 		case NETREG_REGISTERING:

             reply	other threads:[~2004-11-27  0:46 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-11-27  0:38 Tobias DiPasquale [this message]
2004-11-27  0:13 ` [PATCH][REVISED] add list_del_head[_init] functions Arnaldo Carvalho de Melo
2004-11-27  2:02   ` Tobias DiPasquale

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=876ef97a0411261638988b9aa@mail.gmail.com \
    --to=codeslinger@gmail.com \
    --cc=akpm@digeo.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=torvalds@osdl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.