diff options
Diffstat (limited to 'bcm2835-vchiq-use-interruptible-waits.patch')
-rw-r--r-- | bcm2835-vchiq-use-interruptible-waits.patch | 326 |
1 files changed, 0 insertions, 326 deletions
diff --git a/bcm2835-vchiq-use-interruptible-waits.patch b/bcm2835-vchiq-use-interruptible-waits.patch index cc4afc63b..d21cbe9b1 100644 --- a/bcm2835-vchiq-use-interruptible-waits.patch +++ b/bcm2835-vchiq-use-interruptible-waits.patch @@ -1,329 +1,3 @@ -From 0fa32f5500a1b4a81d6856ad389d654f1377f744 Mon Sep 17 00:00:00 2001 -From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> -Date: Thu, 9 May 2019 16:31:33 +0200 -Subject: [PATCH 1/4] staging: vchiq_2835_arm: revert "quit using custom - down_interruptible()" - -The killable version of down() is meant to be used on situations where -it should not fail at all costs, but still have the convenience of being -able to kill it if really necessary. VCHIQ doesn't fit this criteria, as -it's mainly used as an interface to V4L2 and ALSA devices. - -Fixes: ff5979ad8636 ("staging: vchiq_2835_arm: quit using custom down_interruptible()") -Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> -Acked-by: Stefan Wahren <stefan.wahren@i2se.com> ---- - .../staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c -index a9cc01e8e6c5..833b28e9ba4b 100644 ---- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c -+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c -@@ -553,7 +553,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type) - (g_cache_line_size - 1)))) { - char *fragments; - -- if (down_killable(&g_free_fragments_sema)) { -+ if (down_interruptible(&g_free_fragments_sema) != 0) { - cleanup_pagelistinfo(pagelistinfo); - return NULL; - } --- -2.21.0 - -From 7c73f359a4f269b611ebc00a910933d2d1926ebe Mon Sep 17 00:00:00 2001 -From: Peter Robinson <pbrobinson@gmail.com> -Date: Thu, 4 Jul 2019 17:31:38 +0100 -Subject: [PATCH 2/4] staging: vchiq: revert "switch to - wait_for_completion_killable" - -The killable version of wait_for_completion() is meant to be used on -situations where it should not fail at all costs, but still have the -convenience of being able to kill it if really necessary. VCHIQ doesn't -fit this criteria, as it's mainly used as an interface to V4L2 and ALSA -devices. - -Fixes: a772f116702e ("staging: vchiq: switch to wait_for_completion_killable") -Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> -Signed-off-by: Peter Robinson <pbrobinson@gmail.com> ---- - .../interface/vchiq_arm/vchiq_arm.c | 21 ++++++++++--------- - .../interface/vchiq_arm/vchiq_core.c | 21 ++++++++++--------- - .../interface/vchiq_arm/vchiq_util.c | 6 +++--- - 3 files changed, 25 insertions(+), 23 deletions(-) - -diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c -index 064d0db4c51e..ccfb8218b83c 100644 ---- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c -+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c -@@ -560,7 +560,8 @@ add_completion(VCHIQ_INSTANCE_T instance, VCHIQ_REASON_T reason, - vchiq_log_trace(vchiq_arm_log_level, - "%s - completion queue full", __func__); - DEBUG_COUNT(COMPLETION_QUEUE_FULL_COUNT); -- if (wait_for_completion_killable( &instance->remove_event)) { -+ if (wait_for_completion_interruptible( -+ &instance->remove_event)) { - vchiq_log_info(vchiq_arm_log_level, - "service_callback interrupted"); - return VCHIQ_RETRY; -@@ -671,7 +672,7 @@ service_callback(VCHIQ_REASON_T reason, struct vchiq_header *header, - } - - DEBUG_TRACE(SERVICE_CALLBACK_LINE); -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &user_service->remove_event) - != 0) { - vchiq_log_info(vchiq_arm_log_level, -@@ -1006,7 +1007,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) - has been closed until the client library calls the - CLOSE_DELIVERED ioctl, signalling close_event. */ - if (user_service->close_pending && -- wait_for_completion_killable( -+ wait_for_completion_interruptible( - &user_service->close_event)) - status = VCHIQ_RETRY; - break; -@@ -1182,7 +1183,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) - - DEBUG_TRACE(AWAIT_COMPLETION_LINE); - mutex_unlock(&instance->completion_mutex); -- rc = wait_for_completion_killable( -+ rc = wait_for_completion_interruptible( - &instance->insert_event); - mutex_lock(&instance->completion_mutex); - if (rc != 0) { -@@ -1352,7 +1353,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) - do { - spin_unlock(&msg_queue_spinlock); - DEBUG_TRACE(DEQUEUE_MESSAGE_LINE); -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &user_service->insert_event)) { - vchiq_log_info(vchiq_arm_log_level, - "DEQUEUE_MESSAGE interrupted"); -@@ -2360,7 +2361,7 @@ vchiq_keepalive_thread_func(void *v) - while (1) { - long rc = 0, uc = 0; - -- if (wait_for_completion_killable(&arm_state->ka_evt) -+ if (wait_for_completion_interruptible(&arm_state->ka_evt) - != 0) { - vchiq_log_error(vchiq_susp_log_level, - "%s interrupted", __func__); -@@ -2611,7 +2612,7 @@ block_resume(struct vchiq_arm_state *arm_state) - write_unlock_bh(&arm_state->susp_res_lock); - vchiq_log_info(vchiq_susp_log_level, "%s wait for previously " - "blocked clients", __func__); -- if (wait_for_completion_killable_timeout( -+ if (wait_for_completion_interruptible_timeout( - &arm_state->blocked_blocker, timeout_val) - <= 0) { - vchiq_log_error(vchiq_susp_log_level, "%s wait for " -@@ -2637,7 +2638,7 @@ block_resume(struct vchiq_arm_state *arm_state) - write_unlock_bh(&arm_state->susp_res_lock); - vchiq_log_info(vchiq_susp_log_level, "%s wait for resume", - __func__); -- if (wait_for_completion_killable_timeout( -+ if (wait_for_completion_interruptible_timeout( - &arm_state->vc_resume_complete, timeout_val) - <= 0) { - vchiq_log_error(vchiq_susp_log_level, "%s wait for " -@@ -2844,7 +2845,7 @@ vchiq_arm_force_suspend(struct vchiq_state *state) - do { - write_unlock_bh(&arm_state->susp_res_lock); - -- rc = wait_for_completion_killable_timeout( -+ rc = wait_for_completion_interruptible_timeout( - &arm_state->vc_suspend_complete, - msecs_to_jiffies(FORCE_SUSPEND_TIMEOUT_MS)); - -@@ -2940,7 +2941,7 @@ vchiq_arm_allow_resume(struct vchiq_state *state) - write_unlock_bh(&arm_state->susp_res_lock); - - if (resume) { -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &arm_state->vc_resume_complete) < 0) { - vchiq_log_error(vchiq_susp_log_level, - "%s interrupted", __func__); -diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c -index 819813e742d8..bc5661dde987 100644 ---- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c -+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c -@@ -590,7 +590,7 @@ reserve_space(struct vchiq_state *state, size_t space, int is_blocking) - remote_event_signal(&state->remote->trigger); - - if (!is_blocking || -- (wait_for_completion_killable( -+ (wait_for_completion_interruptible( - &state->slot_available_event))) - return NULL; /* No space available */ - } -@@ -860,7 +860,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service, - spin_unlock("a_spinlock); - mutex_unlock(&state->slot_mutex); - -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &state->data_quota_event)) - return VCHIQ_RETRY; - -@@ -891,7 +891,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service, - service_quota->slot_use_count); - VCHIQ_SERVICE_STATS_INC(service, quota_stalls); - mutex_unlock(&state->slot_mutex); -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &service_quota->quota_event)) - return VCHIQ_RETRY; - if (service->closing) -@@ -1740,7 +1740,8 @@ parse_rx_slots(struct vchiq_state *state) - &service->bulk_rx : &service->bulk_tx; - - DEBUG_TRACE(PARSE_LINE); -- if (mutex_lock_killable(&service->bulk_mutex)) { -+ if (mutex_lock_killable( -+ &service->bulk_mutex) != 0) { - DEBUG_TRACE(PARSE_LINE); - goto bail_not_ready; - } -@@ -2458,7 +2459,7 @@ vchiq_open_service_internal(struct vchiq_service *service, int client_id) - QMFLAGS_IS_BLOCKING); - if (status == VCHIQ_SUCCESS) { - /* Wait for the ACK/NAK */ -- if (wait_for_completion_killable(&service->remove_event)) { -+ if (wait_for_completion_interruptible(&service->remove_event)) { - status = VCHIQ_RETRY; - vchiq_release_service_internal(service); - } else if ((service->srvstate != VCHIQ_SRVSTATE_OPEN) && -@@ -2825,7 +2826,7 @@ vchiq_connect_internal(struct vchiq_state *state, VCHIQ_INSTANCE_T instance) - } - - if (state->conn_state == VCHIQ_CONNSTATE_CONNECTING) { -- if (wait_for_completion_killable(&state->connect)) -+ if (wait_for_completion_interruptible(&state->connect)) - return VCHIQ_RETRY; - - vchiq_set_conn_state(state, VCHIQ_CONNSTATE_CONNECTED); -@@ -2924,7 +2925,7 @@ vchiq_close_service(VCHIQ_SERVICE_HANDLE_T handle) - } - - while (1) { -- if (wait_for_completion_killable(&service->remove_event)) { -+ if (wait_for_completion_interruptible(&service->remove_event)) { - status = VCHIQ_RETRY; - break; - } -@@ -2985,7 +2986,7 @@ vchiq_remove_service(VCHIQ_SERVICE_HANDLE_T handle) - request_poll(service->state, service, VCHIQ_POLL_REMOVE); - } - while (1) { -- if (wait_for_completion_killable(&service->remove_event)) { -+ if (wait_for_completion_interruptible(&service->remove_event)) { - status = VCHIQ_RETRY; - break; - } -@@ -3068,7 +3069,7 @@ VCHIQ_STATUS_T vchiq_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle, - VCHIQ_SERVICE_STATS_INC(service, bulk_stalls); - do { - mutex_unlock(&service->bulk_mutex); -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &service->bulk_remove_event)) { - status = VCHIQ_RETRY; - goto error_exit; -@@ -3145,7 +3146,7 @@ VCHIQ_STATUS_T vchiq_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle, - - if (bulk_waiter) { - bulk_waiter->bulk = bulk; -- if (wait_for_completion_killable(&bulk_waiter->event)) -+ if (wait_for_completion_interruptible(&bulk_waiter->event)) - status = VCHIQ_RETRY; - else if (bulk_waiter->actual == VCHIQ_BULK_ACTUAL_ABORTED) - status = VCHIQ_ERROR; -diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c -index 55c5fd82b911..30deea1b57f7 100644 ---- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c -+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c -@@ -80,7 +80,7 @@ void vchiu_queue_push(struct vchiu_queue *queue, struct vchiq_header *header) - return; - - while (queue->write == queue->read + queue->size) { -- if (wait_for_completion_killable(&queue->pop)) -+ if (wait_for_completion_interruptible(&queue->pop)) - flush_signals(current); - } - -@@ -93,7 +93,7 @@ void vchiu_queue_push(struct vchiu_queue *queue, struct vchiq_header *header) - struct vchiq_header *vchiu_queue_peek(struct vchiu_queue *queue) - { - while (queue->write == queue->read) { -- if (wait_for_completion_killable(&queue->push)) -+ if (wait_for_completion_interruptible(&queue->push)) - flush_signals(current); - } - -@@ -107,7 +107,7 @@ struct vchiq_header *vchiu_queue_pop(struct vchiu_queue *queue) - struct vchiq_header *header; - - while (queue->write == queue->read) { -- if (wait_for_completion_killable(&queue->push)) -+ if (wait_for_completion_interruptible(&queue->push)) - flush_signals(current); - } - --- -2.21.0 - -From 4d0d97ce18dc90a3ca6296ee669c51b5a55a61c7 Mon Sep 17 00:00:00 2001 -From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> -Date: Thu, 9 May 2019 16:31:35 +0200 -Subject: [PATCH 3/4] staging: vchiq: make wait events interruptible - -The killable version of wait_event() is meant to be used on situations -where it should not fail at all costs, but still have the convenience of -being able to kill it if really necessary. Wait events in VCHIQ doesn't -fit this criteria, as it's mainly used as an interface to V4L2 and ALSA -devices. - -Fixes: 852b2876a8a8 ("staging: vchiq: rework remove_event handling") -Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> ---- - .../vc04_services/interface/vchiq_arm/vchiq_core.c | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - -diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c -index bc5661dde987..0958d86aebe6 100644 ---- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c -+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c -@@ -425,13 +425,21 @@ remote_event_create(wait_queue_head_t *wq, struct remote_event *event) - init_waitqueue_head(wq); - } - -+/* -+ * All the event waiting routines in VCHIQ used a custom semaphore -+ * implementation that filtered most signals. This achieved a behaviour similar -+ * to the "killable" family of functions. While cleaning up this code all the -+ * routines where switched to the "interruptible" family of functions, as the -+ * former was deemed unjustified and the use "killable" set all VCHIQ's -+ * threads in D state. -+ */ - static inline int - remote_event_wait(wait_queue_head_t *wq, struct remote_event *event) - { - if (!event->fired) { - event->armed = 1; - dsb(sy); -- if (wait_event_killable(*wq, event->fired)) { -+ if (wait_event_interruptible(*wq, event->fired)) { - event->armed = 0; - return 0; - } --- -2.21.0 - From e4d9fccaaf6e61bbc7416d92d73cec5a5f0cb458 Mon Sep 17 00:00:00 2001 From: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> Date: Thu, 9 May 2019 16:31:36 +0200 |