From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3B3B63D6684 for ; Wed, 25 Feb 2026 16:37:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.52 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772037464; cv=none; b=PFG/EEW973irl7Az7Q08OxEtmbUQYT4VxsmZr2yavmV7YiJYBzPdz0jObnNRR3H3Dy+PMujylALc3LfpNVqrRoAaQW9qUKXH7Y+Vpw/N6FkTXxuFwjYsC+4uycJVGk9QoANJ0Hwpc8yjX9whZkSvOnhqWsDyWoSyhJak390WtW0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772037464; c=relaxed/simple; bh=1oZu2OoIrgThUGa3MPQBdh1xtjEes6+OCgzqdl76c+I=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=LONCBk3pKNSLqQnA58t4NlfypUxljTuD4M7AkBjXzbti359AGzBTRp/OJWppSskWP5QFip7rUuSidO5Rv3D7HNwSx2wWcfhUv58VPlYQKz+OUmi2VWvZLGUFT17cKxktUDQvJFrDtBjyrZdQYCth+kUm0DzS/FyHHAFRG2iG/Lw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ursulin.net; spf=pass smtp.mailfrom=ursulin.net; dkim=pass (2048-bit key) header.d=ursulin.net header.i=@ursulin.net header.b=YyoDvItx; arc=none smtp.client-ip=209.85.221.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ursulin.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ursulin.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ursulin.net header.i=@ursulin.net header.b="YyoDvItx" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-43990ea3fbcso509636f8f.0 for ; Wed, 25 Feb 2026 08:37:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ursulin.net; s=google; t=1772037457; x=1772642257; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=IIjuh7xicSafG0ljqjs2yM/yZzuJ98QSAxsCQUIs+5A=; b=YyoDvItxxSxLOrx8xr9yMcqOaS0qkBF6LOh8DlTIIZmPaOdeYlsw4bM3/sD5Tw8Y+t 8kVlfuTe2q1Z4vnev8ninrlI7zOFTWeWKIkx3llHqWQrfg+lAE38ftWnAeNNEzOTklOC OorzA1EWnuhucxkOffDh6vlNuz9J/+aokcaLfswuf/LsYYNr30UFTp5MsS35qSyY+YTV V4J4EQwqpr/PqW0TD88aCSxYzbJYFokFBaPkGgF5W+WGekKi+MJomgwS6/R5H1ALphUK 6z50he3ePKBlplxqAwZHA7G/KTicB/mVVZTFtU5GoUoC5/VPQfmOmoWBj28HQAvIhJZB 0iVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772037457; x=1772642257; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=IIjuh7xicSafG0ljqjs2yM/yZzuJ98QSAxsCQUIs+5A=; b=ayLV4WVDszWN2l5DSF4Z9cj6972MN+FaSL9/EtK5cG8gKjbghy61ca+nvJ56s7k1Pb 0kSWd6hQ9rSvBR7L5J45g3xOnoVknJ5+qZtaRym2NYvqsgXUeTzsbKVyiQCxDjqENyLC QyoUQpAV15xcjfYGXgFnXJVOPDcMvalRXc0CiXALQarr4QGZdnZm/X3tDOsOq3B9o1EN vq3g0/w3OKQjfkNr447knmoDRuKj8pc5eKQPOcbqnB534+FffpcqaYqqt/Jg1DQtwvr4 Z2q4NdGMFHRxL1eVyE7rZgxyEzdstAL5Qp7cSbVAQ2AE19g0Mdy2h8nHrXYacOJwR3Yi YS+A== X-Forwarded-Encrypted: i=1; AJvYcCVb33q8bmtR6VujeAVTz69ebCiIqX+32zOvCNdArwoAa2tVvb1yDaqs3tDFagLxHTlpRoBppmmri6v8SAQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+cqrakGb27iG3WYwnemoY1wlVZuH4byNOjWGTZPEqBy9hGblj D/ThukCbYSZs5x/SRjRzmRG+FJYfnS65r1/dcm40H3bSZAU2lSkdq6KcwJY6bJ9VUvk= X-Gm-Gg: ATEYQzzpjC7OoJSymN+ANBHAzy5Kwx9jb4PVqFIBDdbK6yt5SznLrupZgcjvLhMn++R bktlos1TeeejbdfMvxL/gFv4dCooYsgC+q5c5fTqqbUNmI/y2QV7yp+GshiumhWMPBUKUGwejhJ u2kekhdFm+X53MNZDXuEpILwku5RCi83pKqGdBVWlu4IazDMieky+qivbdNafsgrP+myMYb3FzS j5+tfNKlJn3HaSYCHFIeQBi2OnU1ktgZRGCHHV+8cWDrliORvvi1/77kxV3wLvTVCLYmDzyLHZW A6Nk1MPgdq76UNiSzrJbDEZ3QJKe2n8MpOCL0bhUkWHvH2HIz8NKCFc5wMjRVk9kcFzsC0acFiy F+MLWabHYkESmyjCvmmDnpdK+1hEGrvP618eaglvkESzw7diZ8G4/TE5EDiLRu8AfMVNuoH+82u gZblLZuSg9jXSgsWHx+DQkFuDppN+WioQyKosTCstWdshBbhGYFlkm3RQ= X-Received: by 2002:a05:6000:1867:b0:437:71b2:6f1a with SMTP id ffacd0b85a97d-4398d79a703mr7957440f8f.0.1772037456952; Wed, 25 Feb 2026 08:37:36 -0800 (PST) Received: from [192.168.0.101] ([90.240.106.137]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43970bfa015sm35229805f8f.8.2026.02.25.08.37.36 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 25 Feb 2026 08:37:36 -0800 (PST) Message-ID: <7ff6638b-53fc-4898-8219-fa498712d401@ursulin.net> Date: Wed, 25 Feb 2026 16:37:35 +0000 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH v3 2/3] drm/syncobj: Add DRM_SYNCOBJ_WAIT_FLAGS_ABORT_ON_ERROR ioctl flag To: Yicong Hui , christian.koenig@amd.com, michel.daenzer@mailbox.org Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, skhan@linuxfoundation.org, david.hunter.linux@gmail.com References: <20260225124609.968505-1-yiconghui@gmail.com> <20260225124609.968505-3-yiconghui@gmail.com> Content-Language: en-GB From: Tvrtko Ursulin In-Reply-To: <20260225124609.968505-3-yiconghui@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 25/02/2026 12:46, Yicong Hui wrote: > Add DRM_SYNCOBJ_WAIT_FLAGS_ABORT_ON_ERROR ioctl flag for the > ioctls DRM_IOCTL_SYNCOBJ_WAIT and DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, which > will make them abort their wait and return the error code and its > associated syncobj. > > Suggested-by: Christian König > Suggested-by: Michel Dänzer > Signed-off-by: Yicong Hui > --- > Changes in v3: > * Fixed inline comments by converting to multi-line comments in > accordance to kernel style guidelines. > * Used dma_fence_get_status to query error instead of getting it > directly. > > drivers/gpu/drm/drm_syncobj.c | 27 +++++++++++++++++++++++---- > include/uapi/drm/drm.h | 6 ++++++ > 2 files changed, 29 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index b74e491f9d8b..2b23f638c1cc 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -1042,6 +1042,7 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, > struct dma_fence *fence; > uint64_t *points; > uint32_t signaled_count, i; > + int status; > > if (flags & (DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT | > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE)) { > @@ -1139,6 +1140,14 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, > if (!fence) > continue; > > + status = dma_fence_get_status(fence); > + if ((flags & DRM_SYNCOBJ_WAIT_FLAGS_ABORT_ON_ERROR) && status < 0) { > + if (idx) > + *idx = i; > + timeout = status; > + goto done_waiting; > + } > + > if ((flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE) || > dma_fence_is_signaled(fence) || > (!entries[i].fence_cb.func && > @@ -1242,8 +1251,12 @@ static int drm_syncobj_array_wait(struct drm_device *dev, > wait->flags, > timeout, &first, > deadline); I am calling this helper an unhelpful helper and was suggesting to get rid of it: https://lore.kernel.org/dri-devel/20250611140057.27259-2-tvrtko.ursulin@igalia.com/ """ Helper which fails to consolidate the code and instead just forks into two copies of the code based on a boolean parameter is not very helpful or readable. Lets just remove it and proof in the pudding is the net smaller code. """ Can we please nuke it? > - if (timeout < 0) > + if (timeout < 0) { > + if (wait->flags & DRM_SYNCOBJ_WAIT_FLAGS_ABORT_ON_ERROR) > + wait->first_signaled = first; There can be timeout < 0 for reasons other than DRM_SYNCOBJ_WAIT_FLAGS_ABORT_ON_ERROR. Will 'first' contain a valid value to return to userspace in that case? Will userspace even be able to meaningfully distinguish between ioctl returning negative due some random error, versus a fence error where otherwise nothing else failed? > + > return timeout; > + } > wait->first_signaled = first; > } else { > timeout = drm_timeout_abs_to_jiffies(timeline_wait->timeout_nsec); > @@ -1253,8 +1266,12 @@ static int drm_syncobj_array_wait(struct drm_device *dev, > timeline_wait->flags, > timeout, &first, > deadline); > - if (timeout < 0) > + if (timeout < 0) { > + if (timeline_wait->flags & DRM_SYNCOBJ_WAIT_FLAGS_ABORT_ON_ERROR) > + timeline_wait->first_signaled = first; > + > return timeout; > + } > timeline_wait->first_signaled = first; > } > return 0; > @@ -1332,7 +1349,8 @@ drm_syncobj_wait_ioctl(struct drm_device *dev, void *data, > > possible_flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL | > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT | > - DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE; > + DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE | > + DRM_SYNCOBJ_WAIT_FLAGS_ABORT_ON_ERROR; > > if (args->flags & ~possible_flags) > return -EINVAL; > @@ -1376,7 +1394,8 @@ drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data, > possible_flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL | > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT | > DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE | > - DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE; > + DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE | > + DRM_SYNCOBJ_WAIT_FLAGS_ABORT_ON_ERROR; > > if (args->flags & ~possible_flags) > return -EINVAL; > diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h > index 213b4dc9b612..e998d9351525 100644 > --- a/include/uapi/drm/drm.h > +++ b/include/uapi/drm/drm.h > @@ -977,6 +977,12 @@ struct drm_syncobj_transfer { > #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1) > #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 2) /* wait for time point to become available */ > #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_DEADLINE (1 << 3) /* set fence deadline to deadline_nsec */ > +/* > + * As soon as any of the fences in the set have an error, > + * abort waiting and return its error code. Index of this > + * first failed fence is returned in first_signaled. What else can be returned in first_signaled? Regards, Tvrtko > + */ > +#define DRM_SYNCOBJ_WAIT_FLAGS_ABORT_ON_ERROR (1 << 4) > struct drm_syncobj_wait { > __u64 handles; > /* absolute timeout */