projects
/
linux-2.6-microblaze.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge tag 'char-misc-5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregk...
[linux-2.6-microblaze.git]
/
fs
/
dax.c
diff --git
a/fs/dax.c
b/fs/dax.c
index
b3d27fd
..
62352cb
100644
(file)
--- a/
fs/dax.c
+++ b/
fs/dax.c
@@
-144,6
+144,16
@@
struct wait_exceptional_entry_queue {
struct exceptional_entry_key key;
};
struct exceptional_entry_key key;
};
+/**
+ * enum dax_wake_mode: waitqueue wakeup behaviour
+ * @WAKE_ALL: wake all waiters in the waitqueue
+ * @WAKE_NEXT: wake only the first waiter in the waitqueue
+ */
+enum dax_wake_mode {
+ WAKE_ALL,
+ WAKE_NEXT,
+};
+
static wait_queue_head_t *dax_entry_waitqueue(struct xa_state *xas,
void *entry, struct exceptional_entry_key *key)
{
static wait_queue_head_t *dax_entry_waitqueue(struct xa_state *xas,
void *entry, struct exceptional_entry_key *key)
{
@@
-182,7
+192,8
@@
static int wake_exceptional_entry_func(wait_queue_entry_t *wait,
* The important information it's conveying is whether the entry at
* this index used to be a PMD entry.
*/
* The important information it's conveying is whether the entry at
* this index used to be a PMD entry.
*/
-static void dax_wake_entry(struct xa_state *xas, void *entry, bool wake_all)
+static void dax_wake_entry(struct xa_state *xas, void *entry,
+ enum dax_wake_mode mode)
{
struct exceptional_entry_key key;
wait_queue_head_t *wq;
{
struct exceptional_entry_key key;
wait_queue_head_t *wq;
@@
-196,7
+207,7
@@
static void dax_wake_entry(struct xa_state *xas, void *entry, bool wake_all)
* must be in the waitqueue and the following check will see them.
*/
if (waitqueue_active(wq))
* must be in the waitqueue and the following check will see them.
*/
if (waitqueue_active(wq))
- __wake_up(wq, TASK_NORMAL,
wake_all
? 0 : 1, &key);
+ __wake_up(wq, TASK_NORMAL,
mode == WAKE_ALL
? 0 : 1, &key);
}
/*
}
/*
@@
-264,11
+275,11
@@
static void wait_entry_unlocked(struct xa_state *xas, void *entry)
finish_wait(wq, &ewait.wait);
}
finish_wait(wq, &ewait.wait);
}
-static void put_unlocked_entry(struct xa_state *xas, void *entry)
+static void put_unlocked_entry(struct xa_state *xas, void *entry,
+ enum dax_wake_mode mode)
{
{
- /* If we were the only waiter woken, wake the next one */
if (entry && !dax_is_conflict(entry))
if (entry && !dax_is_conflict(entry))
- dax_wake_entry(xas, entry,
fals
e);
+ dax_wake_entry(xas, entry,
mod
e);
}
/*
}
/*
@@
-286,7
+297,7
@@
static void dax_unlock_entry(struct xa_state *xas, void *entry)
old = xas_store(xas, entry);
xas_unlock_irq(xas);
BUG_ON(!dax_is_locked(old));
old = xas_store(xas, entry);
xas_unlock_irq(xas);
BUG_ON(!dax_is_locked(old));
- dax_wake_entry(xas, entry,
false
);
+ dax_wake_entry(xas, entry,
WAKE_NEXT
);
}
/*
}
/*
@@
-524,8
+535,8
@@
retry:
dax_disassociate_entry(entry, mapping, false);
xas_store(xas, NULL); /* undo the PMD join */
dax_disassociate_entry(entry, mapping, false);
xas_store(xas, NULL); /* undo the PMD join */
- dax_wake_entry(xas, entry,
true
);
- mapping->nr
exceptional--
;
+ dax_wake_entry(xas, entry,
WAKE_ALL
);
+ mapping->nr
pages -= PG_PMD_NR
;
entry = NULL;
xas_set(xas, index);
}
entry = NULL;
xas_set(xas, index);
}
@@
-541,7
+552,7
@@
retry:
dax_lock_entry(xas, entry);
if (xas_error(xas))
goto out_unlock;
dax_lock_entry(xas, entry);
if (xas_error(xas))
goto out_unlock;
- mapping->nr
exceptional++
;
+ mapping->nr
pages += 1UL << order
;
}
out_unlock:
}
out_unlock:
@@
-622,7
+633,7
@@
struct page *dax_layout_busy_page_range(struct address_space *mapping,
entry = get_unlocked_entry(&xas, 0);
if (entry)
page = dax_busy_page(entry);
entry = get_unlocked_entry(&xas, 0);
if (entry)
page = dax_busy_page(entry);
- put_unlocked_entry(&xas, entry);
+ put_unlocked_entry(&xas, entry
, WAKE_NEXT
);
if (page)
break;
if (++scanned % XA_CHECK_SCHED)
if (page)
break;
if (++scanned % XA_CHECK_SCHED)
@@
-661,10
+672,10
@@
static int __dax_invalidate_entry(struct address_space *mapping,
goto out;
dax_disassociate_entry(entry, mapping, trunc);
xas_store(&xas, NULL);
goto out;
dax_disassociate_entry(entry, mapping, trunc);
xas_store(&xas, NULL);
- mapping->nr
exceptional--
;
+ mapping->nr
pages -= 1UL << dax_entry_order(entry)
;
ret = 1;
out:
ret = 1;
out:
- put_unlocked_entry(&xas, entry);
+ put_unlocked_entry(&xas, entry
, WAKE_ALL
);
xas_unlock_irq(&xas);
return ret;
}
xas_unlock_irq(&xas);
return ret;
}
@@
-937,13
+948,13
@@
static int dax_writeback_one(struct xa_state *xas, struct dax_device *dax_dev,
xas_lock_irq(xas);
xas_store(xas, entry);
xas_clear_mark(xas, PAGECACHE_TAG_DIRTY);
xas_lock_irq(xas);
xas_store(xas, entry);
xas_clear_mark(xas, PAGECACHE_TAG_DIRTY);
- dax_wake_entry(xas, entry,
false
);
+ dax_wake_entry(xas, entry,
WAKE_NEXT
);
trace_dax_writeback_one(mapping->host, index, count);
return ret;
put_unlocked:
trace_dax_writeback_one(mapping->host, index, count);
return ret;
put_unlocked:
- put_unlocked_entry(xas, entry);
+ put_unlocked_entry(xas, entry
, WAKE_NEXT
);
return ret;
}
return ret;
}
@@
-965,7
+976,7
@@
int dax_writeback_mapping_range(struct address_space *mapping,
if (WARN_ON_ONCE(inode->i_blkbits != PAGE_SHIFT))
return -EIO;
if (WARN_ON_ONCE(inode->i_blkbits != PAGE_SHIFT))
return -EIO;
- if (
!mapping->nrexceptional
|| wbc->sync_mode != WB_SYNC_ALL)
+ if (
mapping_empty(mapping)
|| wbc->sync_mode != WB_SYNC_ALL)
return 0;
trace_dax_writeback_range(inode, xas.xa_index, end_index);
return 0;
trace_dax_writeback_range(inode, xas.xa_index, end_index);
@@
-1684,7
+1695,7
@@
dax_insert_pfn_mkwrite(struct vm_fault *vmf, pfn_t pfn, unsigned int order)
/* Did we race with someone splitting entry or so? */
if (!entry || dax_is_conflict(entry) ||
(order == 0 && !dax_is_pte_entry(entry))) {
/* Did we race with someone splitting entry or so? */
if (!entry || dax_is_conflict(entry) ||
(order == 0 && !dax_is_pte_entry(entry))) {
- put_unlocked_entry(&xas, entry);
+ put_unlocked_entry(&xas, entry
, WAKE_NEXT
);
xas_unlock_irq(&xas);
trace_dax_insert_pfn_mkwrite_no_entry(mapping->host, vmf,
VM_FAULT_NOPAGE);
xas_unlock_irq(&xas);
trace_dax_insert_pfn_mkwrite_no_entry(mapping->host, vmf,
VM_FAULT_NOPAGE);