[RFC, PATCH] teach utrace to destroy engine->data

Roland McGrath roland at redhat.com
Tue Aug 18 05:10:49 UTC 2009


If we do add the destructor hook, I think it looks like this.
It would merit some write-up in utrace.tmpl text too.

I'm not especially convinced it's a very good idea.
But I won't object if people serious about using the API think it helps.


Thanks,
Roland


---
 include/linux/utrace.h |    8 ++++++++
 kernel/utrace.c        |    3 +++
 2 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/include/linux/utrace.h b/include/linux/utrace.h
index c19c01b..f968792 100644
--- a/include/linux/utrace.h
+++ b/include/linux/utrace.h
@@ -322,6 +322,7 @@ static inline enum utrace_syscall_action utrace_syscall_action(u32 action)
 struct utrace_engine {
 /* private: */
 	struct kref kref;
+	void (*release)(void *);
 	struct list_head entry;
 
 /* public: */
@@ -539,6 +540,12 @@ static inline void utrace_engine_put(struct utrace_engine *engine)
  *	Unlike other callbacks, this can be called from the parent's context
  *	rather than from the traced thread itself--it must not delay the
  *	parent by blocking.
+ *
+ * @release:
+ *	If not %NULL, this is called after the last utrace_engine_put()
+ *	call for a &struct utrace_engine, which could be implicit after
+ *	a %UTRACE_DETACH return from another callback.  Its argument is
+ *	the engine's @data member.
  */
 struct utrace_engine_ops {
 	u32 (*report_quiesce)(enum utrace_resume_action action,
@@ -584,6 +591,7 @@ struct utrace_engine_ops {
 			    bool group_dead, int signal);
 	void (*report_reap)(struct utrace_engine *engine,
 			    struct task_struct *task);
+	void (*release)(void *data);
 };
 
 /**
diff --git a/kernel/utrace.c b/kernel/utrace.c
index 35be909..3b7ac74 100644
--- a/kernel/utrace.c
+++ b/kernel/utrace.c
@@ -79,6 +79,8 @@ void __utrace_engine_release(struct kref *kref)
 	struct utrace_engine *engine = container_of(kref, struct utrace_engine,
 						    kref);
 	BUG_ON(!list_empty(&engine->entry));
+	if (engine->release)
+		(*engine->release)(engine->data);
 	kmem_cache_free(utrace_engine_cachep, engine);
 }
 EXPORT_SYMBOL_GPL(__utrace_engine_release);
@@ -271,6 +273,7 @@ struct utrace_engine *utrace_attach_task(
 	engine->flags = 0;
 	engine->ops = ops;
 	engine->data = data;
+	engine->release = ops->release;
 
 	ret = utrace_attach_delay(target);
 	if (likely(!ret))




More information about the utrace-devel mailing list