Re: [PATCH v2] fs/dax: Fix pmd vs pte conflict detection

2019-10-22 Thread Johannes Thumshirn
Looks good,
Reviewed-by: Johannes Thumshirn 

-- 
Johannes ThumshirnSUSE Labs Filesystems
jthumsh...@suse.de+49 911 74053 689
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5
90409 Nürnberg
Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Felix Imendörffer
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850


[PATCH v2] fs/dax: Fix pmd vs pte conflict detection

2019-10-21 Thread Dan Williams
Users reported a v5.3 performance regression and inability to establish
huge page mappings. A revised version of the ndctl "dax.sh" huge page
unit test identifies commit 23c84eb78375 "dax: Fix missed wakeup with
PMD faults" as the source.

Update get_unlocked_entry() to check for NULL entries before checking
the entry order, otherwise NULL is misinterpreted as a present pte
conflict. The 'order' check needs to happen before the locked check as
an unlocked entry at the wrong order must fallback to lookup the correct
order.

Reported-by: Jeff Smits 
Reported-by: Doug Nelson 
Cc: 
Fixes: 23c84eb78375 ("dax: Fix missed wakeup with PMD faults")
Reviewed-by: Jan Kara 
Cc: Jeff Moyer 
Cc: Matthew Wilcox (Oracle) 
Signed-off-by: Dan Williams 
---
Changes in v2:
- Update the changelog to reflect the user visible effects of the bug
  (Jeff)

 fs/dax.c |5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/dax.c b/fs/dax.c
index 6bf81f931de3..2cc43cd914eb 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -220,10 +220,11 @@ static void *get_unlocked_entry(struct xa_state *xas, 
unsigned int order)
 
for (;;) {
entry = xas_find_conflict(xas);
+   if (!entry || WARN_ON_ONCE(!xa_is_value(entry)))
+   return entry;
if (dax_entry_order(entry) < order)
return XA_RETRY_ENTRY;
-   if (!entry || WARN_ON_ONCE(!xa_is_value(entry)) ||
-   !dax_is_locked(entry))
+   if (!dax_is_locked(entry))
return entry;
 
wq = dax_entry_waitqueue(xas, entry, &ewait.key);