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

Commit 52d4b09f authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: Fix list corruption in worker initialization of mem_entry"

parents a1296498 ff332e83
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -239,22 +239,30 @@ const char *kgsl_context_type(int type)
	return "ANY";
}

/* Scheduled by kgsl_mem_entry_put_deferred() */
static void _deferred_put(struct work_struct *work)
/* Scheduled by kgsl_mem_entry_destroy_deferred() */
static void _deferred_destroy(struct work_struct *work)
{
	struct kgsl_mem_entry *entry =
		container_of(work, struct kgsl_mem_entry, work);

	kgsl_mem_entry_put(entry);
	kgsl_mem_entry_destroy(&entry->refcount);
}

/* Use a worker to put the refcount on mem entry */
void kgsl_mem_entry_put_deferred(struct kgsl_mem_entry *entry)
static void kgsl_mem_entry_destroy_deferred(struct kref *kref)
{
	INIT_WORK(&entry->work, _deferred_put);
	struct kgsl_mem_entry *entry =
		container_of(kref, struct kgsl_mem_entry, refcount);

	INIT_WORK(&entry->work, _deferred_destroy);
	queue_work(kgsl_driver.mem_workqueue, &entry->work);
}

void kgsl_mem_entry_put_deferred(struct kgsl_mem_entry *entry)
{
	if (entry)
		kref_put(&entry->refcount, kgsl_mem_entry_destroy_deferred);
}

static struct kgsl_mem_entry *kgsl_mem_entry_create(void)
{
	struct kgsl_mem_entry *entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+6 −3
Original line number Diff line number Diff line
@@ -562,9 +562,12 @@ kgsl_mem_entry_put(struct kgsl_mem_entry *entry)
}

/**
 * kgsl_mem_entry_put_deferred() - use a worker to put the refcount
 * on mem entry from a sysfs handler or debugfs handler.
 * @entry - The memory entry
 * kgsl_mem_entry_put_deferred() - Puts refcount and triggers deferred
 * mem_entry destroy when refcount is the last refcount.
 * @entry: memory entry to be put.
 *
 * Use this to put a memory entry when we don't want to block
 * the caller while destroying memory entry.
 */
void kgsl_mem_entry_put_deferred(struct kgsl_mem_entry *entry);