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 https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
[linux-2.6-microblaze.git]
/
fs
/
xfs
/
xfs_icache.c
diff --git
a/fs/xfs/xfs_icache.c
b/fs/xfs/xfs_icache.c
index
5269354
..
2609825
100644
(file)
--- a/
fs/xfs/xfs_icache.c
+++ b/
fs/xfs/xfs_icache.c
@@
-440,7
+440,7
@@
xfs_inodegc_queue_all(
for_each_online_cpu(cpu) {
gc = per_cpu_ptr(mp->m_inodegc, cpu);
if (!llist_empty(&gc->list))
for_each_online_cpu(cpu) {
gc = per_cpu_ptr(mp->m_inodegc, cpu);
if (!llist_empty(&gc->list))
-
queue_work_on(cpu, mp->m_inodegc_wq, &gc->work
);
+
mod_delayed_work_on(cpu, mp->m_inodegc_wq, &gc->work, 0
);
}
}
}
}
@@
-1841,8
+1841,8
@@
void
xfs_inodegc_worker(
struct work_struct *work)
{
xfs_inodegc_worker(
struct work_struct *work)
{
- struct xfs_inodegc *gc = container_of(
work, struct xfs_inodegc
,
-
work);
+ struct xfs_inodegc *gc = container_of(
to_delayed_work(work)
,
+
struct xfs_inodegc,
work);
struct llist_node *node = llist_del_all(&gc->list);
struct xfs_inode *ip, *n;
struct llist_node *node = llist_del_all(&gc->list);
struct xfs_inode *ip, *n;
@@
-1862,19
+1862,29
@@
xfs_inodegc_worker(
}
/*
}
/*
- *
Force all currently queued inode inactivation work to run immediately and
- *
wait for the work to finish
.
+ *
Expedite all pending inodegc work to run immediately. This does not wait for
+ *
completion of the work
.
*/
void
*/
void
-xfs_inodegc_
fl
ush(
+xfs_inodegc_
p
ush(
struct xfs_mount *mp)
{
if (!xfs_is_inodegc_enabled(mp))
return;
struct xfs_mount *mp)
{
if (!xfs_is_inodegc_enabled(mp))
return;
+ trace_xfs_inodegc_push(mp, __return_address);
+ xfs_inodegc_queue_all(mp);
+}
+/*
+ * Force all currently queued inode inactivation work to run immediately and
+ * wait for the work to finish.
+ */
+void
+xfs_inodegc_flush(
+ struct xfs_mount *mp)
+{
+ xfs_inodegc_push(mp);
trace_xfs_inodegc_flush(mp, __return_address);
trace_xfs_inodegc_flush(mp, __return_address);
-
- xfs_inodegc_queue_all(mp);
flush_workqueue(mp->m_inodegc_wq);
}
flush_workqueue(mp->m_inodegc_wq);
}
@@
-2014,6
+2024,7
@@
xfs_inodegc_queue(
struct xfs_inodegc *gc;
int items;
unsigned int shrinker_hits;
struct xfs_inodegc *gc;
int items;
unsigned int shrinker_hits;
+ unsigned long queue_delay = 1;
trace_xfs_inode_set_need_inactive(ip);
spin_lock(&ip->i_flags_lock);
trace_xfs_inode_set_need_inactive(ip);
spin_lock(&ip->i_flags_lock);
@@
-2025,19
+2036,26
@@
xfs_inodegc_queue(
items = READ_ONCE(gc->items);
WRITE_ONCE(gc->items, items + 1);
shrinker_hits = READ_ONCE(gc->shrinker_hits);
items = READ_ONCE(gc->items);
WRITE_ONCE(gc->items, items + 1);
shrinker_hits = READ_ONCE(gc->shrinker_hits);
- put_cpu_ptr(gc);
- if (!xfs_is_inodegc_enabled(mp))
+ /*
+ * We queue the work while holding the current CPU so that the work
+ * is scheduled to run on this CPU.
+ */
+ if (!xfs_is_inodegc_enabled(mp)) {
+ put_cpu_ptr(gc);
return;
return;
-
- if (xfs_inodegc_want_queue_work(ip, items)) {
- trace_xfs_inodegc_queue(mp, __return_address);
- queue_work(mp->m_inodegc_wq, &gc->work);
}
}
+ if (xfs_inodegc_want_queue_work(ip, items))
+ queue_delay = 0;
+
+ trace_xfs_inodegc_queue(mp, __return_address);
+ mod_delayed_work(mp->m_inodegc_wq, &gc->work, queue_delay);
+ put_cpu_ptr(gc);
+
if (xfs_inodegc_want_flush_work(ip, items, shrinker_hits)) {
trace_xfs_inodegc_throttle(mp, __return_address);
if (xfs_inodegc_want_flush_work(ip, items, shrinker_hits)) {
trace_xfs_inodegc_throttle(mp, __return_address);
- flush_work(&gc->work);
+ flush_
delayed_
work(&gc->work);
}
}
}
}
@@
-2054,7
+2072,7
@@
xfs_inodegc_cpu_dead(
unsigned int count = 0;
dead_gc = per_cpu_ptr(mp->m_inodegc, dead_cpu);
unsigned int count = 0;
dead_gc = per_cpu_ptr(mp->m_inodegc, dead_cpu);
- cancel_work_sync(&dead_gc->work);
+ cancel_
delayed_
work_sync(&dead_gc->work);
if (llist_empty(&dead_gc->list))
return;
if (llist_empty(&dead_gc->list))
return;
@@
-2073,12
+2091,12
@@
xfs_inodegc_cpu_dead(
llist_add_batch(first, last, &gc->list);
count += READ_ONCE(gc->items);
WRITE_ONCE(gc->items, count);
llist_add_batch(first, last, &gc->list);
count += READ_ONCE(gc->items);
WRITE_ONCE(gc->items, count);
- put_cpu_ptr(gc);
if (xfs_is_inodegc_enabled(mp)) {
trace_xfs_inodegc_queue(mp, __return_address);
if (xfs_is_inodegc_enabled(mp)) {
trace_xfs_inodegc_queue(mp, __return_address);
-
queue_work(mp->m_inodegc_wq, &gc->work
);
+
mod_delayed_work(mp->m_inodegc_wq, &gc->work, 0
);
}
}
+ put_cpu_ptr(gc);
}
/*
}
/*
@@
-2173,7
+2191,7
@@
xfs_inodegc_shrinker_scan(
unsigned int h = READ_ONCE(gc->shrinker_hits);
WRITE_ONCE(gc->shrinker_hits, h + 1);
unsigned int h = READ_ONCE(gc->shrinker_hits);
WRITE_ONCE(gc->shrinker_hits, h + 1);
-
queue_work_on(cpu, mp->m_inodegc_wq, &gc->work
);
+
mod_delayed_work_on(cpu, mp->m_inodegc_wq, &gc->work, 0
);
no_items = false;
}
}
no_items = false;
}
}