summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUmang Jain <umang.jain@ideasonboard.com>2024-09-18 19:30:59 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-10-09 12:58:47 +0300
commitec5d292db3bd669ea595f07cb59c500bae8ff7a4 (patch)
tree6b1f056d0ed05dc01e7cef6439a588aede0f38b7
parent80f8ea98e43e2b3e62c576af0a60efba9608d8f1 (diff)
downloadlinux-ec5d292db3bd669ea595f07cb59c500bae8ff7a4.tar.xz
staging: vchiq_arm: Do not retry bulk transfers on -EINTR
-EINTR is returned by various vchiq bulk transfer code paths on receiving a fatal signal to the process. Since the process is deemed to be terminated anyway, do not retry the bulk transfer on -EINTR. Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Link: https://lore.kernel.org/r/20240918163100.870596-6-umang.jain@ideasonboard.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c74
1 files changed, 25 insertions, 49 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 d4c70a220b9e..dfe2ad99a1bd 100644
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
@@ -853,31 +853,19 @@ vchiq_bulk_transmit(struct vchiq_instance *instance, unsigned int handle, const
{
int ret;
- while (1) {
- switch (mode) {
- case VCHIQ_BULK_MODE_NOCALLBACK:
- case VCHIQ_BULK_MODE_CALLBACK:
- ret = vchiq_bulk_xfer_callback(instance, handle, (void *)data,
- NULL, size, mode, userdata,
- VCHIQ_BULK_TRANSMIT);
- break;
- case VCHIQ_BULK_MODE_BLOCKING:
- ret = vchiq_blocking_bulk_transfer(instance, handle, (void *)data, size,
- VCHIQ_BULK_TRANSMIT);
- break;
- default:
- return -EINVAL;
- }
-
- /*
- * vchiq_*_bulk_transfer() may return -EINTR, so we need
- * to implement a retry mechanism since this function is
- * supposed to block until queued
- */
- if (ret != -EINTR)
- break;
-
- msleep(1);
+ switch (mode) {
+ case VCHIQ_BULK_MODE_NOCALLBACK:
+ case VCHIQ_BULK_MODE_CALLBACK:
+ ret = vchiq_bulk_xfer_callback(instance, handle, (void *)data,
+ NULL, size, mode, userdata,
+ VCHIQ_BULK_TRANSMIT);
+ break;
+ case VCHIQ_BULK_MODE_BLOCKING:
+ ret = vchiq_blocking_bulk_transfer(instance, handle, (void *)data, size,
+ VCHIQ_BULK_TRANSMIT);
+ break;
+ default:
+ return -EINVAL;
}
return ret;
@@ -890,30 +878,18 @@ int vchiq_bulk_receive(struct vchiq_instance *instance, unsigned int handle,
{
int ret;
- while (1) {
- switch (mode) {
- case VCHIQ_BULK_MODE_NOCALLBACK:
- case VCHIQ_BULK_MODE_CALLBACK:
- ret = vchiq_bulk_xfer_callback(instance, handle, (void *)data, NULL,
- size, mode, userdata, VCHIQ_BULK_RECEIVE);
- break;
- case VCHIQ_BULK_MODE_BLOCKING:
- ret = vchiq_blocking_bulk_transfer(instance, handle, (void *)data, size,
- VCHIQ_BULK_RECEIVE);
- break;
- default:
- return -EINVAL;
- }
-
- /*
- * vchiq_*_bulk_transfer() may return -EINTR, so we need
- * to implement a retry mechanism since this function is
- * supposed to block until queued
- */
- if (ret != -EINTR)
- break;
-
- msleep(1);
+ switch (mode) {
+ case VCHIQ_BULK_MODE_NOCALLBACK:
+ case VCHIQ_BULK_MODE_CALLBACK:
+ ret = vchiq_bulk_xfer_callback(instance, handle, (void *)data, NULL,
+ size, mode, userdata, VCHIQ_BULK_RECEIVE);
+ break;
+ case VCHIQ_BULK_MODE_BLOCKING:
+ ret = vchiq_blocking_bulk_transfer(instance, handle, (void *)data, size,
+ VCHIQ_BULK_RECEIVE);
+ break;
+ default:
+ return -EINVAL;
}
return ret;