From: Violet Monti <violet.monti@intel.com>
To: Gustavo Sousa <gustavo.sousa@intel.com>
Cc: <intel-xe@lists.freedesktop.org>
Subject: Re: [PATCH v2 7/7] drm/xe/rtp: Implement a structured parser for rule matching
Date: Wed, 13 May 2026 15:09:54 -0700 [thread overview]
Message-ID: <agT2snJgv7HCsR_b@vmonti-desk> (raw)
In-Reply-To: <20260430-rtp-rule-parser-v2-7-157e98b4ab51@intel.com>
On Thu, Apr 30, 2026 at 05:20:08PM -0300, Gustavo Sousa wrote:
> The current unwritten grammar for RTP rules is as follows:
>
> rules = disjunction;
> disjunction = conjunction { "OR" conjunction };
> conjunction = single_rule { single_rule }
> /* AND operator is implicit */;
> single_rule = ? GRAPHICS_VERSION(...), MEDIA_VERSION(...),
> FUNC(...), etc ?;
>
> While rule_matches() currently works for the grammar above, it doesn't
> easily resemble it. Let's replace it with an implementation that is
> structured in a way to resemble the grammar.
>
> Such a new implementation, although a bit more verbose, is arguably
> easier to reason about and to adapt to any extension we do to the
> grammer in the future.
>
> Signed-off-by: Gustavo Sousa <gustavo.sousa@intel.com>
Reviewed-by: Violet Monti <violet.monti@intel.com>
> ---
> drivers/gpu/drm/xe/xe_rtp.c | 138 ++++++++++++++++++++++++++++----------------
> 1 file changed, 88 insertions(+), 50 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_rtp.c b/drivers/gpu/drm/xe/xe_rtp.c
> index 976a2e1f5592..dec9d94e6fb0 100644
> --- a/drivers/gpu/drm/xe/xe_rtp.c
> +++ b/drivers/gpu/drm/xe/xe_rtp.c
> @@ -30,11 +30,28 @@ static bool has_samedia(const struct xe_device *xe)
> return xe->info.media_verx100 >= 1300;
> }
>
> -static bool rule_match_item(const struct xe_device *xe,
> - struct xe_gt *gt,
> - struct xe_hw_engine *hwe,
> - const struct xe_rtp_rule *r)
> +struct rule_match_ctx {
> + const struct xe_device *xe;
> + struct xe_gt *gt;
> + struct xe_hw_engine *hwe;
> + const struct xe_rtp_rule *rules;
> + const unsigned int n_rules;
> + unsigned int head;
> + int err;
> +};
> +
> +static bool rule_is_item(const struct xe_rtp_rule *r)
> +{
> + return r->match_type != XE_RTP_MATCH_OR;
> +}
> +
> +static bool rule_match_item(struct rule_match_ctx *match_ctx)
> {
> + const struct xe_device *xe = match_ctx->xe;
> + struct xe_gt *gt = match_ctx->gt;
> + struct xe_hw_engine *hwe = match_ctx->hwe;
> + const struct xe_rtp_rule *r = &match_ctx->rules[match_ctx->head];
> +
> switch (r->match_type) {
> case XE_RTP_MATCH_PLATFORM:
> return xe->info.platform == r->platform;
> @@ -120,6 +137,63 @@ static bool rule_match_item(const struct xe_device *xe,
> }
> }
>
> +/*
> + * Match a conjunctive set of rules (rules joined by an implicit "AND").
> + *
> + * Once one item evaluates to false, the remaining items are not evaluated
> + * anymore. Nevetheless, all rules are consumed to allow detecting syntax
> + * errors.
> + */
> +static bool rule_match_and(struct rule_match_ctx *match_ctx, bool parse_only)
> +{
> + bool match = true;
> + unsigned int count = 0;
> +
> + while (match_ctx->head < match_ctx->n_rules &&
> + rule_is_item(&match_ctx->rules[match_ctx->head])) {
> + if (!parse_only)
> + match = rule_match_item(match_ctx);
> +
> + if (!match)
> + parse_only = true;
> +
> + match_ctx->head++;
> + count++;
> + }
> +
> + if (drm_WARN_ON(&match_ctx->xe->drm, !count)) {
> + match_ctx->err = -EINVAL;
> +
> + if (!parse_only)
> + match = false;
> + }
> +
> + return match;
> +}
> +
> +/*
> + * Match a disjunctive set of rules (subset of rules joined by
> + * "XE_RTP_MATCH_OR").
> + *
> + * Once one subset evaluates to true, the remaining items are not evaluated
> + * anymore. Nevetheless, all rules are consumed to allow detecting syntax
> + * errors.
> + */
> +static bool rule_match_or(struct rule_match_ctx *match_ctx)
> +{
> + bool match = rule_match_and(match_ctx, false);
> +
> + while (match_ctx->head < match_ctx->n_rules &&
> + match_ctx->rules[match_ctx->head].match_type == XE_RTP_MATCH_OR) {
> + /* Consume XE_RTP_MATCH_OR. */
> + match_ctx->head++;
> +
> + match = rule_match_and(match_ctx, match);
> + }
> +
> + return match;
> +}
> +
> static bool rule_matches_with_err(const struct xe_device *xe,
> struct xe_gt *gt,
> struct xe_hw_engine *hwe,
> @@ -127,55 +201,19 @@ static bool rule_matches_with_err(const struct xe_device *xe,
> unsigned int n_rules,
> int *err)
> {
> - const struct xe_rtp_rule *r;
> - unsigned int i, rcount = 0;
> - bool short_circuit_or = false;
> + struct rule_match_ctx match_ctx = {
> + .xe = xe,
> + .gt = gt,
> + .hwe = hwe,
> + .rules = rules,
> + .n_rules = n_rules,
> + };
> + bool match = rule_match_or(&match_ctx);
>
> if (err)
> - *err = 0;
> -
> - for (r = rules, i = 0; i < n_rules; r = &rules[++i]) {
> - if (r->match_type == XE_RTP_MATCH_OR) {
> - if (drm_WARN_ON(&xe->drm, !rcount)) {
> - if (err)
> - *err = -EINVAL;
> - continue;
> - }
> -
> - /*
> - * This is only reached if a complete conjunction of
> - * rules passed, in which case we short-circuit rule
> - * evaluation, but still keep parsing to find any syntax
> - * errors.
> - */
> - short_circuit_or = true;
> - rcount = 0;
> - continue;
> - }
> -
> - if (short_circuit_or || rule_match_item(xe, gt, hwe, r)) {
> - rcount++;
> - } else {
> - /*
> - * Advance rules until we find XE_RTP_MATCH_OR to check
> - * if there's another set of conditions to check
> - */
> - while (++i < n_rules && rules[i].match_type != XE_RTP_MATCH_OR)
> - ;
> -
> - if (i >= n_rules)
> - return false;
> -
> - rcount = 0;
> - }
> - }
> -
> - if (drm_WARN_ON(&xe->drm, !rcount)) {
> - if (err)
> - *err = -EINVAL;
> - }
> + *err = match_ctx.err;
>
> - return short_circuit_or || rcount;
> + return match;
> }
>
> static bool rule_matches(const struct xe_device *xe,
>
> --
> 2.53.0
>
--
--
Violet Monti
next prev parent reply other threads:[~2026-05-13 22:09 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-30 20:20 [PATCH v2 0/7] drm/xe/rtp: Miscellaneous improvements to rule matching Gustavo Sousa
2026-04-30 20:20 ` [PATCH v2 1/7] drm/xe/rtp: Write kunit test cases specific for " Gustavo Sousa
2026-04-30 20:20 ` [PATCH v2 2/7] drm/xe/rtp: Drop rule matching cases from rtp_to_sr_cases and rtp_cases Gustavo Sousa
2026-04-30 20:20 ` [PATCH v2 3/7] drm/xe/rtp: Don't short-circuit to false in or-yes case Gustavo Sousa
2026-05-13 21:52 ` Violet Monti
2026-05-13 23:04 ` Matt Roper
2026-04-30 20:20 ` [PATCH v2 4/7] drm/xe/rtp: Do not break parsing when missing context Gustavo Sousa
2026-04-30 20:20 ` [PATCH v2 5/7] drm/xe/rtp: Extract rule_match_item() Gustavo Sousa
2026-04-30 20:20 ` [PATCH v2 6/7] drm/xe/rtp: Fully parse the ruleset Gustavo Sousa
2026-05-13 22:07 ` Violet Monti
2026-05-13 23:14 ` Matt Roper
2026-04-30 20:20 ` [PATCH v2 7/7] drm/xe/rtp: Implement a structured parser for rule matching Gustavo Sousa
2026-05-13 22:09 ` Violet Monti [this message]
2026-05-13 23:34 ` Matt Roper
2026-05-14 20:19 ` Gustavo Sousa
2026-05-14 20:51 ` Matt Roper
2026-04-30 21:02 ` ✗ CI.checkpatch: warning for drm/xe/rtp: Miscellaneous improvements to rule matching (rev2) Patchwork
2026-04-30 21:03 ` ✓ CI.KUnit: success " Patchwork
2026-04-30 21:59 ` ✓ Xe.CI.BAT: " Patchwork
2026-05-01 9:25 ` ✗ Xe.CI.FULL: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=agT2snJgv7HCsR_b@vmonti-desk \
--to=violet.monti@intel.com \
--cc=gustavo.sousa@intel.com \
--cc=intel-xe@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.