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

Commit 4d8bb2cb authored by Jens Axboe's avatar Jens Axboe Committed by David Howells
Browse files

SLOW_WORK: Make slow_work_ops ->get_ref/->put_ref optional



Make the ability for the slow-work facility to take references on a work item
optional as not everyone requires this.

Even the internal slow-work stubs them out, so those can be got rid of too.

Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 3d7a641e
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -125,7 +125,7 @@ ITEM OPERATIONS
===============
===============


Each work item requires a table of operations of type struct slow_work_ops.
Each work item requires a table of operations of type struct slow_work_ops.
All members are required:
Only ->execute() is required, getting and putting of a reference are optional.


 (*) Get a reference on an item:
 (*) Get a reference on an item:


+16 −20
Original line number Original line Diff line number Diff line
@@ -145,6 +145,20 @@ static DECLARE_COMPLETION(slow_work_last_thread_exited);
static int slow_work_user_count;
static int slow_work_user_count;
static DEFINE_MUTEX(slow_work_user_lock);
static DEFINE_MUTEX(slow_work_user_lock);


static inline int slow_work_get_ref(struct slow_work *work)
{
	if (work->ops->get_ref)
		return work->ops->get_ref(work);

	return 0;
}

static inline void slow_work_put_ref(struct slow_work *work)
{
	if (work->ops->put_ref)
		work->ops->put_ref(work);
}

/*
/*
 * Calculate the maximum number of active threads in the pool that are
 * Calculate the maximum number of active threads in the pool that are
 * permitted to process very slow work items.
 * permitted to process very slow work items.
@@ -248,7 +262,7 @@ static bool slow_work_execute(int id)
	}
	}


	/* sort out the race between module unloading and put_ref() */
	/* sort out the race between module unloading and put_ref() */
	work->ops->put_ref(work);
	slow_work_put_ref(work);


#ifdef CONFIG_MODULES
#ifdef CONFIG_MODULES
	module = slow_work_thread_processing[id];
	module = slow_work_thread_processing[id];
@@ -309,7 +323,6 @@ int slow_work_enqueue(struct slow_work *work)
	BUG_ON(slow_work_user_count <= 0);
	BUG_ON(slow_work_user_count <= 0);
	BUG_ON(!work);
	BUG_ON(!work);
	BUG_ON(!work->ops);
	BUG_ON(!work->ops);
	BUG_ON(!work->ops->get_ref);


	/* when honouring an enqueue request, we only promise that we will run
	/* when honouring an enqueue request, we only promise that we will run
	 * the work function in the future; we do not promise to run it once
	 * the work function in the future; we do not promise to run it once
@@ -339,7 +352,7 @@ int slow_work_enqueue(struct slow_work *work)
		if (test_bit(SLOW_WORK_EXECUTING, &work->flags)) {
		if (test_bit(SLOW_WORK_EXECUTING, &work->flags)) {
			set_bit(SLOW_WORK_ENQ_DEFERRED, &work->flags);
			set_bit(SLOW_WORK_ENQ_DEFERRED, &work->flags);
		} else {
		} else {
			if (work->ops->get_ref(work) < 0)
			if (slow_work_get_ref(work) < 0)
				goto cant_get_ref;
				goto cant_get_ref;
			if (test_bit(SLOW_WORK_VERY_SLOW, &work->flags))
			if (test_bit(SLOW_WORK_VERY_SLOW, &work->flags))
				list_add_tail(&work->link, &vslow_work_queue);
				list_add_tail(&work->link, &vslow_work_queue);
@@ -479,21 +492,6 @@ static void slow_work_cull_timeout(unsigned long data)
	wake_up(&slow_work_thread_wq);
	wake_up(&slow_work_thread_wq);
}
}


/*
 * Get a reference on slow work thread starter
 */
static int slow_work_new_thread_get_ref(struct slow_work *work)
{
	return 0;
}

/*
 * Drop a reference on slow work thread starter
 */
static void slow_work_new_thread_put_ref(struct slow_work *work)
{
}

/*
/*
 * Start a new slow work thread
 * Start a new slow work thread
 */
 */
@@ -529,8 +527,6 @@ static void slow_work_new_thread_execute(struct slow_work *work)


static const struct slow_work_ops slow_work_new_thread_ops = {
static const struct slow_work_ops slow_work_new_thread_ops = {
	.owner		= THIS_MODULE,
	.owner		= THIS_MODULE,
	.get_ref	= slow_work_new_thread_get_ref,
	.put_ref	= slow_work_new_thread_put_ref,
	.execute	= slow_work_new_thread_execute,
	.execute	= slow_work_new_thread_execute,
};
};