<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<br>
<br>
Quentin,<br>
<br>
I suspect that the pages are only maintained during the duration of an IO, then discarded.  I haven't dug in to the exact mechanics of it, but when caches are disabled, the key thing is no CACHING occurs, i.e., nothing can be read from the cache.  So, I assume,
 these pages you see are transiently present for purposes of performing the IO.  (The data from the disk has to go somewhere.)<br>
<br>
- Patrick<br>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> lustre-devel <lustre-devel-bounces@lists.lustre.org> on behalf of quentin.bouget@cea.fr <quentin.bouget@cea.fr><br>
<b>Sent:</b> Tuesday, December 13, 2016 4:02:06 AM<br>
<b>To:</b> lustre-devel@lists.lustre.org<br>
<b>Subject:</b> [lustre-devel] caching in Lustre</font>
<div> </div>
</div>
<div>
<p>Hi all,</p>
<p>I am currently trying to work out how Lustre behaves when both "read_cache" and "writethrough_cache" are disabled. What I particularly want to know is how does writing to the related proc files influence the cache policy?</p>
<p>To me (and perf_event reports it too on a 2.7 setup), the code always gets cache pages (using find_or_create_page() in "lustre/osd-ldiskfs/osd_io.c") even with both cache parameters set to 0.<br>
After that, if caching is disabled, a call to generic_error_remove_page() is issued on the pages that were allocated. This functions is described in the kernel sources like this:<br>
</p>
<pre><b><i>/*
 * Used to get rid of pages on hardware memory corruption.
 */
int generic_error_remove_page(struct adress_space *mapping, struct page *page)
</i></b></pre>
<p>This does not seem to be the "natural" call to use, but anyway, I can live with that.<br>
What really bothers me is that the behaviour of Lustre from this point looks exactly the same as if cache was enabled. I can't find a single branching point that handles things differently: pages are kmapped, written to/read from, kunmmaped... I am probably
 missing something, but I can't figure out what. Could someone please point me in the right direction?</p>
<p>The functions I find the most relevant to study are:<br>
<font size="-1">"lustre/ofd/ofd_io.c":</font><br>
    ofd_preprw() -> ofd_preprw_read() / ofd_preprw_write()</p>
<p>their counterparts:<br>
<font size="-1">"lustre/ofd/ofd_io.c":</font><br>
    ofd_commitrw() -> ofd_commitrw_read() / ofd_commitrw_write()</p>
<p>the handlers of the proc files "/proc/fs/lustre/obdfilter/*/{read,writethrough}_cache_enable":<br>
<font size="-1">"lustre/osd-ldiskfs/osd_lproc.c":</font><br>
    ldiskfs_osd_cache_seq_write(), ldiskfs_osd_wcache_seq_write()</p>
<p>and the only places that use the variables set by the proc files (where generic_error_remove_page() is used):<br>
<font size="-1">"lustre/osd-ldiskfs/osd_io.c":</font><br>
    osd_read_prep(), osd_write_prep()</p>
<p>(I suspect I am missing something really important about what generic_error_remove_page() does)</p>
<p><br>
</p>
<p>Regards</p>
<p>Quentin Bouget</p>
</div>
</body>
</html>