summaryrefslogtreecommitdiffstats
path: root/bcm2835-vchiq-use-interruptible-waits.patch
diff options
context:
space:
mode:
Diffstat (limited to 'bcm2835-vchiq-use-interruptible-waits.patch')
-rw-r--r--bcm2835-vchiq-use-interruptible-waits.patch326
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(&quota_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