[Openpvrsgx-devgroup] [RFC][PATCH] pvrsrv: 1.17: pvr_linux_fence: Repace dma_resv_list by iterator

H. Nikolaus Schaller hns at goldelico.com
Fri Jul 8 07:51:34 CEST 2022


Hi,
I think this is a misleading error message from the shared library loader which does not find all required libs.
Unfortunately we have no source code for pvrsrvctl to compile it against the libs that are available.

	ldd /usr/bin/pvrsrvctl

shows which lib variants and paths it will be looking for (and not finding).

I had to "fix" this on my Debian Bullseye setup by

	ln -sf libffi.so.7 /usr/lib/arm-linux-gnueabihf/libffi.so.6

but I am not sure if that is really working or just shifting the issue to runtime.
What I would need to do is to backport libffi6 package from Stretch or Buster.

BR,
Nikolaus


> Am 07.07.2022 um 23:27 schrieb Anthoine Bourgeois <anthoine.bourgeois at gmail.com>:
> 
> Hi Nikolaus,
> 
> On Thu, Jul 07, 2022 at 11:51:27AM +0200, H. Nikolaus Schaller wrote:
>> Hi Antoine,
>> I could fix my setup a little by upgrading to Debian 11 (Bullseye) but adding a symlink to make libffi7.so be found as libffi6.so (which is baked into the closed source runtime binaries).
>> 
>> Using this I can run pvrsrvctl but it fails with
>> 
>> PVR:(Error): PVRSRVDetectPlaform: Unknown platform: OMAP5432
>> 
>> Maybe the code to patch the binaries is broken on Bullseye by some script incompatibility.
>> Anyways there is no kernel panic or similar so far.
> 
> Good, I also loaded the module but can run pvrsrvctl, it threw me an
> error:
> # pvrsrvctl --start --no-module
> -bash: /usr/bin/pvrsrvctl: No such file or directory
> 
> I don't understand why :-/
> 
> Thanks,
> Anthoine
> 
>> 
>> BR and thanks,
>> Nikolaus
>> 
>> 
>>> Am 04.07.2022 um 09:41 schrieb H. Nikolaus Schaller <hns at goldelico.com>:
>>> 
>>> Oh great! I have just done a compile test which goes fine.
>>> And I can boot an omap5evm with driver loaded.
>>> But I don't know if that initialization already uses (and tests) DMA.
>>> 
>>> And unfortunately I have no working 1.17 user-space setup fulfilling
>>> exact library requirements.
>>> 
>>> Anyone else with a working setup?
>>> 
>>> BR and thanks,
>>> Nikolaus
>>> 
>>> 
>>>> Am 02.07.2022 um 16:09 schrieb Anthoine Bourgeois <anthoine.bourgeois at gmail.com>:
>>>> 
>>>> To be tested! I don't have the hardware, this commit is not tested.
>>>> 
>>>> Replace all the list loops by iterators changes the code so much it wasn't
>>>> clean to do small macro block so there is one macro block per function.
>>>> 
>>>> Fixes: 0980db52e9e4 ("FIXME: pvrsrv: 1.17: pvr_linux_fence: there is no direct access to struct dma_resv_list and no resv->seq mechanism any more")
>>>> Signed-off-by: Anthoine Bourgeois <anthoine.bourgeois at gmail.com>
>>>> ---
>>>> .../srvkm/env/linux/pvr_linux_fence.c         | 234 +++++++++++++++++-
>>>> 1 file changed, 228 insertions(+), 6 deletions(-)
>>>> 
>>>> diff --git a/drivers/gpu/drm/pvrsgx/1.17.4948957/eurasia_km/services4/srvkm/env/linux/pvr_linux_fence.c b/drivers/gpu/drm/pvrsgx/1.17.4948957/eurasia_km/services4/srvkm/env/linux/pvr_linux_fence.c
>>>> index bedce47b6b79..3f45860afc46 100644
>>>> --- a/drivers/gpu/drm/pvrsgx/1.17.4948957/eurasia_km/services4/srvkm/env/linux/pvr_linux_fence.c
>>>> +++ b/drivers/gpu/drm/pvrsgx/1.17.4948957/eurasia_km/services4/srvkm/env/linux/pvr_linux_fence.c
>>>> @@ -538,8 +538,99 @@ static int update_dma_resv_fences_dst(struct pvr_fence_frame *pvr_fence_frame,
>>>> 	dma_resv_add_excl_fence(resv, fence_to_signal);
>>>> 	return update_reservation_return_value(ret, false);
>>>> #else // (LINUX_VERSION_CODE < KERNEL_VERSION(5,19,0))
>>>> -#warning FIXME like in 548e7432dc2da475a18077b612e8d55b8ff51891
>>>> -	return -EINVAL;
>>>> +	struct dma_fence *fence_to_signal;
>>>> +	unsigned blocking_fence_count;
>>>> +	int ret;
>>>> +
>>>> +	struct dma_resv_iter cursor;
>>>> +	struct dma_fence *fence;
>>>> +
>>>> +	dma_resv_lock(resv, NULL);
>>>> +
>>>> +	fence_to_signal = create_fence_to_signal(pvr_fence_frame);
>>>> +	if (!fence_to_signal)
>>>> +	{
>>>> +		ret = -ENOMEM;
>>>> +		goto unlock;
>>>> +	}
>>>> +
>>>> +	if (!pvr_fence_frame->have_blocking_fences)
>>>> +	{
>>>> +		dma_resv_add_fence(resv, fence_to_signal, DMA_RESV_USAGE_WRITE);
>>>> +		dma_resv_unlock(resv);
>>>> +		return 0;
>>>> +	}
>>>> +
>>>> +	dma_resv_for_each_fence(&cursor, resv, DMA_RESV_USAGE_READ, fence) {
>>>> +		if (dma_resv_iter_usage(&cursor) == DMA_RESV_USAGE_READ)
>>>> +			break;
>>>> +
>>>> +		if (is_blocking_fence(fence, pvr_fence_frame))
>>>> +		{
>>>> +			if (allocate_blocking_fence_storage(pvr_fence_frame, 1))
>>>> +			{
>>>> +				ret = install_and_get_blocking_fence(pvr_fence_frame, 0, fence);
>>>> +			}
>>>> +			else
>>>> +			{
>>>> +				dma_fence_put(fence_to_signal);
>>>> +				ret = -ENOMEM;
>>>> +				goto unlock;
>>>> +			}
>>>> +		}
>>>> +		else
>>>> +		{
>>>> +			ret = 1;
>>>> +		}
>>>> +
>>>> +		dma_resv_add_fence(resv, fence_to_signal, DMA_RESV_USAGE_WRITE);
>>>> +		dma_resv_unlock(resv);
>>>> +		return update_reservation_return_value(ret, true);
>>>> +	}
>>>> +
>>>> +	dma_resv_for_each_fence(&cursor, resv, DMA_RESV_USAGE_READ, fence) {
>>>> +		if (dma_resv_iter_usage(&cursor) < DMA_RESV_USAGE_READ)
>>>> +			continue;
>>>> +
>>>> +		if (is_blocking_fence(fence, pvr_fence_frame))
>>>> +		{
>>>> +			blocking_fence_count++;
>>>> +		}
>>>> +	}
>>>> +
>>>> +	ret = 1;
>>>> +	if (blocking_fence_count)
>>>> +	{
>>>> +		if (allocate_blocking_fence_storage(pvr_fence_frame, blocking_fence_count))
>>>> +		{
>>>> +			dma_resv_for_each_fence(&cursor, resv, DMA_RESV_USAGE_READ, fence) {
>>>> +				if (dma_resv_iter_usage(&cursor) < DMA_RESV_USAGE_READ)
>>>> +					continue;
>>>> +
>>>> +				if (is_blocking_fence(fence, pvr_fence_frame))
>>>> +				{
>>>> +					if (!install_and_get_blocking_fence(pvr_fence_frame, cursor.index, fence))
>>>> +					{
>>>> +						ret = 0;
>>>> +					}
>>>> +				}
>>>> +			}
>>>> +		}
>>>> +		else
>>>> +		{
>>>> +			dma_fence_put(fence_to_signal);
>>>> +			ret = -ENOMEM;
>>>> +			goto unlock;
>>>> +		}
>>>> +	}
>>>> +
>>>> +	dma_resv_add_fence(resv, fence_to_signal, DMA_RESV_USAGE_WRITE);
>>>> +	dma_resv_unlock(resv);
>>>> +
>>>> +	return update_reservation_return_value(ret, false);
>>>> +unlock:
>>>> +	dma_resv_unlock(resv);
>>>> +	return ret;
>>>> #endif
>>>> }
>>>> 
>>>> @@ -671,8 +762,100 @@ static int update_dma_resv_fences_src(struct pvr_fence_frame *pvr_fence_frame,
>>>> 
>>>> 	return update_reservation_return_value(ret, !shared_fence_count);
>>>> #else // (LINUX_VERSION_CODE < KERNEL_VERSION(5,19,0))
>>>> -#warning FIXME like in 548e7432dc2da475a18077b612e8d55b8ff51891
>>>> -	return -EINVAL;
>>>> +	struct dma_resv_iter cursor;
>>>> +	struct dma_fence *fence;
>>>> +	struct dma_fence *fence_to_signal = NULL;
>>>> +	struct dma_fence *blocking_fence = NULL;
>>>> +	bool reserve = true;
>>>> +	unsigned shared_fence_count;
>>>> +	int ret;
>>>> +
>>>> +	dma_resv_lock(resv, NULL);
>>>> +
>>>> +	if (!pvr_fence_frame->have_blocking_fences)
>>>> +	{
>>>> +		ret = dma_resv_reserve_fences(resv, 1);
>>>> +		if (ret)
>>>> +		{
>>>> +			goto unlock;
>>>> +		}
>>>> +
>>>> +		fence_to_signal = create_fence_to_signal(pvr_fence_frame);
>>>> +		if (!fence_to_signal)
>>>> +		{
>>>> +			ret = -ENOMEM;
>>>> +			goto unlock;
>>>> +		}
>>>> +
>>>> +		dma_resv_add_fence(resv, fence_to_signal, DMA_RESV_USAGE_READ);
>>>> +
>>>> +		ret = 0;
>>>> +		goto unlock;
>>>> +	}
>>>> +
>>>> +	shared_fence_count = 0;
>>>> +	dma_resv_for_each_fence(&cursor, resv, DMA_RESV_USAGE_READ, fence) {
>>>> +		if (dma_resv_iter_usage(&cursor) <= DMA_RESV_USAGE_WRITE)
>>>> +			continue;
>>>> +
>>>> +		shared_fence_count++;
>>>> +
>>>> +		if (is_pvr_fence(fence))
>>>> +		{
>>>> +			reserve = false;
>>>> +
>>>> +			if (is_blocking_fence(fence, pvr_fence_frame))
>>>> +			{
>>>> +				blocking_fence = fence;
>>>> +			}
>>>> +			break;
>>>> +		}
>>>> +	}
>>>> +
>>>> +	if (reserve)
>>>> +	{
>>>> +		ret = dma_resv_reserve_fences(resv, 1);
>>>> +		if (ret)
>>>> +		{
>>>> +			goto unlock;
>>>> +		}
>>>> +	}
>>>> +
>>>> +	fence_to_signal = create_fence_to_signal(pvr_fence_frame);
>>>> +	if (!fence_to_signal)
>>>> +	{
>>>> +		ret = -ENOMEM;
>>>> +		goto unlock;
>>>> +	}
>>>> +
>>>> +	ret = 1;
>>>> +	if (!blocking_fence && !shared_fence_count)
>>>> +	{
>>>> +		dma_resv_for_each_fence(&cursor, resv, DMA_RESV_USAGE_WRITE, fence) {
>>>> +			if (is_blocking_fence(fence, pvr_fence_frame))
>>>> +			{
>>>> +				if (allocate_blocking_fence_storage(pvr_fence_frame, 1))
>>>> +				{
>>>> +					ret = install_and_get_blocking_fence(pvr_fence_frame, 0, fence);
>>>> +				}
>>>> +				else
>>>> +				{
>>>> +					ret = -ENOMEM;
>>>> +					dma_fence_put(fence_to_signal);
>>>> +					goto unlock;
>>>> +				}
>>>> +				break;
>>>> +			}
>>>> +		}
>>>> +	}
>>>> +
>>>> +	dma_resv_add_fence(resv, fence_to_signal, DMA_RESV_USAGE_READ);
>>>> +	dma_resv_unlock(resv);
>>>> +
>>>> +	return update_reservation_return_value(ret, !shared_fence_count);
>>>> +unlock:
>>>> +	dma_resv_lock(resv, NULL);
>>>> +	return ret;
>>>> #endif
>>>> }
>>>> 
>>>> @@ -1090,8 +1273,47 @@ static bool resv_is_blocking(struct dma_resv *resv,
>>>> 	rcu_read_unlock();
>>>> 	goto retry;
>>>> #else
>>>> -	// FIXME: there is no resv-seq any more since 8f94eda39952a8c7323bad2bf752bdfe78101b20
>>>> -	return true;
>>>> +	struct dma_resv_iter cursor;
>>>> +	struct dma_fence *fence;
>>>> +	bool blocking;
>>>> +
>>>> +	blocking = false;
>>>> +
>>>> +	rcu_read_lock();
>>>> +
>>>> +	if (is_dst)
>>>> +	{
>>>> +		dma_resv_iter_begin(&cursor, resv, DMA_RESV_USAGE_READ);
>>>> +		dma_resv_for_each_fence_unlocked(&cursor, fence) {
>>>> +			if (dma_resv_iter_usage(&cursor) <= DMA_RESV_USAGE_WRITE)
>>>> +				continue;
>>>> +
>>>> +			blocking = fence_is_blocking(fence, psSyncInfo);
>>>> +			if (blocking)
>>>> +				break;
>>>> +		}
>>>> +		dma_resv_iter_end(&cursor);
>>>> +	}
>>>> +
>>>> +	if (!blocking)
>>>> +	{
>>>> +		dma_resv_iter_begin(&cursor, resv, DMA_RESV_USAGE_READ);
>>>> +		dma_resv_for_each_fence_unlocked(&cursor, fence) {
>>>> +			if (dma_resv_iter_usage(&cursor) == DMA_RESV_USAGE_READ) {
>>>> +				break;
>>>> +			}
>>>> +
>>>> +			if (fence_is_blocking(fence, psSyncInfo)) {
>>>> +				blocking = true;
>>>> +				break;
>>>> +			}
>>>> +		}
>>>> +		dma_resv_iter_end(&cursor);
>>>> +	}
>>>> +
>>>> +	rcu_read_unlock();
>>>> +
>>>> +	return blocking;
>>>> #endif
>>>> }
>>>> 
>>>> --
>>>> 2.35.1
>>>> 
>>> 
>>> _______________________________________________
>>> https://github.com/openpvrsgx-devgroup/linux_openpvrsgx
>>> openpvrsgx-devgroup mailing list
>>> openpvrsgx-devgroup at letux.org
>>> https://lists.goldelico.com/mailman/listinfo.cgi/openpvrsgx-devgroup
>> 



More information about the openpvrsgx-devgroup mailing list