staging: vc04_services: bcm2835-audio: Use vchi_msg_hold()
authorNicolas Saenz Julienne <nsaenzjulienne@suse.de>
Mon, 29 Jun 2020 15:09:11 +0000 (17:09 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 1 Jul 2020 13:47:04 +0000 (15:47 +0200)
vchi_msg_dequeue() provides the same functionality as vchi_msg_hold()
except it copies the message data as opposed to the later which provides
the data in place.

The copying is done on a local variable, so there is no need to keep the
message out the function's bounds, so use vchi_msg_hold() instead.

Signed-off-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
Link: https://lore.kernel.org/r/20200629150945.10720-14-nsaenzjulienne@suse.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c

index 62eef23..5018b5b 100644 (file)
@@ -94,31 +94,34 @@ static void audio_vchi_callback(void *param,
                                void *msg_handle)
 {
        struct bcm2835_audio_instance *instance = param;
-       struct vc_audio_msg m;
-       int msg_len;
+       struct vchi_held_msg handle;
+       struct vc_audio_msg *m;
+       unsigned size;
        int status;
 
        if (reason != VCHI_CALLBACK_MSG_AVAILABLE)
                return;
 
-       status = vchi_msg_dequeue(instance->service,
-                                 &m, sizeof(m), &msg_len, VCHI_FLAGS_NONE);
+       status = vchi_msg_hold(instance->service, (void **)&m, &size,
+                              VCHI_FLAGS_NONE, &handle);
        if (status)
                return;
 
-       if (m.type == VC_AUDIO_MSG_TYPE_RESULT) {
-               instance->result = m.result.success;
+       if (m->type == VC_AUDIO_MSG_TYPE_RESULT) {
+               instance->result = m->result.success;
                complete(&instance->msg_avail_comp);
-       } else if (m.type == VC_AUDIO_MSG_TYPE_COMPLETE) {
-               if (m.complete.cookie1 != VC_AUDIO_WRITE_COOKIE1 ||
-                   m.complete.cookie2 != VC_AUDIO_WRITE_COOKIE2)
+       } else if (m->type == VC_AUDIO_MSG_TYPE_COMPLETE) {
+               if (m->complete.cookie1 != VC_AUDIO_WRITE_COOKIE1 ||
+                   m->complete.cookie2 != VC_AUDIO_WRITE_COOKIE2)
                        dev_err(instance->dev, "invalid cookie\n");
                else
                        bcm2835_playback_fifo(instance->alsa_stream,
-                                             m.complete.count);
+                                             m->complete.count);
        } else {
-               dev_err(instance->dev, "unexpected callback type=%d\n", m.type);
+               dev_err(instance->dev, "unexpected callback type=%d\n", m->type);
        }
+
+       vchi_held_msg_release(&handle);
 }
 
 static int