The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* Question about memory mapping mechanism
@ 2007-03-08 13:16 Martin Drab
  2007-03-08 14:20 ` Carsten Otte
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Martin Drab @ 2007-03-08 13:16 UTC (permalink / raw)
  To: hugh; +Cc: Linux Kernel Mailing List

Hi,

I'm writing a driver for a sampling device that is constantly delivering a 
relatively high amount of data (about 16 MB/s) and I need to deliver the 
data to the user-space ASAP. To prevent data loss I create a queue of 
buffers (consisting of few pages each) which are more or less directly 
filled by the device and then mapped to the user-space via mmap().

The thing is that I'd like to prevent kernel to swap these pages out, 
because then I may loose some data when they are not available in time 
for the next round.

My original idea (that used to work in the past) was to allocate the 
buffers using __get_free_pages(), then pin the pages down by setting their 
PG_reserved bit in the page flags before using them. And then set the 
VM_RESERVED flag of the appropriate VMA when mmap() is called for these 
pages that are then mapped using nopage() mechanism.

But this way no longer seems to work correctly, it kind of works, but I'm 
getting following messages for each mmapped page upon munmap() call:

--------------------------------------
[19172.939248] Bad page state in process 'dtrtest'
[19172.939249] page:ffff81000160a978 flags:0x001a000000000404 mapping:0000000000000000 mapcount:0 count:0
[19172.939251] Trying to fix it up, but a reboot is needed
[19172.939253] Backtrace:
[19172.939256]
[19172.939257] Call Trace:
[19172.939273]  [<ffffffff802adc37>] bad_page+0x57/0x90
[19172.939280]  [<ffffffff8020b92f>] free_hot_cold_page+0x7f/0x180
[19172.939287]  [<ffffffff80207a90>] unmap_vmas+0x450/0x750
[19172.939308]  [<ffffffff80212867>] unmap_region+0xb7/0x160
[19172.939318]  [<ffffffff80211918>] do_munmap+0x238/0x2f0
[19172.939325]  [<ffffffff802656c5>] __down_write_nested+0x35/0xf0
[19172.939334]  [<ffffffff80215ffd>] sys_munmap+0x4d/0x80
[19172.939341]  [<ffffffff8025f11e>] system_call+0x7e/0x83
-------------------------------

Aparently due to the PG_reserved bit set.

So my question is: What is currently a proper way to do all this cleanly?

Thanks,
Martin

^ permalink raw reply	[flat|nested] 13+ messages in thread
[parent not found: <fa.8Fy6n0Le4Y2mDfeEy936/5bbJHA@ifi.uio.no>]

end of thread, other threads:[~2007-05-29 17:58 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-08 13:16 Question about memory mapping mechanism Martin Drab
2007-03-08 14:20 ` Carsten Otte
     [not found] ` <5c77e7070703080617r63cbccfevd2c6d678f16c2b03@mail.gmail.com>
2007-03-08 21:36   ` Martin Drab
2007-03-09  0:07     ` Martin Drab
2007-03-09  1:31       ` Martin Drab
2007-03-13 20:49         ` Hugh Dickins
2007-05-21 18:39           ` Martin Drab
2007-05-29 17:58             ` Hugh Dickins
2007-03-08 23:21 ` Martin Drab
2007-03-09  0:27 ` Jeremy Fitzhardinge
2007-03-09  0:38   ` Martin Drab
     [not found] <fa.8Fy6n0Le4Y2mDfeEy936/5bbJHA@ifi.uio.no>
2007-03-09  0:35 ` Robert Hancock
2007-03-09  0:52   ` Martin Drab

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