staging: vchiq_arm: Do not retry bulk transfers on -EINTR
authorUmang Jain <umang.jain@ideasonboard.com>
Wed, 18 Sep 2024 16:30:59 +0000 (22:00 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 9 Oct 2024 09:58:47 +0000 (11:58 +0200)
-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>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c

index d4c70a220b9e363ec09275e863562aa5d8d1b650..dfe2ad99a1bd38c5a506f627b4752fee7e9ea5fe 100644 (file)
@@ -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;