[Intel-gfx] [PATCH v12 08/11] drm/i915/perf: execute OA configuration from command stream
kbuild test robot
lkp at intel.com
Fri Aug 30 21:28:03 UTC 2019
Hi Lionel,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on drm-intel/for-linux-next]
[cannot apply to v5.3-rc6 next-20190830]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Lionel-Landwerlin/drm-i915-Vulkan-performance-query-support/20190831-033234
base: git://anongit.freedesktop.org/drm-intel for-linux-next
config: x86_64-allyesconfig (attached as .config)
compiler: gcc-7 (Debian 7.4.0-11) 7.4.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp at intel.com>
All warnings (new ones prefixed by >>):
drivers/gpu/drm/i915/i915_perf.c: In function 'i915_oa_stream_init':
>> drivers/gpu/drm/i915/i915_perf.c:2695:3: warning: ignoring return value of 'i915_active_request_retire', declared with attribute warn_unused_result [-Wunused-result]
i915_active_request_retire(&stream->active_config_rq,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&stream->config_mutex);
~~~~~~~~~~~~~~~~~~~~~~
vim +/i915_active_request_retire +2695 drivers/gpu/drm/i915/i915_perf.c
2553
2554 /**
2555 * i915_oa_stream_init - validate combined props for OA stream and init
2556 * @stream: An i915 perf stream
2557 * @param: The open parameters passed to `DRM_I915_PERF_OPEN`
2558 * @props: The property state that configures stream (individually validated)
2559 *
2560 * While read_properties_unlocked() validates properties in isolation it
2561 * doesn't ensure that the combination necessarily makes sense.
2562 *
2563 * At this point it has been determined that userspace wants a stream of
2564 * OA metrics, but still we need to further validate the combined
2565 * properties are OK.
2566 *
2567 * If the configuration makes sense then we can allocate memory for
2568 * a circular OA buffer and apply the requested metric set configuration.
2569 *
2570 * Returns: zero on success or a negative error code.
2571 */
2572 static int i915_oa_stream_init(struct i915_perf_stream *stream,
2573 struct drm_i915_perf_open_param *param,
2574 struct perf_open_properties *props)
2575 {
2576 struct drm_i915_private *dev_priv = stream->dev_priv;
2577 int format_size;
2578 int ret;
2579
2580 /* If the sysfs metrics/ directory wasn't registered for some
2581 * reason then don't let userspace try their luck with config
2582 * IDs
2583 */
2584 if (!dev_priv->perf.metrics_kobj) {
2585 DRM_DEBUG("OA metrics weren't advertised via sysfs\n");
2586 return -EINVAL;
2587 }
2588
2589 if (!(props->sample_flags & SAMPLE_OA_REPORT)) {
2590 DRM_DEBUG("Only OA report sampling supported\n");
2591 return -EINVAL;
2592 }
2593
2594 if (!dev_priv->perf.ops.enable_metric_set) {
2595 DRM_DEBUG("OA unit not supported\n");
2596 return -ENODEV;
2597 }
2598
2599 /* To avoid the complexity of having to accurately filter
2600 * counter reports and marshal to the appropriate client
2601 * we currently only allow exclusive access
2602 */
2603 if (dev_priv->perf.exclusive_stream) {
2604 DRM_DEBUG("OA unit already in use\n");
2605 return -EBUSY;
2606 }
2607
2608 if (!props->oa_format) {
2609 DRM_DEBUG("OA report format not specified\n");
2610 return -EINVAL;
2611 }
2612
2613 mutex_init(&stream->config_mutex);
2614
2615 stream->sample_size = sizeof(struct drm_i915_perf_record_header);
2616
2617 format_size = dev_priv->perf.oa_formats[props->oa_format].size;
2618
2619 stream->engine = props->engine;
2620
2621 mutex_init(&stream->config_mutex);
2622 INIT_ACTIVE_REQUEST(&stream->active_config_rq,
2623 &stream->config_mutex);
2624
2625 stream->sample_flags |= SAMPLE_OA_REPORT;
2626 stream->sample_size += format_size;
2627
2628 stream->oa_buffer.format_size = format_size;
2629 if (WARN_ON(stream->oa_buffer.format_size == 0))
2630 return -EINVAL;
2631
2632 stream->oa_buffer.format =
2633 dev_priv->perf.oa_formats[props->oa_format].format;
2634
2635 stream->periodic = props->oa_periodic;
2636 if (stream->periodic)
2637 stream->period_exponent = props->oa_period_exponent;
2638
2639 if (stream->ctx) {
2640 ret = oa_get_render_ctx_id(stream);
2641 if (ret) {
2642 DRM_DEBUG("Invalid context id to filter with\n");
2643 return ret;
2644 }
2645 }
2646
2647 ret = alloc_noa_wait(stream);
2648 if (ret) {
2649 DRM_DEBUG("Unable to allocate NOA wait batch buffer\n");
2650 goto err_noa_wait_alloc;
2651 }
2652
2653 ret = i915_perf_get_oa_config_and_bo(stream, props->metrics_set,
2654 &stream->oa_config,
2655 &stream->initial_oa_config_bo);
2656 if (ret) {
2657 DRM_DEBUG("Invalid OA config id=%i\n", props->metrics_set);
2658 goto err_config;
2659 }
2660
2661 /* PRM - observability performance counters:
2662 *
2663 * OACONTROL, performance counter enable, note:
2664 *
2665 * "When this bit is set, in order to have coherent counts,
2666 * RC6 power state and trunk clock gating must be disabled.
2667 * This can be achieved by programming MMIO registers as
2668 * 0xA094=0 and 0xA090[31]=1"
2669 *
2670 * In our case we are expecting that taking pm + FORCEWAKE
2671 * references will effectively disable RC6.
2672 */
2673 stream->wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
2674 intel_uncore_forcewake_get(&dev_priv->uncore, FORCEWAKE_ALL);
2675
2676 ret = alloc_oa_buffer(stream);
2677 if (ret)
2678 goto err_oa_buf_alloc;
2679
2680 ret = i915_mutex_lock_interruptible(&dev_priv->drm);
2681 if (ret)
2682 goto err_lock;
2683
2684 stream->ops = &i915_oa_stream_ops;
2685 dev_priv->perf.exclusive_stream = stream;
2686
2687 mutex_lock(&stream->config_mutex);
2688 ret = dev_priv->perf.ops.enable_metric_set(stream);
2689 if (ret) {
2690 DRM_DEBUG("Unable to enable metric set\n");
2691 /*
2692 * Ignore the return value since we already have an error from
2693 * the enable vfunc.
2694 */
> 2695 i915_active_request_retire(&stream->active_config_rq,
2696 &stream->config_mutex);
2697 } else {
2698 ret = i915_active_request_retire(&stream->active_config_rq,
2699 &stream->config_mutex);
2700 }
2701
2702 mutex_unlock(&stream->config_mutex);
2703 mutex_unlock(&dev_priv->drm.struct_mutex);
2704
2705 i915_gem_object_put(stream->initial_oa_config_bo);
2706 stream->initial_oa_config_bo = NULL;
2707 if (ret)
2708 goto err_enable;
2709
2710 DRM_DEBUG("opening stream oa config uuid=%s\n", stream->oa_config->uuid);
2711
2712 hrtimer_init(&stream->poll_check_timer,
2713 CLOCK_MONOTONIC, HRTIMER_MODE_REL);
2714 stream->poll_check_timer.function = oa_poll_check_timer_cb;
2715 init_waitqueue_head(&stream->poll_wq);
2716 spin_lock_init(&stream->oa_buffer.ptr_lock);
2717
2718 return 0;
2719
2720 err_enable:
2721 mutex_lock(&dev_priv->drm.struct_mutex);
2722 mutex_lock(&stream->config_mutex);
2723 dev_priv->perf.ops.disable_metric_set(stream);
2724 mutex_unlock(&stream->config_mutex);
2725 dev_priv->perf.exclusive_stream = NULL;
2726 mutex_unlock(&dev_priv->drm.struct_mutex);
2727
2728 err_lock:
2729 free_oa_buffer(stream);
2730
2731 err_oa_buf_alloc:
2732 i915_oa_config_put(stream->oa_config);
2733
2734 intel_uncore_forcewake_put(&dev_priv->uncore, FORCEWAKE_ALL);
2735 intel_runtime_pm_put(&dev_priv->runtime_pm, stream->wakeref);
2736
2737 free_oa_configs(stream);
2738
2739 i915_gem_object_put(stream->initial_oa_config_bo);
2740
2741 err_config:
2742 free_noa_wait(stream);
2743
2744 err_noa_wait_alloc:
2745 if (stream->ctx)
2746 oa_put_render_ctx_id(stream);
2747
2748 return ret;
2749 }
2750
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 69533 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gfx/attachments/20190831/d1f92618/attachment-0001.gz>
More information about the Intel-gfx
mailing list