diff options
author | linyuny <linyuny@google.com> | 2022-08-04 00:59:08 +0000 |
---|---|---|
committer | Holmes Chou <holmeschou@google.com> | 2023-02-13 00:52:12 +0000 |
commit | 3e4841ac3fb822ebdb98d0e95451bf4b43758002 (patch) | |
tree | 4b532c8b47e16e254bc980ab9a49deaa50eccfcb | |
parent | 3b31058eca466200ad9703b0f631c8fde922b8b5 (diff) | |
download | lwis-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.h | 3 | ||||
-rw-r--r-- | lwis_transaction.c | 59 |
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); |