Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df9d8c41 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Amit Pundir
Browse files

CHROMIUM: dma-buf: dma-fence: fix warning when releasing active sync point



Userspace can close the sync device while there are still active fence
points, in which case kernel produces the following warning:

[   43.853176] ------------[ cut here ]------------
[   43.857834] WARNING: CPU: 0 PID: 892 at /mnt/host/source/src/third_party/kernel/v3.18/drivers/staging/android/sync.c:439 android_fence_release+0x88/0x104()
[   43.871741] CPU: 0 PID: 892 Comm: Binder_5 Tainted: G     U 3.18.0-07661-g0550ce9 #1
[   43.880176] Hardware name: Google Tegra210 Smaug Rev 1+ (DT)
[   43.885834] Call trace:
[   43.888294] [<ffffffc000207464>] dump_backtrace+0x0/0x10c
[   43.893697] [<ffffffc000207580>] show_stack+0x10/0x1c
[   43.898756] [<ffffffc000ab1258>] dump_stack+0x74/0xb8
[   43.903814] [<ffffffc00021d414>] warn_slowpath_common+0x84/0xb0
[   43.909736] [<ffffffc00021d530>] warn_slowpath_null+0x14/0x20
[   43.915482] [<ffffffc00088aefc>] android_fence_release+0x84/0x104
[   43.921582] [<ffffffc000671cc4>] fence_release+0x104/0x134
[   43.927066] [<ffffffc00088b0cc>] sync_fence_free+0x74/0x9c
[   43.932552] [<ffffffc00088b128>] sync_fence_release+0x34/0x48
[   43.938304] [<ffffffc000317bbc>] __fput+0x100/0x1b8
[   43.943185] [<ffffffc000317cc8>] ____fput+0x8/0x14
[   43.947982] [<ffffffc000237f38>] task_work_run+0xb0/0xe4
[   43.953297] [<ffffffc000207074>] do_notify_resume+0x44/0x5c
[   43.958867] ---[ end trace 5a2aa4027cc5d171 ]---

Let's fix it by introducing a new optional callback (disable_signaling)
to fence operations so that drivers can do proper clean ups when we
remove last callback for given fence.

BUG=chrome-os-partner:40303
TEST=Boot Smaug and observe that warning is gone.

Change-Id: I05c34dcf74438c28405438c7ead0706b1f810fff
Signed-off-by: default avatarDmitry Torokhov <dtor@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/303409


Reviewed-by: default avatarAndrew Bresticker <abrestic@chromium.org>

[AmitP: Refactored original changes by aligning with upstream
        naming convention and by using dma_fence_to_sync_pt()
        helper instead of container_of().

        Also folded following android-4.9 changes into this patch
        fb66dc2a6e5e ("ANDROID: dma-buf/sw_sync: Rename active_list to link")].
Signed-off-by: default avatarAmit Pundir <amit.pundir@linaro.org>
parent 86e76eb7
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -329,8 +329,12 @@ dma_fence_remove_callback(struct dma_fence *fence, struct dma_fence_cb *cb)
	spin_lock_irqsave(fence->lock, flags);

	ret = !list_empty(&cb->node);
	if (ret)
	if (ret) {
		list_del_init(&cb->node);
		if (list_empty(&fence->cb_list))
			if (fence->ops->disable_signaling)
				fence->ops->disable_signaling(fence);
	}

	spin_unlock_irqrestore(fence->lock, flags);

+8 −0
Original line number Diff line number Diff line
@@ -169,6 +169,13 @@ static bool timeline_fence_enable_signaling(struct dma_fence *fence)
	return true;
}

static void timeline_fence_disable_signaling(struct dma_fence *fence)
{
	struct sync_pt *pt = dma_fence_to_sync_pt(fence);

	list_del_init(&pt->link);
}

static void timeline_fence_value_str(struct dma_fence *fence,
				    char *str, int size)
{
@@ -187,6 +194,7 @@ static const struct dma_fence_ops timeline_fence_ops = {
	.get_driver_name = timeline_fence_get_driver_name,
	.get_timeline_name = timeline_fence_get_timeline_name,
	.enable_signaling = timeline_fence_enable_signaling,
	.disable_signaling = timeline_fence_disable_signaling,
	.signaled = timeline_fence_signaled,
	.wait = dma_fence_default_wait,
	.release = timeline_fence_release,
+2 −0
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ struct dma_fence_cb {
 * @get_driver_name: returns the driver name.
 * @get_timeline_name: return the name of the context this fence belongs to.
 * @enable_signaling: enable software signaling of fence.
 * @disable_signaling: disable software signaling of fence (optional).
 * @signaled: [optional] peek whether the fence is signaled, can be null.
 * @wait: custom wait implementation, or dma_fence_default_wait.
 * @release: [optional] called on destruction of fence, can be null
@@ -170,6 +171,7 @@ struct dma_fence_ops {
	const char * (*get_driver_name)(struct dma_fence *fence);
	const char * (*get_timeline_name)(struct dma_fence *fence);
	bool (*enable_signaling)(struct dma_fence *fence);
	void (*disable_signaling)(struct dma_fence *fence);
	bool (*signaled)(struct dma_fence *fence);
	signed long (*wait)(struct dma_fence *fence,
			    bool intr, signed long timeout);