summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlinyuny <linyuny@google.com>2022-08-04 00:59:08 +0000
committerHolmes Chou <holmeschou@google.com>2023-02-13 00:52:12 +0000
commit3e4841ac3fb822ebdb98d0e95451bf4b43758002 (patch)
tree4b532c8b47e16e254bc980ab9a49deaa50eccfcb
parent3b31058eca466200ad9703b0f631c8fde922b8b5 (diff)
downloadlwis-3e4841ac3fb822ebdb98d0e95451bf4b43758002.tar.gz
LWIS: Remove tasklet context for LWIS transactions
Bug: 239605455 Test: atest LwisClientAndroidTest, atest android.hardware.camera2.cts.PerformanceTest Signed-off-by: linyuny <linyuny@google.com> Change-Id: I1fe1cedcbbffdb339287563bfe668feac7058631
-rw-r--r--lwis_device.h3
-rw-r--r--lwis_transaction.c59
2 files changed, 12 insertions, 50 deletions
diff --git a/lwis_device.h b/lwis_device.h
index ea62088..2e19917 100644
--- a/lwis_device.h
+++ b/lwis_device.h
@@ -316,12 +316,9 @@ struct lwis_client {
DECLARE_HASHTABLE(enrolled_buffers, BUFFER_HASH_BITS);
/* Hash table of transactions keyed by trigger event ID */
DECLARE_HASHTABLE(transaction_list, TRANSACTION_HASH_BITS);
- /* Transaction task-related variables */
- struct tasklet_struct transaction_tasklet;
/* Spinlock used to synchronize access to transaction data structs */
spinlock_t transaction_lock;
/* List of transaction triggers */
- struct list_head transaction_process_queue_tasklet;
struct list_head transaction_process_queue;
/* Transaction counter, which also provides transacton ID */
int64_t transaction_counter;
diff --git a/lwis_transaction.c b/lwis_transaction.c
index 1ba981a..05aa3b6 100644
--- a/lwis_transaction.c
+++ b/lwis_transaction.c
@@ -349,20 +349,20 @@ static void cancel_transaction(struct lwis_device *lwis_dev, struct lwis_transac
lwis_transaction_free(lwis_dev, transaction);
}
-static void process_transactions_in_queue(struct lwis_client *client,
- struct list_head *transaction_queue, bool in_irq)
+static void transaction_work_func(struct kthread_work *work)
{
unsigned long flags;
- struct lwis_transaction *transaction;
+ struct lwis_client *client = container_of(work, struct lwis_client, transaction_work);
struct list_head *it_tran, *it_tran_tmp;
struct list_head pending_events;
struct list_head pending_fences;
+ struct lwis_transaction *transaction;
INIT_LIST_HEAD(&pending_events);
INIT_LIST_HEAD(&pending_fences);
spin_lock_irqsave(&client->transaction_lock, flags);
- list_for_each_safe (it_tran, it_tran_tmp, transaction_queue) {
+ list_for_each_safe (it_tran, it_tran_tmp, &client->transaction_process_queue) {
transaction = list_entry(it_tran, struct lwis_transaction, process_queue_node);
list_del(&transaction->process_queue_node);
if (transaction->resp->error_code) {
@@ -372,36 +372,20 @@ static void process_transactions_in_queue(struct lwis_client *client,
} else {
spin_unlock_irqrestore(&client->transaction_lock, flags);
process_transaction(client, transaction, &pending_events, &pending_fences,
- in_irq,
+ /*in_irq=*/false,
/*skip_err=*/false);
spin_lock_irqsave(&client->transaction_lock, flags);
}
}
spin_unlock_irqrestore(&client->transaction_lock, flags);
- lwis_pending_events_emit(client->lwis_dev, &pending_events, in_irq);
+ lwis_pending_events_emit(client->lwis_dev, &pending_events, /*in_irq=*/false);
lwis_fences_pending_signal_emit(client->lwis_dev, &pending_fences);
}
-static void transaction_tasklet_func(unsigned long data)
-{
- struct lwis_client *client = (struct lwis_client *)data;
-
- process_transactions_in_queue(client, &client->transaction_process_queue_tasklet,
- /*in_irq=*/true);
-}
-
-static void transaction_work_func(struct kthread_work *work)
-{
- struct lwis_client *client = container_of(work, struct lwis_client, transaction_work);
- process_transactions_in_queue(client, &client->transaction_process_queue, /*in_irq=*/false);
-}
-
int lwis_transaction_init(struct lwis_client *client)
{
spin_lock_init(&client->transaction_lock);
- INIT_LIST_HEAD(&client->transaction_process_queue_tasklet);
- tasklet_init(&client->transaction_tasklet, transaction_tasklet_func, (unsigned long)client);
INIT_LIST_HEAD(&client->transaction_process_queue);
kthread_init_work(&client->transaction_work, transaction_work_func);
client->transaction_counter = 0;
@@ -420,7 +404,6 @@ int lwis_transaction_clear(struct lwis_client *client)
"Failed to wait for all in-process transactions to complete (%d)\n", ret);
return ret;
}
- tasklet_kill(&client->transaction_tasklet);
return 0;
}
@@ -478,18 +461,12 @@ int lwis_transaction_client_flush(struct lwis_client *client)
if (client->lwis_dev->transaction_worker_thread)
kthread_flush_worker(&client->lwis_dev->transaction_worker);
- /* Wait for tasklet to complete in-progress transactions and disable. */
- tasklet_disable(&client->transaction_tasklet);
-
spin_lock_irqsave(&client->transaction_lock, flags);
- /* Both transaction queues should be empty after draining, but check anyway. */
+ /* The transaction queue should be empty after canceling all transactions,
+ * but check anyway. */
cancel_all_transactions_in_queue_locked(client, &client->transaction_process_queue);
- cancel_all_transactions_in_queue_locked(client, &client->transaction_process_queue_tasklet);
spin_unlock_irqrestore(&client->transaction_lock, flags);
- /* Resume the tasklet once making sure transactions are all flushed. */
- tasklet_enable(&client->transaction_tasklet);
-
return 0;
}
@@ -768,16 +745,10 @@ static int queue_transaction_locked(struct lwis_client *client,
if (transaction->queue_immediately) {
/* Immediate trigger. */
- if (info->run_at_real_time) {
- list_add_tail(&transaction->process_queue_node,
- &client->transaction_process_queue_tasklet);
- tasklet_schedule(&client->transaction_tasklet);
- } else {
- list_add_tail(&transaction->process_queue_node,
- &client->transaction_process_queue);
- kthread_queue_work(&client->lwis_dev->transaction_worker,
- &client->transaction_work);
- }
+ list_add_tail(&transaction->process_queue_node,
+ &client->transaction_process_queue);
+ kthread_queue_work(&client->lwis_dev->transaction_worker,
+ &client->transaction_work);
} else if (lwis_triggered_by_condition(transaction)) {
/* Trigger by trigger conditions. */
add_pending_transaction(client, transaction);
@@ -878,9 +849,6 @@ static void defer_transaction_locked(struct lwis_client *client,
process_transaction(client, transaction, pending_events, pending_fences, in_irq,
/*skip_err=*/false);
spin_lock_irqsave(&client->transaction_lock, flags);
- } else if (transaction->info.run_at_real_time) {
- list_add_tail(&transaction->process_queue_node,
- &client->transaction_process_queue_tasklet);
} else {
list_add_tail(&transaction->process_queue_node, &client->transaction_process_queue);
}
@@ -974,9 +942,6 @@ int lwis_transaction_event_trigger(struct lwis_client *client, int64_t event_id,
}
/* Schedule deferred transactions */
- if (!list_empty(&client->transaction_process_queue_tasklet)) {
- tasklet_schedule(&client->transaction_tasklet);
- }
if (!list_empty(&client->transaction_process_queue)) {
kthread_queue_work(&client->lwis_dev->transaction_worker,
&client->transaction_work);