]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
staging: vchiq_core: Bulk waiter should not piggy back on bulk userdata
authorUmang Jain <umang.jain@ideasonboard.com>
Wed, 23 Oct 2024 11:04:02 +0000 (16:34 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 3 Nov 2024 23:55:06 +0000 (00:55 +0100)
Currently, struct bulk_waiter is allocated for VCHIQ_BULK_MODE_BLOCKING
bulk transfer and its pointer is assigned to vchiq_bulk->userdata. Avoid
this kind of piggybacking and introduce a dedicate 'waiter' member in
struct vchiq_bulk.

The 'userdata' is meant for VCHIQ_BULK_MODE_CALLBACK mode, to pass user
specified parameter to the actual callback function.

Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Link: https://lore.kernel.org/r/20241023110406.885199-3-umang.jain@ideasonboard.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c

index f23d98a1b96081784071a05d1399d729fbd841df..ff627b297bc4455c12dff065afc8cf5c8bd107ef 100644 (file)
@@ -594,7 +594,7 @@ vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handl
                                 * Cancel the signal when the transfer completes.
                                 */
                                spin_lock(&service->state->bulk_waiter_spinlock);
-                               bulk->userdata = NULL;
+                               bulk->waiter = NULL;
                                spin_unlock(&service->state->bulk_waiter_spinlock);
                        }
                }
@@ -604,7 +604,7 @@ vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handl
                        return -ENOMEM;
        }
 
-       bulk_params->userdata = &waiter->bulk_waiter;
+       bulk_params->waiter = &waiter->bulk_waiter;
 
        ret = vchiq_bulk_xfer_blocking(instance, handle, bulk_params);
        if ((ret != -EAGAIN) || fatal_signal_pending(current) || !waiter->bulk_waiter.bulk) {
@@ -613,7 +613,7 @@ vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handl
                if (bulk) {
                        /* Cancel the signal when the transfer completes. */
                        spin_lock(&service->state->bulk_waiter_spinlock);
-                       bulk->userdata = NULL;
+                       bulk->waiter = NULL;
                        spin_unlock(&service->state->bulk_waiter_spinlock);
                }
                kfree(waiter);
index 1e3b2d76fcb61826b60b91d8a2154f3a512fc3f8..393e1f24a2a781811f2762b773cc48e930d4714e 100644 (file)
@@ -1330,7 +1330,7 @@ static int service_notify_bulk(struct vchiq_service *service,
                struct bulk_waiter *waiter;
 
                spin_lock(&service->state->bulk_waiter_spinlock);
-               waiter = bulk->userdata;
+               waiter = bulk->waiter;
                if (waiter) {
                        waiter->actual = bulk->actual;
                        complete(&waiter->event);
@@ -3035,7 +3035,7 @@ vchiq_bulk_xfer_queue_msg_killable(struct vchiq_service *service,
        int payload[2];
 
        if (bulk_params->mode == VCHIQ_BULK_MODE_BLOCKING) {
-               bulk_waiter = bulk_params->userdata;
+               bulk_waiter = bulk_params->waiter;
                init_completion(&bulk_waiter->event);
                bulk_waiter->actual = 0;
                bulk_waiter->bulk = NULL;
@@ -3064,6 +3064,7 @@ vchiq_bulk_xfer_queue_msg_killable(struct vchiq_service *service,
        /* Initiliaze the 'bulk' slot with bulk parameters passed in. */
        bulk->mode = bulk_params->mode;
        bulk->dir = bulk_params->dir;
+       bulk->waiter = bulk_params->waiter;
        bulk->userdata = bulk_params->userdata;
        bulk->size = bulk_params->size;
        bulk->offset = bulk_params->offset;
@@ -3532,7 +3533,7 @@ error_exit:
  */
 int
 vchiq_bulk_xfer_waiting(struct vchiq_instance *instance,
-                       unsigned int handle, struct bulk_waiter *userdata)
+                       unsigned int handle, struct bulk_waiter *waiter)
 {
        struct vchiq_service *service = find_service_by_handle(instance, handle);
        struct bulk_waiter *bulk_waiter;
@@ -3541,7 +3542,7 @@ vchiq_bulk_xfer_waiting(struct vchiq_instance *instance,
        if (!service)
                return -EINVAL;
 
-       if (!userdata)
+       if (!waiter)
                goto error_exit;
 
        if (service->srvstate != VCHIQ_SRVSTATE_OPEN)
@@ -3550,7 +3551,7 @@ vchiq_bulk_xfer_waiting(struct vchiq_instance *instance,
        if (vchiq_check_service(service))
                goto error_exit;
 
-       bulk_waiter = userdata;
+       bulk_waiter = waiter;
 
        vchiq_service_put(service);
 
index 9ba4a2295dc38605020d5d23c096e08e4f41f86f..88766c9180a93c92ba7c92007b07b448155c0926 100644 (file)
@@ -115,6 +115,7 @@ struct vchiq_bulk {
        short mode;
        short dir;
        void *userdata;
+       struct bulk_waiter *waiter;
        dma_addr_t dma_addr;
        int size;
        void *remote_data;
index 6a9685d9fafc84b52431086282b6789c86b9a1a4..3d2827446f53afd46c62f3ef6781dc94f9fc7536 100644 (file)
@@ -307,7 +307,7 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance,
                bulk_params.mode = args->mode;
                bulk_params.size = args->size;
                bulk_params.dir = dir;
-               bulk_params.userdata = &waiter->bulk_waiter;
+               bulk_params.waiter = &waiter->bulk_waiter;
 
                status = vchiq_bulk_xfer_blocking(instance, args->handle,
                                                  &bulk_params);
@@ -354,7 +354,7 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance,
                if (waiter->bulk_waiter.bulk) {
                        /* Cancel the signal when the transfer completes. */
                        spin_lock(&service->state->bulk_waiter_spinlock);
-                       waiter->bulk_waiter.bulk->userdata = NULL;
+                       waiter->bulk_waiter.bulk->waiter = NULL;
                        spin_unlock(&service->state->bulk_waiter_spinlock);
                }
                kfree(waiter);