2b2985a417
Before we mark the virtual engine as no longer inflight, flush any ongoing signaling that may be using the ce->signal_link along the previous breadcrumbs. On switch to a new physical engine, that link will be inserted into the new set of breadcrumbs, causing confusion to an ongoing iterator. This patch undoes a last minute mistake introduced into commitbab0557c8d
("drm/i915/gt: Remove virtual breadcrumb before transfer"), whereby instead of unconditionally applying the flush, it was only applied if the request itself was going to be reused. v2: Generalise and cancel all remaining ce->signals Fixes:bab0557c8d
("drm/i915/gt: Remove virtual breadcrumb before transfer") Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Andi Shyti <andi.shyti@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210108204026.20682-4-chris@chris-wilson.co.uk
52 lines
1.3 KiB
C
52 lines
1.3 KiB
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Copyright © 2019 Intel Corporation
|
|
*/
|
|
|
|
#ifndef __INTEL_BREADCRUMBS__
|
|
#define __INTEL_BREADCRUMBS__
|
|
|
|
#include <linux/atomic.h>
|
|
#include <linux/irq_work.h>
|
|
|
|
#include "intel_engine_types.h"
|
|
|
|
struct drm_printer;
|
|
struct i915_request;
|
|
struct intel_breadcrumbs;
|
|
|
|
struct intel_breadcrumbs *
|
|
intel_breadcrumbs_create(struct intel_engine_cs *irq_engine);
|
|
void intel_breadcrumbs_free(struct intel_breadcrumbs *b);
|
|
|
|
void intel_breadcrumbs_reset(struct intel_breadcrumbs *b);
|
|
void __intel_breadcrumbs_park(struct intel_breadcrumbs *b);
|
|
|
|
static inline void intel_breadcrumbs_unpark(struct intel_breadcrumbs *b)
|
|
{
|
|
atomic_inc(&b->active);
|
|
}
|
|
|
|
static inline void intel_breadcrumbs_park(struct intel_breadcrumbs *b)
|
|
{
|
|
if (atomic_dec_and_test(&b->active))
|
|
__intel_breadcrumbs_park(b);
|
|
}
|
|
|
|
static inline void
|
|
intel_engine_signal_breadcrumbs(struct intel_engine_cs *engine)
|
|
{
|
|
irq_work_queue(&engine->breadcrumbs->irq_work);
|
|
}
|
|
|
|
void intel_engine_print_breadcrumbs(struct intel_engine_cs *engine,
|
|
struct drm_printer *p);
|
|
|
|
bool i915_request_enable_breadcrumb(struct i915_request *request);
|
|
void i915_request_cancel_breadcrumb(struct i915_request *request);
|
|
|
|
void intel_context_remove_breadcrumbs(struct intel_context *ce,
|
|
struct intel_breadcrumbs *b);
|
|
|
|
#endif /* __INTEL_BREADCRUMBS__ */
|