[PATCH] restructure direct-io to suit bio_add_page
The direct IO code was initially designed to allocate a known-sized BIO, to fill it with pages and to then send it off. Then along came bio_add_page(). Really, it broke direct-io.c - it meant that the direct-IO BIO assembly code no longer had a-priori knowledge of whether a page would fit into the current BIO. Our attempts to rework the initial design to play well with bio_add_page() really weren't adequate. The code was getting more and more twisty and we kept finding corner-cases which failed. So this patch redesigns the BIO assembly and submission path of the direct-IO code so that it better suits the bio_add_page() semantics. It introduces another layer in the assembly phase: the 'cur_page' which is cached in the dio structure. The function which walks the file mapping do_direct_IO() simply emits a sequence of (page,offset,len,sector) quads into the next layer down - submit_page_section(). submit_page_section() is responsible for looking for a merge of the new quad against the previous page section (same page). If no merge is possible it passes the currently-cached page down to the next level, dio_send_cur_page(). dio_send_cur_page() will try to add the current page to the current BIO. If that fails, the current BIO is submitted for IO and we open a new one. So it's all nicely layered. The assembly of sections-of-page into the current page closely mirrors the assembly of sections-of-BIO into the current BIO. At both of these levels everything is done in a "deferred" manner: try to merge a new request onto the currently-cached one. If that fails then send the currently-cached request and then cache this one instead. Some variables have been renamed to more closely represent their usage. Some thought has been put into ownership of the various state variables within `struct dio'. We were updating and inspecting these in various places in a rather hard-to-follow manner. So things have been reworked so that particular functions "own" particular parts of the dio structure. Violators have been exterminated and commentary has been added to describe this ownership. The handling of file holes has been simplified. As a consequence of all this, the code is clearer and simpler than it used to be, and it now passes the modified-for-O_DIRECT fsx-linux testing again.
Showing
This diff is collapsed.
Please register or sign in to comment