このことを考慮
ユーザープログラムのスレッド1:
buf = malloc(9000);
memset(buf, 0xee, 9000);
read(buf, 9000); //for example gives pages [part of 7, 8, 9, part of 10]
ユーザープログラムのスレッド2:
buf = malloc(9000); //for example gives pages [part of 4, 6, 5, part of 7]
memset(buf, 0xee, 9000);
read(buf, 9000);
ドライバーの読み取り:
get_user_pages();
//build dma sg list from pages
//...
//the platform demands a cachesync
for(all pages) {
dma_cache_wback_inv();
}
//start dma and wait for it to be done
//...
wait_event_interruptible_timeout(); //blocks calling thread until dma done
for(all pages) {
if(read) SetPageDirty();
page_cache_release();
}
7ページは両方の転送で使用されることに注意してください。これは大きな問題であり、データが不良になることがありました(0xeeは1つのbufの最後にあります)。明確にするために、2つの読み取りは異なるDMAチャネルで実行されるため、同時に実行できます。
私の解決策は、2つのドライバーDMAが同じページの一部を共有しないように、ユーザープログラムのバッファーをページアラインすることでした。
これに対する別の解決策があるのだろうか?また、なぜこれが大きな問題だったのか疑問に思います。