perf: Remove the kref from perfmon_session
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 14 Jun 2016 19:16:14 +0000 (15:16 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 17 Jun 2016 16:17:54 +0000 (12:17 -0400)
The sessions are 1:1 with perfmon_contexts.  The context in devarch is the
way in which to access the session, so we don't need to do any reference
counting.  Note that perfmon_get_session() was never called - we had no use
for it.

Likewise, arch_free_perf_context() should never be called with 0.  The one
time it is called, the caller checks.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/devarch.c
kern/arch/x86/perfmon.c
kern/arch/x86/perfmon.h

index d2372b2..94af4b2 100644 (file)
@@ -336,11 +336,9 @@ static struct perf_context *arch_create_perf_context(void)
 
 static void arch_free_perf_context(struct perf_context *pc)
 {
-       if (likely(pc)) {
-               perfmon_close_session(pc->ps);
-               kfree(pc->resp);
-               kfree(pc);
-       }
+       perfmon_close_session(pc->ps);
+       kfree(pc->resp);
+       kfree(pc);
 }
 
 static const uint8_t *arch_read_core_set(struct core_set *cset,
index 2bb7e28..f9150ea 100644 (file)
@@ -42,7 +42,6 @@
 #include <smp.h>
 #include <atomic.h>
 #include <core_set.h>
-#include <kref.h>
 #include <percpu.h>
 #include <kmalloc.h>
 #include <err.h>
@@ -565,36 +564,23 @@ void perfmon_free_event_status(struct perfmon_status *pef)
        kfree(pef);
 }
 
-static void perfmon_release_session(struct kref *kref)
-{
-       struct perfmon_session *ps =
-           container_of(kref, struct perfmon_session, ref);
-
-       for (int i = 0; i < ARRAY_SIZE(ps->allocs); i++) {
-               struct perfmon_alloc *pa = ps->allocs[i];
-
-               if (pa)
-                       perfmon_destroy_alloc(pa);
-       }
-       kfree(ps);
-}
-
 struct perfmon_session *perfmon_create_session(void)
 {
        struct perfmon_session *ps = kzmalloc(sizeof(struct perfmon_session),
                                              MEM_WAIT);
 
-       kref_init(&ps->ref, perfmon_release_session, 1);
        qlock_init(&ps->qlock);
        return ps;
 }
 
-void perfmon_get_session(struct perfmon_session *ps)
-{
-       kref_get(&ps->ref, 1);
-}
-
 void perfmon_close_session(struct perfmon_session *ps)
 {
-       kref_put(&ps->ref);
+       struct perfmon_alloc *pa;
+
+       for (int i = 0; i < ARRAY_SIZE(ps->allocs); i++) {
+               pa = ps->allocs[i];
+               if (pa)
+                       perfmon_destroy_alloc(pa);
+       }
+       kfree(ps);
 }
index 28760d1..3e7d6f3 100644 (file)
@@ -11,7 +11,6 @@
 #include <arch/x86.h>
 #include <atomic.h>
 #include <core_set.h>
-#include <kref.h>
 #include <stdint.h>
 #include <kthread.h>
 
@@ -39,7 +38,6 @@ struct perfmon_alloc {
 };
 
 struct perfmon_session {
-       struct kref ref;
        qlock_t qlock;
        struct perfmon_alloc *allocs[MAX_PERFMON_COUNTERS];
 };
@@ -61,7 +59,6 @@ struct perfmon_status *perfmon_get_event_status(struct perfmon_session *ps,
                                                                                                int ped);
 void perfmon_free_event_status(struct perfmon_status *pef);
 struct perfmon_session *perfmon_create_session(void);
-void perfmon_get_session(struct perfmon_session *ps);
 void perfmon_close_session(struct perfmon_session *ps);
 
 static inline uint64_t read_pmc(uint32_t index)