From: Jens Axboe <jens.axboe@oracle.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Ingo Molnar <mingo@elte.hu>,
linux-kernel@vger.kernel.org, Alan.Brunelle@hp.com,
arjan@linux.intel.com, dgc@sgi.com, npiggin@suse.de,
Andrew Morton <akpm@linux-foundation.org>,
Vegard Nossum <vegard.nossum@gmail.com>,
Pekka Enberg <penberg@gmail.com>
Subject: Re: [patch] block layer: kmemcheck fixes
Date: Fri, 8 Feb 2008 12:38:49 +0100 [thread overview]
Message-ID: <20080208113847.GI15220@kernel.dk> (raw)
In-Reply-To: <alpine.LFD.1.00.0802070940230.2883@woody.linux-foundation.org>
On Thu, Feb 07 2008, Linus Torvalds wrote:
>
>
> On Thu, 7 Feb 2008, Ingo Molnar wrote:
> > INIT_HLIST_NODE(&rq->hash);
> > RB_CLEAR_NODE(&rq->rb_node);
> > - rq->ioprio = 0;
> > - rq->buffer = NULL;
> > - rq->ref_count = 1;
> > - rq->q = q;
> > - rq->special = NULL;
> > - rq->data_len = 0;
> > - rq->data = NULL;
> > - rq->nr_phys_segments = 0;
> > - rq->sense = NULL;
> > - rq->end_io = NULL;
> > - rq->end_io_data = NULL;
> > - rq->completion_data = NULL;
> > - rq->next_rq = NULL;
> > + rq->completion_data = NULL;
> > + /* rq->elevator_private */
> > + /* rq->elevator_private2 */
> > + /* rq->rq_disk */
> > + /* rq->start_time */
> > + rq->nr_phys_segments = 0;
> > + /* rq->nr_hw_segments */
> > + rq->ioprio = 0;
> > + rq->special = NULL;
> > + rq->buffer = NULL;
> ...
>
> Can we please just stop doing these one-by-one assignments, and just do
> something like
>
> memset(rq, 0, sizeof(*rq));
> rq->q = q;
> rq->ref_count = 1;
> INIT_HLIST_NODE(&rq->hash);
> RB_CLEAR_NODE(&rq->rb_node);
>
> instead?
>
> The memset() is likely faster and smaller than one-by-one assignments
> anyway, even if the one-by-ones can avoid initializing some field or there
> ends up being a double initialization..
Looked into this approach and we can't currently do that here, since
some members of the request are being set from blk_alloc_request() and
then from the io scheduler attaching private data to it. So we have to
preserve ->cmd_flags and ->elevator_private and ->elevator_private2 at
least. Now rq_init() is also used for stored requests, so we cannot just
rely on clearing at allocation time.
So I'd prefer being a little conservative here. The below reorders
rq_init() a bit and clears some more members to be on the safer side,
adding comments to why we cannot memset and an associated comment in
blkdev.h.
diff --git a/block/blk-core.c b/block/blk-core.c
index 4afb39c..fba4ca7 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -102,27 +102,38 @@ struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev)
}
EXPORT_SYMBOL(blk_get_backing_dev_info);
+/*
+ * We can't just memset() the structure, since the allocation path
+ * already stored some information in the request.
+ */
void rq_init(struct request_queue *q, struct request *rq)
{
INIT_LIST_HEAD(&rq->queuelist);
INIT_LIST_HEAD(&rq->donelist);
-
- rq->errors = 0;
+ rq->q = q;
+ rq->sector = rq->hard_sector = (sector_t) -1;
+ rq->nr_sectors = rq->hard_nr_sectors = 0;
+ rq->current_nr_sectors = rq->hard_cur_sectors = 0;
rq->bio = rq->biotail = NULL;
INIT_HLIST_NODE(&rq->hash);
RB_CLEAR_NODE(&rq->rb_node);
+ rq->rq_disk = NULL;
+ rq->nr_phys_segments = 0;
+ rq->nr_hw_segments = 0;
rq->ioprio = 0;
+ rq->special = NULL;
rq->buffer = NULL;
+ rq->tag = -1;
+ rq->errors = 0;
rq->ref_count = 1;
- rq->q = q;
- rq->special = NULL;
+ rq->cmd_len = 0;
+ memset(rq->cmd, 0, sizeof(rq->cmd));
rq->data_len = 0;
+ rq->sense_len = 0;
rq->data = NULL;
- rq->nr_phys_segments = 0;
rq->sense = NULL;
rq->end_io = NULL;
rq->end_io_data = NULL;
- rq->completion_data = NULL;
rq->next_rq = NULL;
}
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 90392a9..e1888cc 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -137,7 +137,9 @@ enum rq_flag_bits {
#define BLK_MAX_CDB 16
/*
- * try to put the fields that are referenced together in the same cacheline
+ * try to put the fields that are referenced together in the same cacheline.
+ * if you modify this structure, be sure to check block/blk-core.c:rq_init()
+ * as well!
*/
struct request {
struct list_head queuelist;
--
Jens Axboe
next prev parent reply other threads:[~2008-02-08 11:39 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-07 9:18 [PATCH 0/8] IO queuing and complete affinity Jens Axboe
2008-02-07 9:18 ` [PATCH 1/8] block: split softirq handling into blk-softirq.c Jens Axboe
2008-02-07 9:18 ` [PATCH 2/8] Add interface for queuing work on a specific CPU Jens Axboe
2008-02-07 9:45 ` Andrew Morton
2008-02-07 9:49 ` Jens Axboe
2008-02-07 17:44 ` Harvey Harrison
2008-02-11 10:51 ` Oleg Nesterov
2008-02-07 9:19 ` [PATCH 3/8] block: make kblockd_schedule_work() take the queue as parameter Jens Axboe
2008-02-07 9:19 ` [PATCH 4/8] x86: add support for remotely triggering the block softirq Jens Axboe
2008-02-07 10:07 ` Ingo Molnar
2008-02-07 10:17 ` Jens Axboe
2008-02-07 10:25 ` Ingo Molnar
2008-02-07 10:31 ` Jens Axboe
2008-02-07 10:38 ` Ingo Molnar
2008-02-07 14:18 ` Jens Axboe
2008-02-07 10:49 ` [patch] block layer: kmemcheck fixes Ingo Molnar
2008-02-07 17:42 ` Linus Torvalds
2008-02-07 17:55 ` Jens Axboe
2008-02-07 19:31 ` Ingo Molnar
2008-02-07 20:06 ` Jens Axboe
2008-02-08 1:22 ` David Miller
2008-02-08 1:28 ` Linus Torvalds
2008-02-08 15:09 ` Arjan van de Ven
2008-02-08 22:44 ` Nick Piggin
2008-02-08 22:56 ` Arjan van de Ven
2008-02-08 23:58 ` Nick Piggin
2008-02-08 11:38 ` Jens Axboe [this message]
2008-02-07 9:19 ` [PATCH 5/8] x86-64: add support for remotely triggering the block softirq Jens Axboe
2008-02-07 9:19 ` [PATCH 6/8] ia64: " Jens Axboe
2008-02-07 9:19 ` [PATCH 7/8] kernel: add generic softirq interface for triggering a remote softirq Jens Axboe
2008-02-07 9:19 ` [PATCH 8/8] block: add test code for testing CPU affinity Jens Axboe
2008-02-07 15:16 ` [PATCH 0/8] IO queuing and complete affinity Alan D. Brunelle
2008-02-07 18:25 ` IO queuing and complete affinity with threads (was Re: [PATCH 0/8] IO queuing and complete affinity) Jens Axboe
2008-02-07 20:40 ` Alan D. Brunelle
2008-02-08 7:38 ` Nick Piggin
2008-02-08 7:47 ` Jens Axboe
2008-02-08 7:53 ` Nick Piggin
2008-02-08 7:59 ` Jens Axboe
2008-02-08 8:12 ` Nick Piggin
2008-02-08 8:24 ` Jens Axboe
2008-02-08 8:33 ` Nick Piggin
2008-02-11 5:22 ` David Chinner
2008-02-12 8:28 ` Jeremy Higdon
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=20080208113847.GI15220@kernel.dk \
--to=jens.axboe@oracle.com \
--cc=Alan.Brunelle@hp.com \
--cc=akpm@linux-foundation.org \
--cc=arjan@linux.intel.com \
--cc=dgc@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=npiggin@suse.de \
--cc=penberg@gmail.com \
--cc=torvalds@linux-foundation.org \
--cc=vegard.nossum@gmail.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 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.