* buffer head read/write
@ 2002-12-09 16:25 David Chow
2002-12-10 0:28 ` Bryan Henderson
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: David Chow @ 2002-12-09 16:25 UTC (permalink / raw)
To: linux-fsdevel
Hi all,
Is there a way to make sure I submit a buffer head read/write and make
sure it is commited immediately? (sychronized) . Please give direction
on examples in the kernel code? Thanks.
regards,
David Chow
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: buffer head read/write 2002-12-09 16:25 buffer head read/write David Chow @ 2002-12-10 0:28 ` Bryan Henderson 2002-12-10 0:36 ` Neil Brown 2002-12-10 20:13 ` Andrew Morton 2 siblings, 0 replies; 7+ messages in thread From: Bryan Henderson @ 2002-12-10 0:28 UTC (permalink / raw) To: David Chow; +Cc: linux-fsdevel >Is there a way to make sure I submit a buffer head read/write and make >sure it is commited immediately? (sychronized) ll_rw_block() to submit it, followed by wait_on_buffer() to wait for the I/O to complete. >Please give direction on examples in the kernel code? Thanks. I can't think of an example of where those are called together, but if you search the fs/ directory for those, you should find plenty of examples of using them individually. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: buffer head read/write 2002-12-09 16:25 buffer head read/write David Chow 2002-12-10 0:28 ` Bryan Henderson @ 2002-12-10 0:36 ` Neil Brown 2002-12-10 14:56 ` David Chow 2002-12-10 20:13 ` Andrew Morton 2 siblings, 1 reply; 7+ messages in thread From: Neil Brown @ 2002-12-10 0:36 UTC (permalink / raw) To: David Chow; +Cc: linux-fsdevel On Tuesday December 10, davidchow@shaolinmicro.com wrote: > Hi all, > > Is there a way to make sure I submit a buffer head read/write and make > sure it is commited immediately? (sychronized) . Please give direction > on examples in the kernel code? Thanks. md does (or will) read/write it's super-blocks that way. In 2.5, see drivers/md/md.c:sync_page_io In 2.4, see http://cgi.cse.unsw.edu.au/~neilb/patches/linux-stable/2.4.leading/2002-12-09:01/005MDSyncIo ... I haven't submitted it yet. NeilBrown ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: buffer head read/write 2002-12-10 0:36 ` Neil Brown @ 2002-12-10 14:56 ` David Chow 2002-12-11 0:19 ` Bryan Henderson 0 siblings, 1 reply; 7+ messages in thread From: David Chow @ 2002-12-10 14:56 UTC (permalink / raw) To: Neil Brown; +Cc: linux-fsdevel Neil Brown wrote: >On Tuesday December 10, davidchow@shaolinmicro.com wrote: > > >>Hi all, >> >>Is there a way to make sure I submit a buffer head read/write and make >>sure it is commited immediately? (sychronized) . Please give direction >>on examples in the kernel code? Thanks. >> >> > >md does (or will) read/write it's super-blocks that way. >In 2.5, see drivers/md/md.c:sync_page_io >In 2.4, see > http://cgi.cse.unsw.edu.au/~neilb/patches/linux-stable/2.4.leading/2002-12-09:01/005MDSyncIo > >... I haven't submitted it yet. > >NeilBrown > > Thanks to all who give suggestions. I know how to make a call to general_make_request() but wait for the buffer to complete which is too slow. If I am doing a continuous sychronous read/write (which I already have my own way of buffer management), can I put those "dirty buffers"/"non-up-to-date buffers" in the head of the buffer queue so that they get written by their respective handler immediately? I am not familiar with buffer cache so would like to seek advice on doing this. Is there anyway to lock a buffer and get its buffer_head request handler and call end_io() immediately? Thanks for advice. regards, David Chow ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: buffer head read/write 2002-12-10 14:56 ` David Chow @ 2002-12-11 0:19 ` Bryan Henderson 2002-12-11 14:31 ` David Chow 0 siblings, 1 reply; 7+ messages in thread From: Bryan Henderson @ 2002-12-11 0:19 UTC (permalink / raw) To: David Chow; +Cc: linux-fsdevel, Neil Brown >I know how to make a call to general_make_request() but >wait for the buffer to complete which is too slow. >If I am doing a continuous sychronous read/write ..., can I put those "dirty >buffers"/"non-up-to-date buffers" in the head of the buffer queue so >that they get written by their respective handler immediately? "immediately" in computer systems normally means "while I wait" rather than "before doing anything else." That's why you got a bunch of answers that weren't what you were looking for. What you want is a way to assign priority to a block I/O request, so that a particular one gets executed first regardless of other factors, like that it's a mile away from where the head is now or 100 other requests came in before it. There's no way to do priority in today's block I/O layer. Incidentally, this has nothing to do with the buffer cache. The queue in question is for all I/O to a block device; it is below the buffer cache. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: buffer head read/write 2002-12-11 0:19 ` Bryan Henderson @ 2002-12-11 14:31 ` David Chow 0 siblings, 0 replies; 7+ messages in thread From: David Chow @ 2002-12-11 14:31 UTC (permalink / raw) To: Bryan Henderson; +Cc: linux-fsdevel, Neil Brown OK, I think you know what I want, and you've just told me this is impossible, then the best I could do is try to execute the task as best as the CPU can. This is stolen from Neils md super block writing routing that he just gave me a few days ago and merged with wait_for_complettion. Does this code make sense? static int sync_buffer_io(kdev_t dev, unsigned long sector, int size, struct page *page, int rw) struct buffer_head bh; struct completion event; init_completion(&event); init_buffer(&bh, bh_complete, &event); bh.b_rdev = dev; bh.b_rsector = sector; bh.b_state = (1 << BH_Req) | (1 << BH_Mapped); bh.b_size = size; bh.b_page = page; bh.b_reqnext = NULL; bh.b_data = page_address(page); generic_make_request(rw, &bh); run_task_queue(&tq_disk); spin_lock_irq(even.wait.lock); if (!event.done) { DECLARE_WAITQUEUE(wait, current); wait.flags |= WQ_FLAG_EXCLUSIVE; __add_wait_queue_tail(event.wait, &wait); do { __set_current_state(TASK_UNINTERRUPTIBLE); spin_unlock_irq(event.wait.lock); run_task_queue(&tq_disk); spin_lock_irq(event.wait.lock); } while (!x->done); __remove_wait_queue(event.wait, &wait); } event.done--; spin_unlock_irq(&x->wait.lock); return test_bit(BH_Uptodate, &bh.b_state); } This is dedicate to run the task of tq_disk instead of just schedule() which doesn't know which task is going to run. Please comment. Thanks. regards, David Bryan Henderson wrote: > > > > >>I know how to make a call to general_make_request() but >>wait for the buffer to complete which is too slow. >>If I am doing a continuous sychronous read/write ..., can I put those >> >> >"dirty > > >>buffers"/"non-up-to-date buffers" in the head of the buffer queue so >>that they get written by their respective handler immediately? >> >> > >"immediately" in computer systems normally means "while I wait" rather than >"before doing anything else." That's why you got a bunch of answers that >weren't what you were looking for. > >What you want is a way to assign priority to a block I/O request, so that >a particular one gets executed first regardless of other factors, like >that it's a mile away from where the head is now or 100 other requests >came in before it. There's no way to do priority in today's block I/O >layer. > >Incidentally, this has nothing to do with the buffer cache. The queue in >question is for all I/O to a block device; it is below the buffer cache. > > -- ----------------------------------------------------------------------------- David Chow | Managing Director http://www.shaolinmicro.com ShaoLin Microsystems - Multiply Efficiency ----------------------------------------------------------------------------- ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: buffer head read/write 2002-12-09 16:25 buffer head read/write David Chow 2002-12-10 0:28 ` Bryan Henderson 2002-12-10 0:36 ` Neil Brown @ 2002-12-10 20:13 ` Andrew Morton 2 siblings, 0 replies; 7+ messages in thread From: Andrew Morton @ 2002-12-10 20:13 UTC (permalink / raw) To: David Chow; +Cc: linux-fsdevel David Chow wrote: > > Hi all, > > Is there a way to make sure I submit a buffer head read/write and make > sure it is commited immediately? (sychronized) . Please give direction > on examples in the kernel code? Thanks. grep wait_on_buffer fs/ext2/*.c - you'll see lots of examples. eg: mark_buffer_dirty(bh); if (sb->s_flags & MS_SYNCHRONOUS) { ll_rw_block (WRITE, 1, &bh); wait_on_buffer (bh); } ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2002-12-11 14:31 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2002-12-09 16:25 buffer head read/write David Chow 2002-12-10 0:28 ` Bryan Henderson 2002-12-10 0:36 ` Neil Brown 2002-12-10 14:56 ` David Chow 2002-12-11 0:19 ` Bryan Henderson 2002-12-11 14:31 ` David Chow 2002-12-10 20:13 ` Andrew Morton
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).