Commit fe8929bd authored by Ashutosh Dixit's avatar Ashutosh Dixit
Browse files

drm/xe/perf/uapi: Add perf_stream_paranoid sysctl



Normally only superuser/root can access perf counter data. However,
superuser can set perf_stream_paranoid sysctl to 0 to allow non-privileged
users to also access perf data. perf_stream_paranoid is introduced at the
perf layer to allow different perf stream types to share this access
mechanism.

v2: Add kernel doc for non-static functions (Michal)

Acked-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Acked-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Reviewed-by: default avatarUmesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Signed-off-by: default avatarAshutosh Dixit <ashutosh.dixit@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240618014609.3233427-3-ashutosh.dixit@intel.com
parent 52c2e956
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#include "xe_drv.h"
#include "xe_hw_fence.h"
#include "xe_pci.h"
#include "xe_perf.h"
#include "xe_sched_job.h"

struct xe_modparam xe_modparam = {
@@ -78,6 +79,10 @@ static const struct init_funcs init_funcs[] = {
		.init = xe_register_pci_driver,
		.exit = xe_unregister_pci_driver,
	},
	{
		.init = xe_perf_sysctl_register,
		.exit = xe_perf_sysctl_unregister,
	},
};

static int __init xe_init(void)
+40 −0
Original line number Diff line number Diff line
@@ -4,11 +4,15 @@
 */

#include <linux/errno.h>
#include <linux/sysctl.h>

#include <drm/xe_drm.h>

#include "xe_perf.h"

u32 xe_perf_stream_paranoid = true;
static struct ctl_table_header *sysctl_header;

/**
 * xe_perf_ioctl - The top level perf layer ioctl
 * @dev: @drm_device
@@ -32,3 +36,39 @@ int xe_perf_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
		return -EINVAL;
	}
}

static struct ctl_table perf_ctl_table[] = {
	{
	 .procname = "perf_stream_paranoid",
	 .data = &xe_perf_stream_paranoid,
	 .maxlen = sizeof(xe_perf_stream_paranoid),
	 .mode = 0644,
	 .proc_handler = proc_dointvec_minmax,
	 .extra1 = SYSCTL_ZERO,
	 .extra2 = SYSCTL_ONE,
	 },
	{}
};

/**
 * xe_perf_sysctl_register - Register "perf_stream_paranoid" sysctl
 *
 * Normally only superuser/root can access perf counter data. However,
 * superuser can set perf_stream_paranoid sysctl to 0 to allow non-privileged
 * users to also access perf data.
 *
 * Return: always returns 0
 */
int xe_perf_sysctl_register(void)
{
	sysctl_header = register_sysctl("dev/xe", perf_ctl_table);
	return 0;
}

/**
 * xe_perf_sysctl_unregister - Unregister "perf_stream_paranoid" sysctl
 */
void xe_perf_sysctl_unregister(void)
{
	unregister_sysctl_table(sysctl_header);
}
+6 −0
Original line number Diff line number Diff line
@@ -6,9 +6,15 @@
#ifndef _XE_PERF_H_
#define _XE_PERF_H_

#include <linux/types.h>

struct drm_device;
struct drm_file;

extern u32 xe_perf_stream_paranoid;

int xe_perf_ioctl(struct drm_device *dev, void *data, struct drm_file *file);
int xe_perf_sysctl_register(void);
void xe_perf_sysctl_unregister(void);

#endif