Page MenuHomeFreeBSD

D45305.1791573286.diff
No OneTemporary

Size
2 KB
Referenced Files
None
Subscribers
None

D45305.1791573286.diff

diff --git a/sys/kern/uipc_mqueue.c b/sys/kern/uipc_mqueue.c
--- a/sys/kern/uipc_mqueue.c
+++ b/sys/kern/uipc_mqueue.c
@@ -126,9 +126,13 @@
LIST_ENTRY(mqfs_vdata) mv_link;
struct mqfs_node *mv_node;
struct vnode *mv_vnode;
- struct task mv_task;
+ LIST_ENTRY(mqfs_vdata) mv_reclaim_link;
};
+static struct mtx mqfs_reclaim_mtx;
+static LIST_HEAD(, mqfs_vdata) mqfs_reclaim_queue;
+static struct task mqfs_reclaim_task;
+
/*
* mqfs_node: describes a node (file or directory) within a mqfs
*/
@@ -716,18 +720,35 @@
return (0);
}
-/*
- * task routine
- */
static void
-do_recycle(void *context, int pending __unused)
+do_recycle_single(struct vnode *vp)
{
- struct vnode *vp = (struct vnode *)context;
+ struct mqfs_node *pn = NULL;
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ if (!VN_IS_DOOMED(vp))
+ pn = VTON(vp);
vrecycle(vp);
VOP_UNLOCK(vp);
vdrop(vp);
+ if (pn != NULL)
+ mqnode_release(pn);
+}
+
+static void
+mqfs_reclaim_proc(void *context, int pending __unused)
+{
+ LIST_HEAD(, mqfs_vdata) q;
+ struct mqfs_vdata *vd;
+
+ LIST_INIT(&q);
+ mtx_lock(&mqfs_reclaim_mtx);
+ LIST_SWAP(&mqfs_reclaim_queue, &q, mqfs_vdata, mv_reclaim_link);
+ mtx_unlock(&mqfs_reclaim_mtx);
+ while ((vd = LIST_FIRST(&q)) != NULL) {
+ LIST_REMOVE(vd, mv_reclaim_link);
+ do_recycle_single(vd->mv_vnode);
+ }
}
/*
@@ -791,7 +812,6 @@
(*vpp)->v_data = vd;
vd->mv_vnode = *vpp;
vd->mv_node = pn;
- TASK_INIT(&vd->mv_task, 0, do_recycle, *vpp);
LIST_INSERT_HEAD(&pn->mn_vnodes, vd, mv_link);
mqnode_addref(pn);
switch (pn->mn_type) {
@@ -1041,7 +1061,12 @@
LIST_FOREACH(vd, &pn->mn_vnodes, mv_link) {
cache_purge(vd->mv_vnode);
vhold(vd->mv_vnode);
- taskqueue_enqueue(taskqueue_thread, &vd->mv_task);
+ mqnode_addref(pn);
+ mtx_lock(&mqfs_reclaim_mtx);
+ LIST_INSERT_HEAD(&mqfs_reclaim_queue, vd,
+ mv_reclaim_link);
+ mtx_unlock(&mqfs_reclaim_mtx);
+ taskqueue_enqueue(taskqueue_thread, &mqfs_reclaim_task);
}
mqnode_release(pn);
mqnode_release(parent);
@@ -2897,6 +2922,10 @@
{
int error;
+ mtx_init(&mqfs_reclaim_mtx, "mqfsrc", NULL, MTX_DEF);
+ LIST_INIT(&mqfs_reclaim_queue);
+ TASK_INIT(&mqfs_reclaim_task, 0, mqfs_reclaim_proc, NULL);
+
error = syscall_helper_register(mq_syscalls, SY_THR_STATIC_KLD);
if (error != 0)
return (error);
@@ -2916,6 +2945,8 @@
syscall32_helper_unregister(mq32_syscalls);
#endif
syscall_helper_unregister(mq_syscalls);
+ taskqueue_drain(taskqueue_thread, &mqfs_reclaim_task);
+ mtx_destroy(&mqfs_reclaim_mtx);
return (0);
}

File Metadata

Mime Type
text/plain
Expires
Fri, Oct 9, 7:14 PM (9 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30268450
Default Alt Text
D45305.1791573286.diff (2 KB)

Event Timeline