diff mbox series

[v2,3/9] staging: vchiq_arm: pass vchiq instance to service callbacks

Message ID 20220518191126.60396-4-athierry@redhat.com (mailing list archive)
State New, archived
Headers show
Series staging: vchiq_arm: remove some unnecessary global variables | expand

Commit Message

Adrien Thierry May 18, 2022, 7:11 p.m. UTC
In order to remove the 'vchiq_states' global array, we need to pass the
vchiq_instance reference to the 'handle_to_service' function, as well as
to all functions that call 'handle_to_service'. This will allow
accessing the vchiq state through the vchiq instance instead of through
the global array.

'handle_to_service' is called by 'service_callback'. Therefore, pass the
vchiq instance reference to 'service_callback'. This also requires
adding the vchiq instance reference to the service callbacks prototype,
and update all other callbacks accordingly.

Signed-off-by: Adrien Thierry <athierry@redhat.com>
---
 .../staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c  | 3 ++-
 .../vc04_services/include/linux/raspberrypi/vchiq.h      | 8 ++++++--
 .../vc04_services/interface/vchiq_arm/vchiq_arm.c        | 9 ++++-----
 .../vc04_services/interface/vchiq_arm/vchiq_arm.h        | 4 ++--
 .../vc04_services/interface/vchiq_arm/vchiq_core.c       | 3 ++-
 drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c    | 3 ++-
 6 files changed, 18 insertions(+), 12 deletions(-)

Comments

Stefan Wahren May 30, 2022, 7:26 p.m. UTC | #1
Hi Adrien,

Am 18.05.22 um 21:11 schrieb Adrien Thierry:
> In order to remove the 'vchiq_states' global array, we need to pass the
> vchiq_instance reference to the 'handle_to_service' function, as well as
> to all functions that call 'handle_to_service'. This will allow
> accessing the vchiq state through the vchiq instance instead of through
> the global array.
>
> 'handle_to_service' is called by 'service_callback'. Therefore, pass the
> vchiq instance reference to 'service_callback'. This also requires
> adding the vchiq instance reference to the service callbacks prototype,
> and update all other callbacks accordingly.
>
> Signed-off-by: Adrien Thierry <athierry@redhat.com>
> ---
>   .../staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c  | 3 ++-
>   .../vc04_services/include/linux/raspberrypi/vchiq.h      | 8 ++++++--
>   .../vc04_services/interface/vchiq_arm/vchiq_arm.c        | 9 ++++-----
>   .../vc04_services/interface/vchiq_arm/vchiq_arm.h        | 4 ++--
>   .../vc04_services/interface/vchiq_arm/vchiq_core.c       | 3 ++-
>   drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c    | 3 ++-
>   6 files changed, 18 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
> index 701abe430877..c32c8c93a615 100644
> --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
> +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
> @@ -89,7 +89,8 @@ static int bcm2835_audio_send_simple(struct bcm2835_audio_instance *instance,
>   	return bcm2835_audio_send_msg(instance, &m, wait);
>   }
>   
> -static enum vchiq_status audio_vchi_callback(enum vchiq_reason reason,
> +static enum vchiq_status audio_vchi_callback(struct vchiq_instance *vchiq_instance,
> +					     enum vchiq_reason reason,
>   					     struct vchiq_header *header,
>   					     unsigned int handle, void *userdata)
>   {
> diff --git a/drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h b/drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h
> index 715f02e7f1e1..97537d3b1d28 100644
> --- a/drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h
> +++ b/drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h
> @@ -53,9 +53,12 @@ struct vchiq_element {
>   	unsigned int size;
>   };
>   
> +struct vchiq_instance;
as far i can see this struct was already declared in this header 
somewhere below. So please avoid multiple declarations.
> +
>   struct vchiq_service_base {
>   	int fourcc;
> -	enum vchiq_status (*callback)(enum vchiq_reason reason,
> +	enum vchiq_status (*callback)(struct vchiq_instance *instance,
> +				      enum vchiq_reason reason,
>   				      struct vchiq_header *header,
>   				      unsigned int handle,
>   				      void *bulk_userdata);
> @@ -71,7 +74,8 @@ struct vchiq_completion_data_kernel {
>   
>   struct vchiq_service_params_kernel {
>   	int fourcc;
> -	enum vchiq_status (*callback)(enum vchiq_reason reason,
> +	enum vchiq_status (*callback)(struct vchiq_instance *instance,
> +				      enum vchiq_reason reason,
>   				      struct vchiq_header *header,
>   				      unsigned int handle,
>   				      void *bulk_userdata);
> 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 3b447c635c3f..ffb24298e26b 100644
> --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
> @@ -1041,8 +1041,8 @@ add_completion(struct vchiq_instance *instance, enum vchiq_reason reason,
>   }
>   
>   enum vchiq_status
> -service_callback(enum vchiq_reason reason, struct vchiq_header *header,
> -		 unsigned int handle, void *bulk_userdata)
> +service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,
> +		 struct vchiq_header *header, unsigned int handle, void *bulk_userdata)
>   {
>   	/*
>   	 * How do we ensure the callback goes to the right client?
> @@ -1052,7 +1052,6 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header,
>   	 */
>   	struct user_service *user_service;
>   	struct vchiq_service *service;
> -	struct vchiq_instance *instance;
>   	bool skip_completion = false;
>   
>   	DEBUG_INITIALISE(g_state.local);
> @@ -1067,7 +1066,6 @@ service_callback(enum vchiq_reason reason, struct vchiq_header *header,
>   	}
>   
>   	user_service = (struct user_service *)service->base.userdata;
> -	instance = user_service->instance;
>   
>   	if (!instance || instance->closing) {
>   		rcu_read_unlock();
> @@ -1313,7 +1311,8 @@ vchiq_get_state(void)
>    */
>   
>   static enum vchiq_status
> -vchiq_keepalive_vchiq_callback(enum vchiq_reason reason,
> +vchiq_keepalive_vchiq_callback(struct vchiq_instance *instance,
> +			       enum vchiq_reason reason,
>   			       struct vchiq_header *header,
>   			       unsigned int service_user, void *bulk_user)
>   {
> diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h
> index 2aa46b119a46..f671c3976ab7 100644
> --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h
> +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h
> @@ -138,8 +138,8 @@ static inline int vchiq_register_chrdev(struct device *parent) { return 0; }
>   #endif /* IS_ENABLED(CONFIG_VCHIQ_CDEV) */
>   
>   extern enum vchiq_status
> -service_callback(enum vchiq_reason reason, struct vchiq_header *header,
> -		 unsigned int handle, void *bulk_userdata);
> +service_callback(struct vchiq_instance *vchiq_instance, enum vchiq_reason reason,
> +		 struct vchiq_header *header, unsigned int handle, void *bulk_userdata);
>   
>   extern void
>   free_bulk_waiter(struct vchiq_instance *instance);
> 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 04eec18835da..547af55d3859 100644
> --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c
> +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c
> @@ -466,7 +466,8 @@ make_service_callback(struct vchiq_service *service, enum vchiq_reason reason,
>   	vchiq_log_trace(vchiq_core_log_level, "%d: callback:%d (%s, %pK, %pK)",
>   			service->state->id, service->localport, reason_names[reason],
>   			header, bulk_userdata);
> -	status = service->base.callback(reason, header, service->handle, bulk_userdata);
> +	status = service->base.callback(service->instance, reason, header, service->handle,
> +					bulk_userdata);
>   	if (status == VCHIQ_ERROR) {
>   		vchiq_log_warning(vchiq_core_log_level,
>   				  "%d: ignoring ERROR from callback to service %x",
> diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
> index 145021af93b2..55f290b64d6a 100644
> --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
> +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
> @@ -548,7 +548,8 @@ static void bulk_abort_cb(struct vchiq_mmal_instance *instance,
>   }
>   
>   /* incoming event service callback */
> -static enum vchiq_status service_callback(enum vchiq_reason reason,
> +static enum vchiq_status service_callback(struct vchiq_instance *vchiq_instance,
> +					  enum vchiq_reason reason,
>   					  struct vchiq_header *header,
>   					  unsigned int handle, void *bulk_ctx)
>   {
diff mbox series

Patch

diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
index 701abe430877..c32c8c93a615 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
@@ -89,7 +89,8 @@  static int bcm2835_audio_send_simple(struct bcm2835_audio_instance *instance,
 	return bcm2835_audio_send_msg(instance, &m, wait);
 }
 
-static enum vchiq_status audio_vchi_callback(enum vchiq_reason reason,
+static enum vchiq_status audio_vchi_callback(struct vchiq_instance *vchiq_instance,
+					     enum vchiq_reason reason,
 					     struct vchiq_header *header,
 					     unsigned int handle, void *userdata)
 {
diff --git a/drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h b/drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h
index 715f02e7f1e1..97537d3b1d28 100644
--- a/drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h
+++ b/drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h
@@ -53,9 +53,12 @@  struct vchiq_element {
 	unsigned int size;
 };
 
+struct vchiq_instance;
+
 struct vchiq_service_base {
 	int fourcc;
-	enum vchiq_status (*callback)(enum vchiq_reason reason,
+	enum vchiq_status (*callback)(struct vchiq_instance *instance,
+				      enum vchiq_reason reason,
 				      struct vchiq_header *header,
 				      unsigned int handle,
 				      void *bulk_userdata);
@@ -71,7 +74,8 @@  struct vchiq_completion_data_kernel {
 
 struct vchiq_service_params_kernel {
 	int fourcc;
-	enum vchiq_status (*callback)(enum vchiq_reason reason,
+	enum vchiq_status (*callback)(struct vchiq_instance *instance,
+				      enum vchiq_reason reason,
 				      struct vchiq_header *header,
 				      unsigned int handle,
 				      void *bulk_userdata);
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 3b447c635c3f..ffb24298e26b 100644
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
@@ -1041,8 +1041,8 @@  add_completion(struct vchiq_instance *instance, enum vchiq_reason reason,
 }
 
 enum vchiq_status
-service_callback(enum vchiq_reason reason, struct vchiq_header *header,
-		 unsigned int handle, void *bulk_userdata)
+service_callback(struct vchiq_instance *instance, enum vchiq_reason reason,
+		 struct vchiq_header *header, unsigned int handle, void *bulk_userdata)
 {
 	/*
 	 * How do we ensure the callback goes to the right client?
@@ -1052,7 +1052,6 @@  service_callback(enum vchiq_reason reason, struct vchiq_header *header,
 	 */
 	struct user_service *user_service;
 	struct vchiq_service *service;
-	struct vchiq_instance *instance;
 	bool skip_completion = false;
 
 	DEBUG_INITIALISE(g_state.local);
@@ -1067,7 +1066,6 @@  service_callback(enum vchiq_reason reason, struct vchiq_header *header,
 	}
 
 	user_service = (struct user_service *)service->base.userdata;
-	instance = user_service->instance;
 
 	if (!instance || instance->closing) {
 		rcu_read_unlock();
@@ -1313,7 +1311,8 @@  vchiq_get_state(void)
  */
 
 static enum vchiq_status
-vchiq_keepalive_vchiq_callback(enum vchiq_reason reason,
+vchiq_keepalive_vchiq_callback(struct vchiq_instance *instance,
+			       enum vchiq_reason reason,
 			       struct vchiq_header *header,
 			       unsigned int service_user, void *bulk_user)
 {
diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h
index 2aa46b119a46..f671c3976ab7 100644
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h
@@ -138,8 +138,8 @@  static inline int vchiq_register_chrdev(struct device *parent) { return 0; }
 #endif /* IS_ENABLED(CONFIG_VCHIQ_CDEV) */
 
 extern enum vchiq_status
-service_callback(enum vchiq_reason reason, struct vchiq_header *header,
-		 unsigned int handle, void *bulk_userdata);
+service_callback(struct vchiq_instance *vchiq_instance, enum vchiq_reason reason,
+		 struct vchiq_header *header, unsigned int handle, void *bulk_userdata);
 
 extern void
 free_bulk_waiter(struct vchiq_instance *instance);
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 04eec18835da..547af55d3859 100644
--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c
+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c
@@ -466,7 +466,8 @@  make_service_callback(struct vchiq_service *service, enum vchiq_reason reason,
 	vchiq_log_trace(vchiq_core_log_level, "%d: callback:%d (%s, %pK, %pK)",
 			service->state->id, service->localport, reason_names[reason],
 			header, bulk_userdata);
-	status = service->base.callback(reason, header, service->handle, bulk_userdata);
+	status = service->base.callback(service->instance, reason, header, service->handle,
+					bulk_userdata);
 	if (status == VCHIQ_ERROR) {
 		vchiq_log_warning(vchiq_core_log_level,
 				  "%d: ignoring ERROR from callback to service %x",
diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
index 145021af93b2..55f290b64d6a 100644
--- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
@@ -548,7 +548,8 @@  static void bulk_abort_cb(struct vchiq_mmal_instance *instance,
 }
 
 /* incoming event service callback */
-static enum vchiq_status service_callback(enum vchiq_reason reason,
+static enum vchiq_status service_callback(struct vchiq_instance *vchiq_instance,
+					  enum vchiq_reason reason,
 					  struct vchiq_header *header,
 					  unsigned int handle, void *bulk_ctx)
 {