linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org
Cc: Daniel Phillips <phillips@google.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: [RFC][PATCH 9/9] deadlock prevention for NBD
Date: Tue, 08 Aug 2006 21:34:57 +0200	[thread overview]
Message-ID: <20060808193457.1396.94628.sendpatchset@lappy> (raw)
In-Reply-To: <20060808193325.1396.58813.sendpatchset@lappy>


Use sk_set_memalloc() on the nbd socket.

Limit each request to 1 page, so that the request throttling also limits the
number of in-flight pages and force the IO scheduler to NOOP as anything else
doesn't make sense anyway.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Daniel Phillips <phillips@google.com>

---
 block/elevator.c       |    5 +++++
 block/ll_rw_blk.c      |   12 ++++++++++--
 drivers/block/nbd.c    |   11 ++++++++++-
 include/linux/blkdev.h |    9 +++++++++
 4 files changed, 34 insertions(+), 3 deletions(-)

Index: linux-2.6/block/ll_rw_blk.c
===================================================================
--- linux-2.6.orig/block/ll_rw_blk.c
+++ linux-2.6/block/ll_rw_blk.c
@@ -1899,6 +1899,14 @@ EXPORT_SYMBOL(blk_init_queue);
 request_queue_t *
 blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id)
 {
+	return blk_init_queue_node_elv(rfn, lock, node_id, NULL);
+}
+EXPORT_SYMBOL(blk_init_queue_node);
+
+request_queue_t *
+blk_init_queue_node_elv(request_fn_proc *rfn, spinlock_t *lock, int node_id,
+		char *elv_name)
+{
 	request_queue_t *q = blk_alloc_queue_node(GFP_KERNEL, node_id);
 
 	if (!q)
@@ -1939,7 +1947,7 @@ blk_init_queue_node(request_fn_proc *rfn
 	/*
 	 * all done
 	 */
-	if (!elevator_init(q, NULL)) {
+	if (!elevator_init(q, elv_name)) {
 		blk_queue_congestion_threshold(q);
 		return q;
 	}
@@ -1947,7 +1955,7 @@ blk_init_queue_node(request_fn_proc *rfn
 	blk_put_queue(q);
 	return NULL;
 }
-EXPORT_SYMBOL(blk_init_queue_node);
+EXPORT_SYMBOL(blk_init_queue_node_elv);
 
 int blk_get_queue(request_queue_t *q)
 {
Index: linux-2.6/drivers/block/nbd.c
===================================================================
--- linux-2.6.orig/drivers/block/nbd.c
+++ linux-2.6/drivers/block/nbd.c
@@ -361,6 +361,10 @@ static void nbd_do_it(struct nbd_device 
 
 	BUG_ON(lo->magic != LO_MAGIC);
 
+	if (sk_set_memalloc(lo->sock->sk))
+		printk(KERN_WARNING
+				"failed to set SO_MEMALLOC on NBD socket\n");
+
 	while ((req = nbd_read_stat(lo)) != NULL)
 		nbd_end_request(req);
 	return;
@@ -628,11 +632,16 @@ static int __init nbd_init(void)
 		 * every gendisk to have its very own request_queue struct.
 		 * These structs are big so we dynamically allocate them.
 		 */
-		disk->queue = blk_init_queue(do_nbd_request, &nbd_lock);
+		disk->queue = blk_init_queue_node_elv(do_nbd_request,
+				&nbd_lock, -1, "noop");
 		if (!disk->queue) {
 			put_disk(disk);
 			goto out;
 		}
+		blk_queue_pin_elevator(disk->queue);
+		blk_queue_max_segment_size(disk->queue, PAGE_SIZE);
+		blk_queue_max_hw_segments(disk->queue, 1);
+		blk_queue_max_phys_segments(disk->queue, 1);
 	}
 
 	if (register_blkdev(NBD_MAJOR, "nbd")) {
Index: linux-2.6/include/linux/blkdev.h
===================================================================
--- linux-2.6.orig/include/linux/blkdev.h
+++ linux-2.6/include/linux/blkdev.h
@@ -444,6 +444,12 @@ struct request_queue
 #define QUEUE_FLAG_REENTER	6	/* Re-entrancy avoidance */
 #define QUEUE_FLAG_PLUGGED	7	/* queue is plugged */
 #define QUEUE_FLAG_ELVSWITCH	8	/* don't use elevator, just do FIFO */
+#define QUEUE_FLAG_ELVPINNED	9	/* pin the current elevator */
+
+static inline void blk_queue_pin_elevator(struct request_queue *q)
+{
+	set_bit(QUEUE_FLAG_ELVPINNED, &q->queue_flags);
+}
 
 enum {
 	/*
@@ -696,6 +702,9 @@ static inline void elv_dispatch_add_tail
 /*
  * Access functions for manipulating queue properties
  */
+extern request_queue_t *blk_init_queue_node_elv(request_fn_proc *rfn,
+					spinlock_t *lock, int node_id,
+					char *elv_name);
 extern request_queue_t *blk_init_queue_node(request_fn_proc *rfn,
 					spinlock_t *lock, int node_id);
 extern request_queue_t *blk_init_queue(request_fn_proc *, spinlock_t *);
Index: linux-2.6/block/elevator.c
===================================================================
--- linux-2.6.orig/block/elevator.c
+++ linux-2.6/block/elevator.c
@@ -861,6 +861,11 @@ ssize_t elv_iosched_store(request_queue_
 	size_t len;
 	struct elevator_type *e;
 
+	if (test_bit(QUEUE_FLAG_ELVPINNED, &q->queue_flags)) {
+		printk(KERN_ERR "elevator: cannot switch elevator, pinned\n");
+		return count;
+	}
+
 	elevator_name[sizeof(elevator_name) - 1] = '\0';
 	strncpy(elevator_name, name, sizeof(elevator_name) - 1);
 	len = strlen(elevator_name);

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  parent reply	other threads:[~2006-08-08 19:34 UTC|newest]

Thread overview: 140+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-08 19:33 [RFC][PATCH 0/9] Network receive " Peter Zijlstra
2006-08-08 19:33 ` [RFC][PATCH 1/9] pfn_to_kaddr() for UML Peter Zijlstra
2006-08-08 19:33 ` [RFC][PATCH 2/9] deadlock prevention core Peter Zijlstra
2006-08-08 20:57   ` Stephen Hemminger
2006-08-08 21:05     ` Peter Zijlstra
2006-08-09  1:33     ` Daniel Phillips
2006-08-09  1:38       ` David Miller, Daniel Phillips
2006-08-08 21:17   ` Thomas Graf
2006-08-09  1:34     ` Daniel Phillips
2006-08-09  1:39       ` David Miller, Daniel Phillips
2006-08-09  5:47         ` Daniel Phillips
2006-08-09 13:19           ` Thomas Graf
2006-08-09 14:07             ` Peter Zijlstra
2006-08-09 16:18               ` Thomas Graf
2006-08-09 16:19                 ` Peter Zijlstra
2006-08-10  0:01                   ` David Miller, Peter Zijlstra
2006-08-09 23:58               ` David Miller, Peter Zijlstra
2006-08-10  6:25                 ` Peter Zijlstra
2006-08-11  4:24                 ` Stephen Hemminger
2006-08-13 21:22                 ` Daniel Phillips
2006-08-13 23:49                   ` David Miller, Daniel Phillips
2006-08-14  1:15                     ` Daniel Phillips
2006-08-11  2:37     ` Rik van Riel
2006-08-13 22:05       ` Daniel Phillips
2006-08-13 23:55         ` David Miller, Daniel Phillips
2006-08-14  1:31           ` Daniel Phillips
2006-08-14  1:53             ` Andrew Morton
2006-08-14  4:40               ` Peter Zijlstra
2006-08-14  4:58                 ` Andrew Morton
2006-08-14  5:03                   ` Peter Zijlstra
2006-08-14  5:22                     ` Andrew Morton
2006-08-14  6:45                       ` Peter Zijlstra
2006-08-14  7:07                         ` Andrew Morton
2006-08-14  8:15                           ` Peter Zijlstra
2006-08-14  8:25                             ` Evgeniy Polyakov
2006-08-14  8:35                               ` Peter Zijlstra
2006-08-14  8:33                           ` David Miller, Andrew Morton
2006-08-17  4:27                           ` Daniel Phillips
2006-08-14  7:17                         ` Neil Brown
2006-08-14  7:31                           ` Evgeniy Polyakov
2006-08-17  3:58                   ` Daniel Phillips
2006-08-17  5:57                     ` Andrew Morton
2006-08-17 23:53                       ` Daniel Phillips
2006-08-18  0:24                         ` Rik van Riel
2006-08-18  0:35                         ` Daniel Phillips
2006-08-18  1:14                         ` Neil Brown
2006-08-18  6:05                         ` Andrew Morton
2006-08-18 21:22                           ` Daniel Phillips
2006-08-18 22:34                             ` Andrew Morton
2006-08-18 23:44                               ` Daniel Phillips
2006-08-19  2:44                                 ` Andrew Morton
2006-08-19  4:14                                   ` Network receive stall avoidance (was [PATCH 2/9] deadlock prevention core) Daniel Phillips
2006-08-19  7:28                                     ` Andrew Morton
2006-08-19 15:06                                   ` [RFC][PATCH 2/9] deadlock prevention core Rik van Riel
2006-08-20  1:33                                     ` Andre Tomt
2006-08-19 16:53                                   ` Ray Lee
2006-08-21 13:27                                   ` Philip R. Auld
2006-08-25 10:47                                     ` Pavel Machek
2006-08-21 13:38                                 ` Jens Axboe
2006-08-08 22:10   ` David Miller
2006-08-09  1:35     ` Daniel Phillips
2006-08-09  1:41       ` David Miller, Daniel Phillips
2006-08-09  5:44         ` Daniel Phillips
2006-08-09  7:00           ` Peter Zijlstra
     [not found]   ` <42414.81.207.0.53.1155080443.squirrel@81.207.0.53>
2006-08-09  0:25     ` Daniel Phillips
2006-08-09 12:02       ` Indan Zupancic
2006-08-09 12:54         ` Peter Zijlstra
2006-08-09 13:48           ` Indan Zupancic
2006-08-09 14:00             ` Peter Zijlstra
2006-08-09 18:34               ` Indan Zupancic
2006-08-09 19:45                 ` Peter Zijlstra
2006-08-09 20:19                   ` Peter Zijlstra
2006-08-10  1:21                   ` Indan Zupancic
2006-08-09 16:05   ` -v2 " Peter Zijlstra
2006-08-08 19:33 ` [RFC][PATCH 3/9] e1000 driver conversion Peter Zijlstra
2006-08-08 20:50   ` Auke Kok
2006-08-08 20:59     ` Peter Zijlstra
2006-08-08 22:32     ` David Miller, Auke Kok
2006-08-08 22:42       ` Auke Kok
2006-08-08 19:34 ` [RFC][PATCH 4/9] e100 " Peter Zijlstra
2006-08-08 20:13   ` Auke Kok
2006-08-08 20:18     ` Peter Zijlstra
2006-08-08 19:34 ` [RFC][PATCH 5/9] r8169 " Peter Zijlstra
2006-08-08 19:34 ` [RFC][PATCH 6/9] tg3 " Peter Zijlstra
2006-08-08 19:34 ` [RFC][PATCH 7/9] UML eth " Peter Zijlstra
2006-08-08 19:34 ` [RFC][PATCH 8/9] 3c59x " Peter Zijlstra
2006-08-08 23:07   ` Jeff Garzik
2006-08-09  5:51     ` Daniel Phillips
2006-08-09  5:55       ` David Miller, Daniel Phillips
2006-08-09  6:30         ` Jeff Garzik
2006-08-09  7:03           ` Peter Zijlstra
2006-08-09  7:20             ` Jeff Garzik
2006-08-13 19:38         ` Daniel Phillips
2006-08-13 19:53           ` Jeff Garzik
2006-08-08 19:34 ` Peter Zijlstra [this message]
2006-08-09  5:46 ` [RFC][PATCH 0/9] Network receive deadlock prevention for NBD Evgeniy Polyakov
2006-08-09  5:52   ` Daniel Phillips
2006-08-09  5:56     ` David Miller, Daniel Phillips
2006-08-09  5:53   ` David Miller, Evgeniy Polyakov
2006-08-09  5:55     ` Evgeniy Polyakov
2006-08-09 12:37   ` Peter Zijlstra
2006-08-09 13:07     ` Evgeniy Polyakov
2006-08-09 13:32       ` Peter Zijlstra
2006-08-09 19:29         ` Evgeniy Polyakov
2006-08-09 23:54         ` David Miller, Peter Zijlstra
2006-08-10  6:06           ` Peter Zijlstra
2006-08-13 20:16             ` Daniel Phillips
2006-08-14  5:13               ` Evgeniy Polyakov
2006-08-14  6:45                 ` Peter Zijlstra
2006-08-14  6:54                   ` Evgeniy Polyakov
2006-08-17  4:49                     ` Daniel Phillips
2006-08-17  4:48                 ` Daniel Phillips
2006-08-17  5:36                   ` Evgeniy Polyakov
2006-08-17 18:01                     ` Daniel Phillips
2006-08-17 18:42                       ` Evgeniy Polyakov
2006-08-17 19:15                         ` Peter Zijlstra
2006-08-17 19:48                           ` Evgeniy Polyakov
2006-08-17 23:24                             ` Daniel Phillips
2006-08-18  7:16                               ` Evgeniy Polyakov
2006-08-12  3:42         ` Rik van Riel
2006-08-12  8:47           ` Evgeniy Polyakov
2006-08-12  9:19             ` Peter Zijlstra
2006-08-12  9:37               ` Evgeniy Polyakov
2006-08-12 10:18                 ` Peter Zijlstra
2006-08-12 10:42                   ` Evgeniy Polyakov
2006-08-12 10:51                     ` Evgeniy Polyakov
2006-08-12 11:40                     ` Peter Zijlstra
2006-08-12 11:53                       ` Evgeniy Polyakov
2006-08-13  0:46                   ` David Miller, Peter Zijlstra
2006-08-13  1:11                     ` Rik van Riel
2006-08-12 14:40                 ` Rik van Riel
2006-08-12 14:49                   ` Evgeniy Polyakov
2006-08-12 14:56                     ` Rik van Riel
2006-08-12 15:08                       ` Evgeniy Polyakov
2006-08-12 15:22                         ` Peter Zijlstra
2006-08-14  0:56                         ` Daniel Phillips
2006-08-13  0:46                 ` David Miller, Evgeniy Polyakov
2006-08-13  9:06                   ` Evgeniy Polyakov
2006-08-13  9:52                     ` Evgeniy Polyakov
2006-08-15 19:17 ` Pavel Machek

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=20060808193457.1396.94628.sendpatchset@lappy \
    --to=a.p.zijlstra@chello.nl \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=netdev@vger.kernel.org \
    --cc=phillips@google.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox