On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote:
On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@xxxxxxxxxxxxxxx> wrote:
The patch introduces page->compound_head into third double word block in
front of compound_dtor and compound_order. That means it shares storage
space with:
- page->lru.next;
- page->next;
- page->rcu_head.next;
- page->pmd_huge_pte;
Anyway, this is quite subtle and there's a risk that people will
accidentally break it later on. I don't think the patch puts
sufficient documentation in place to prevent this.
I would appreciate for suggestion on place and form of documentation.
And even documentation might not be enough to prevent accidents.
The only think I can propose is VM_BUG_ON() in PageTail() and
compound_head() which would ensure that page->compound_page points to
place within MAX_ORDER_NR_PAGES before the current page if bit 0 is set.
Do you consider this helpful?
...
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -120,7 +120,12 @@ struct page {
};
};
- /* Third double word block */
+ /*
+ * Third double word block
+ *
+ * WARNING: bit 0 of the first word encode PageTail and *must* be 0
+ * for non-tail pages.
+ */
union {
struct list_head lru; /* Pageout list, eg. active_list
* protected by zone->lru_lock !
@@ -143,6 +148,7 @@ struct page {
*/
/* First tail page of compound page */
struct {
+ unsigned long compound_head; /* If bit zero is set */
I think the comments around here should have more details and should
be louder!
I'm always bad when it comes to documentation. Is it enough?
/*
* Third double word block
*
* WARNING: bit 0 of the first word encode PageTail(). That means
* the rest users of the storage space MUST NOT use the bit to
* avoid collision and false-positive PageTail().
*/