OSDN Git Service

drm/i915/pmu: Hide the (unsigned long)ptr cast
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 23 Nov 2017 21:17:51 +0000 (21:17 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Nov 2017 08:54:02 +0000 (08:54 +0000)
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>
drivers/gpu/drm/i915/i915_pmu.c

index 6a42e7f..5170a46 100644 (file)
@@ -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) \