[PATCH 03/21] drm/xe/eudebug: Introduce eudebug support

Mika Kuoppala mika.kuoppala at linux.intel.com
Wed Aug 21 11:38:47 UTC 2024


Zbigniew Kempczyński <zbigniew.kempczynski at intel.com> writes:

> On Fri, Jul 26, 2024 at 05:08:00PM +0300, Mika Kuoppala wrote:
>
> <cut>
>
>> +static long xe_eudebug_read_event(struct xe_eudebug *d,
>> +				  const u64 arg,
>> +				  const bool wait)
>> +{
>> +	struct xe_device *xe = d->xe;
>> +	struct drm_xe_eudebug_event __user * const user_orig =
>> +		u64_to_user_ptr(arg);
>> +	struct drm_xe_eudebug_event user_event;
>> +	struct xe_eudebug_event *event;
>> +	long ret = 0;
>> +
>> +	if (XE_IOCTL_DBG(xe, copy_from_user(&user_event, user_orig, sizeof(user_event))))
>> +		return -EFAULT;
>> +
>> +	if (XE_IOCTL_DBG(xe, !user_event.type))
>> +		return -EINVAL;
>> +
>> +	if (XE_IOCTL_DBG(xe, user_event.type > DRM_XE_EUDEBUG_EVENT_MAX_EVENT))
>> +		return -EINVAL;
>> +
>> +	if (XE_IOCTL_DBG(xe, user_event.type != DRM_XE_EUDEBUG_EVENT_READ))
>> +		return -EINVAL;
>> +
>> +	if (XE_IOCTL_DBG(xe, user_event.len < sizeof(*user_orig)))
>> +		return -EINVAL;
>> +
>> +	if (XE_IOCTL_DBG(xe, user_event.flags))
>> +		return -EINVAL;
>> +
>> +	if (XE_IOCTL_DBG(xe, user_event.reserved))
>> +		return -EINVAL;
>> +
>> +	/* XXX: define wait time in connect arguments ? */
>> +	if (wait) {
>> +		ret = wait_event_interruptible_timeout(d->events.write_done,
>> +						       event_fifo_has_events(d),
>> +						       msecs_to_jiffies(5 * 1000));
>> +
>> +		if (XE_IOCTL_DBG(xe, ret < 0))
>> +			return ret;
>> +	}
>> +
>> +	ret = 0;
>> +	spin_lock(&d->events.lock);
>> +	event = event_fifo_pending(d);
>> +	if (event) {
>> +		if (user_event.len < event->len) {
>> +			ret = -EMSGSIZE;
>
> Maybe it is worth to copy event->len to user_orig? I wonder how
> userspace guesses the size of the buffer to allocate for the event.

Makes sense. I will deliver event->len in v2. Thanks.
-Mika

>
> --
> Zbigniew


More information about the Intel-xe mailing list