s390/pai: rework pai_crypto mapped buffer reference count
authorThomas Richter <tmricht@linux.ibm.com>
Thu, 20 Oct 2022 09:38:05 +0000 (11:38 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 26 Oct 2022 12:46:51 +0000 (14:46 +0200)
Rework the mapped buffer reference count in PMU pai_crypto
to match the same technique as in PMU pai_ext.
This simplifies the logic.
Do not count the individual number of counter and sampling
processes. Remember the type of access and the total number of
references to the buffer.

Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
Acked-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/perf_pai_crypto.c

index 6826e2a69a21678aae0bd23bebaf96de0306ef04..92184611af6861fa11585664149cb683a402e1bf 100644 (file)
@@ -36,8 +36,8 @@ struct paicrypt_map {
        unsigned long *page;            /* Page for CPU to store counters */
        struct pai_userdata *save;      /* Page to store no-zero counters */
        unsigned int users;             /* # of PAI crypto users */
-       unsigned int sampler;           /* # of PAI crypto samplers */
-       unsigned int counter;           /* # of PAI crypto counters */
+       unsigned int refcnt;            /* Reference count mapped buffers */
+       enum paievt_mode mode;          /* Type of event */
        struct perf_event *event;       /* Perf event for sampling */
 };
 
@@ -56,15 +56,11 @@ static void paicrypt_event_destroy(struct perf_event *event)
        cpump->event = NULL;
        static_branch_dec(&pai_key);
        mutex_lock(&pai_reserve_mutex);
-       if (event->attr.sample_period)
-               cpump->sampler -= 1;
-       else
-               cpump->counter -= 1;
-       debug_sprintf_event(cfm_dbg, 5, "%s event %#llx cpu %d"
-                           " sampler %d counter %d\n", __func__,
-                           event->attr.config, event->cpu, cpump->sampler,
-                           cpump->counter);
-       if (!cpump->counter && !cpump->sampler) {
+       debug_sprintf_event(cfm_dbg, 5, "%s event %#llx cpu %d users %d"
+                           " mode %d refcnt %d\n", __func__,
+                           event->attr.config, event->cpu, cpump->users,
+                           cpump->mode, cpump->refcnt);
+       if (!--cpump->refcnt) {
                debug_sprintf_event(cfm_dbg, 4, "%s page %#lx save %p\n",
                                    __func__, (unsigned long)cpump->page,
                                    cpump->save);
@@ -72,6 +68,7 @@ static void paicrypt_event_destroy(struct perf_event *event)
                cpump->page = NULL;
                kvfree(cpump->save);
                cpump->save = NULL;
+               cpump->mode = PAI_MODE_NONE;
        }
        mutex_unlock(&pai_reserve_mutex);
 }
@@ -136,17 +133,14 @@ static u64 paicrypt_getall(struct perf_event *event)
  */
 static int paicrypt_busy(struct perf_event_attr *a, struct paicrypt_map *cpump)
 {
-       unsigned int *use_ptr;
        int rc = 0;
 
        mutex_lock(&pai_reserve_mutex);
        if (a->sample_period) {         /* Sampling requested */
-               use_ptr = &cpump->sampler;
-               if (cpump->counter || cpump->sampler)
+               if (cpump->mode != PAI_MODE_NONE)
                        rc = -EBUSY;    /* ... sampling/counting active */
        } else {                        /* Counting requested */
-               use_ptr = &cpump->counter;
-               if (cpump->sampler)
+               if (cpump->mode == PAI_MODE_SAMPLING)
                        rc = -EBUSY;    /* ... and sampling active */
        }
        if (rc)
@@ -172,12 +166,16 @@ static int paicrypt_busy(struct perf_event_attr *a, struct paicrypt_map *cpump)
        rc = 0;
 
 unlock:
-       /* If rc is non-zero, do not increment counter/sampler. */
-       if (!rc)
-               *use_ptr += 1;
-       debug_sprintf_event(cfm_dbg, 5, "%s sample_period %#llx sampler %d"
-                           " counter %d page %#lx save %p rc %d\n", __func__,
-                           a->sample_period, cpump->sampler, cpump->counter,
+       /* If rc is non-zero, do not set mode and reference count */
+       if (!rc) {
+               cpump->refcnt++;
+               cpump->mode = a->sample_period ? PAI_MODE_SAMPLING
+                                              : PAI_MODE_COUNTING;
+       }
+       debug_sprintf_event(cfm_dbg, 5, "%s sample_period %#llx users %d"
+                           " mode %d refcnt %d page %#lx save %p rc %d\n",
+                           __func__, a->sample_period, cpump->users,
+                           cpump->mode, cpump->refcnt,
                            (unsigned long)cpump->page, cpump->save, rc);
        mutex_unlock(&pai_reserve_mutex);
        return rc;