mirror of https://gitee.com/openkylin/linux.git
drm/i915/pmu: Hide the (unsigned long)ptr cast
We pretend the PMU config id is a pointer value when encoding it into the device parameters for presentation via sysfs. This requires casting of an unsigned long into and out of the pointer member, which annoys smatch: drivers/gpu/drm/i915/i915_pmu.c:684 i915_pmu_event_show() warn: argument 3 to %lx specifier is cast from pointer Instead of abusing a generic dev_ext_attribute, define our own typesafe attributes. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171123211751.2885-1-chris@chris-wilson.co.uk Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
This commit is contained in:
parent
8911a31c81
commit
b7d3aabf90
|
@ -650,19 +650,24 @@ static int i915_pmu_event_event_idx(struct perf_event *event)
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct i915_str_attribute {
|
||||
struct device_attribute attr;
|
||||
const char *str;
|
||||
};
|
||||
|
||||
static ssize_t i915_pmu_format_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct dev_ext_attribute *eattr;
|
||||
struct i915_str_attribute *eattr;
|
||||
|
||||
eattr = container_of(attr, struct dev_ext_attribute, attr);
|
||||
return sprintf(buf, "%s\n", (char *)eattr->var);
|
||||
eattr = container_of(attr, struct i915_str_attribute, attr);
|
||||
return sprintf(buf, "%s\n", eattr->str);
|
||||
}
|
||||
|
||||
#define I915_PMU_FORMAT_ATTR(_name, _config) \
|
||||
(&((struct dev_ext_attribute[]) { \
|
||||
(&((struct i915_str_attribute[]) { \
|
||||
{ .attr = __ATTR(_name, 0444, i915_pmu_format_show, NULL), \
|
||||
.var = (void *)_config, } \
|
||||
.str = _config, } \
|
||||
})[0].attr.attr)
|
||||
|
||||
static struct attribute *i915_pmu_format_attrs[] = {
|
||||
|
@ -675,19 +680,24 @@ static const struct attribute_group i915_pmu_format_attr_group = {
|
|||
.attrs = i915_pmu_format_attrs,
|
||||
};
|
||||
|
||||
struct i915_ext_attribute {
|
||||
struct device_attribute attr;
|
||||
unsigned long val;
|
||||
};
|
||||
|
||||
static ssize_t i915_pmu_event_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct dev_ext_attribute *eattr;
|
||||
struct i915_ext_attribute *eattr;
|
||||
|
||||
eattr = container_of(attr, struct dev_ext_attribute, attr);
|
||||
return sprintf(buf, "config=0x%lx\n", (unsigned long)eattr->var);
|
||||
eattr = container_of(attr, struct i915_ext_attribute, attr);
|
||||
return sprintf(buf, "config=0x%lx\n", eattr->val);
|
||||
}
|
||||
|
||||
#define I915_EVENT_ATTR(_name, _config) \
|
||||
(&((struct dev_ext_attribute[]) { \
|
||||
(&((struct i915_ext_attribute[]) { \
|
||||
{ .attr = __ATTR(_name, 0444, i915_pmu_event_show, NULL), \
|
||||
.var = (void *)_config, } \
|
||||
.val = _config, } \
|
||||
})[0].attr.attr)
|
||||
|
||||
#define I915_EVENT_STR(_name, _str) \
|
||||
|
|
Loading…
Reference in New Issue