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 */
 };
 
        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);
                cpump->page = NULL;
                kvfree(cpump->save);
                cpump->save = NULL;
+               cpump->mode = PAI_MODE_NONE;
        }
        mutex_unlock(&pai_reserve_mutex);
 }
  */
 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)
        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;