File tree Expand file tree Collapse file tree 1 file changed +26
-0
lines changed Expand file tree Collapse file tree 1 file changed +26
-0
lines changed Original file line number Diff line number Diff line change @@ -8273,6 +8273,20 @@ static void free_pmu_context(struct pmu *pmu)
8273
8273
out :
8274
8274
mutex_unlock (& pmus_lock );
8275
8275
}
8276
+
8277
+ /*
8278
+ * Let userspace know that this PMU supports address range filtering:
8279
+ */
8280
+ static ssize_t nr_addr_filters_show (struct device * dev ,
8281
+ struct device_attribute * attr ,
8282
+ char * page )
8283
+ {
8284
+ struct pmu * pmu = dev_get_drvdata (dev );
8285
+
8286
+ return snprintf (page , PAGE_SIZE - 1 , "%d\n" , pmu -> nr_addr_filters );
8287
+ }
8288
+ DEVICE_ATTR_RO (nr_addr_filters );
8289
+
8276
8290
static struct idr pmu_idr ;
8277
8291
8278
8292
static ssize_t
@@ -8374,9 +8388,19 @@ static int pmu_dev_alloc(struct pmu *pmu)
8374
8388
if (ret )
8375
8389
goto free_dev ;
8376
8390
8391
+ /* For PMUs with address filters, throw in an extra attribute: */
8392
+ if (pmu -> nr_addr_filters )
8393
+ ret = device_create_file (pmu -> dev , & dev_attr_nr_addr_filters );
8394
+
8395
+ if (ret )
8396
+ goto del_dev ;
8397
+
8377
8398
out :
8378
8399
return ret ;
8379
8400
8401
+ del_dev :
8402
+ device_del (pmu -> dev );
8403
+
8380
8404
free_dev :
8381
8405
put_device (pmu -> dev );
8382
8406
goto out ;
@@ -8512,6 +8536,8 @@ void perf_pmu_unregister(struct pmu *pmu)
8512
8536
free_percpu (pmu -> pmu_disable_count );
8513
8537
if (pmu -> type >= PERF_TYPE_MAX )
8514
8538
idr_remove (& pmu_idr , pmu -> type );
8539
+ if (pmu -> nr_addr_filters )
8540
+ device_remove_file (pmu -> dev , & dev_attr_nr_addr_filters );
8515
8541
device_del (pmu -> dev );
8516
8542
put_device (pmu -> dev );
8517
8543
free_pmu_context (pmu );
You can’t perform that action at this time.
0 commit comments