linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 00/13] Refactor SDEI client driver
@ 2020-09-22 13:04 Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 01/13] firmware: arm_sdei: Remove sdei_is_err() Gavin Shan
                   ` (13 more replies)
  0 siblings, 14 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

This series bases on 5.9.rc5 and extracted from (v4) series of "Refactoring
SDEI client driver", which is prepatory work to support SDEI virtualizaton.
This series can be checkout from github.

   git@github.com:gwshan/linux.git (branch: "sdei_client")

Testing
=======
I have the SDEI virtualization code implemented as part of KVM module.
With that, the SDEI event can be registered/unregistered/enabled/disabled.
Also, the SDEI event can be injected from host and the guest handler runs
properly.

The code can be found from:

   git@github.com:gwshan/linux.git
   (branch: "sdei")

Changelog
=========
v5:
   Rebase to 5.9.rc5 and pick rbs from James                       (Gavin)
   Improved changelog                                              (James)
   Drop last two patches in v4 series and fold them to the series
   of "Support SDEI virtualization"                                (James)
   Fix use-after-free in sdei_reregister_shared()                  (James)  
v4:
   Rebase to last upstream kernel                                  (Gavin)
   Use @event_el for SDEI internal event and use @event to cache
   SDEI event if needed                                            (Jonathan)
   Rename @se to @event for APIs                                   (Jonathan)
v3:
   Rebase to 5.8.rc7                                               (Gavin)
   Pick rbs from Jonathan                                          (Gavin)
   Correct spellings in commit logs                                (Jonathan)
   Rename "out" to "unlock" tag                                    (Jonathan)
   Keep the empty line in sdei_event_unregister()                  (Jonathan)
   Drop tabs between type and field for struct sdei_crosscall_args (Jonathan)
   Use smp_call_func_t for @fn argument in CPU callbacks           (Jonathan)
   Split struct sdei_event into struct sdei_{internal,}_event      (Jonathan)
   Remove last two patches and get it reviewed later               (Jonathan)
v2:
   Rebase to 5.8.rc6                                               (Gavin)
   Improved changelog                                              (James/Gavin)
   Split patches for easy review                                   (Gavin)
   Drop changes to reorder variables                               (James)
   Drop unnecessary (@regs removal) cleanup in sdei_event_create() (James)
   Fix broken case for device-tree in sdei_init()                  (James)

Gavin Shan (13):
  firmware: arm_sdei: Remove sdei_is_err()
  firmware: arm_sdei: Common block for failing path in
    sdei_event_create()
  firmware: arm_sdei: Retrieve event number from event instance
  firmware: arm_sdei: Avoid nested statements in sdei_init()
  firmware: arm_sdei: Unregister driver on error in sdei_init()
  firmware: arm_sdei: Remove duplicate check in sdei_get_conduit()
  firmware: arm_sdei: Remove redundant error message in sdei_probe()
  firmware: arm_sdei: Remove while loop in sdei_event_register()
  firmware: arm_sdei: Remove while loop in sdei_event_unregister()
  firmware: arm_sdei: Cleanup on cross call function
  firmware: arm_sdei: Introduce sdei_do_local_call()
  firmware: arm_sdei: Remove _sdei_event_register()
  firmware: arm_sdei: Remove _sdei_event_unregister()

 drivers/firmware/arm_sdei.c | 305 ++++++++++++++++--------------------
 1 file changed, 136 insertions(+), 169 deletions(-)

-- 
2.23.0


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v5 01/13] firmware: arm_sdei: Remove sdei_is_err()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 02/13] firmware: arm_sdei: Common block for failing path in sdei_event_create() Gavin Shan
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

sdei_is_err() is only called by sdei_to_linux_errno(). The logic of
checking on the error number is common to them. They can be combined
finely.

This removes sdei_is_err() and its logic is combined to the function
sdei_to_linux_errno(). Also, the assignment of @err to zero is also
dropped in invoke_sdei_fn() because it's always overridden afterwards.
This shouldn't cause functional changes.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: James Morse <james.morse@arm.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
 drivers/firmware/arm_sdei.c | 26 +++-----------------------
 1 file changed, 3 insertions(+), 23 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index b4b9ce97f415..2d256b2ed4b4 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -114,26 +114,7 @@ static int sdei_to_linux_errno(unsigned long sdei_err)
 		return -ENOMEM;
 	}
 
-	/* Not an error value ... */
-	return sdei_err;
-}
-
-/*
- * If x0 is any of these values, then the call failed, use sdei_to_linux_errno()
- * to translate.
- */
-static int sdei_is_err(struct arm_smccc_res *res)
-{
-	switch (res->a0) {
-	case SDEI_NOT_SUPPORTED:
-	case SDEI_INVALID_PARAMETERS:
-	case SDEI_DENIED:
-	case SDEI_PENDING:
-	case SDEI_OUT_OF_RESOURCE:
-		return true;
-	}
-
-	return false;
+	return 0;
 }
 
 static int invoke_sdei_fn(unsigned long function_id, unsigned long arg0,
@@ -141,14 +122,13 @@ static int invoke_sdei_fn(unsigned long function_id, unsigned long arg0,
 			  unsigned long arg3, unsigned long arg4,
 			  u64 *result)
 {
-	int err = 0;
+	int err;
 	struct arm_smccc_res res;
 
 	if (sdei_firmware_call) {
 		sdei_firmware_call(function_id, arg0, arg1, arg2, arg3, arg4,
 				   &res);
-		if (sdei_is_err(&res))
-			err = sdei_to_linux_errno(res.a0);
+		err = sdei_to_linux_errno(res.a0);
 	} else {
 		/*
 		 * !sdei_firmware_call means we failed to probe or called
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 02/13] firmware: arm_sdei: Common block for failing path in sdei_event_create()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 01/13] firmware: arm_sdei: Remove sdei_is_err() Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 03/13] firmware: arm_sdei: Retrieve event number from event instance Gavin Shan
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

There are multiple calls of kfree(event) in the failing path of
sdei_event_create() to free the SDEI event. It means we need to
call it again when adding more code in the failing path. It's
prone to miss doing that and introduce memory leakage.

This introduces common block for failing path in sdei_event_create()
to resolve the issue. This shouldn't cause functional changes.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Acked-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 2d256b2ed4b4..a126ab7e3490 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -190,33 +190,31 @@ static struct sdei_event *sdei_event_create(u32 event_num,
 	lockdep_assert_held(&sdei_events_lock);
 
 	event = kzalloc(sizeof(*event), GFP_KERNEL);
-	if (!event)
-		return ERR_PTR(-ENOMEM);
+	if (!event) {
+		err = -ENOMEM;
+		goto fail;
+	}
 
 	INIT_LIST_HEAD(&event->list);
 	event->event_num = event_num;
 
 	err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_PRIORITY,
 				      &result);
-	if (err) {
-		kfree(event);
-		return ERR_PTR(err);
-	}
+	if (err)
+		goto fail;
 	event->priority = result;
 
 	err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_TYPE,
 				      &result);
-	if (err) {
-		kfree(event);
-		return ERR_PTR(err);
-	}
+	if (err)
+		goto fail;
 	event->type = result;
 
 	if (event->type == SDEI_EVENT_TYPE_SHARED) {
 		reg = kzalloc(sizeof(*reg), GFP_KERNEL);
 		if (!reg) {
-			kfree(event);
-			return ERR_PTR(-ENOMEM);
+			err = -ENOMEM;
+			goto fail;
 		}
 
 		reg->event_num = event_num;
@@ -231,8 +229,8 @@ static struct sdei_event *sdei_event_create(u32 event_num,
 
 		regs = alloc_percpu(struct sdei_registered_event);
 		if (!regs) {
-			kfree(event);
-			return ERR_PTR(-ENOMEM);
+			err = -ENOMEM;
+			goto fail;
 		}
 
 		for_each_possible_cpu(cpu) {
@@ -252,6 +250,10 @@ static struct sdei_event *sdei_event_create(u32 event_num,
 	spin_unlock(&sdei_list_lock);
 
 	return event;
+
+fail:
+	kfree(event);
+	return ERR_PTR(err);
 }
 
 static void sdei_event_destroy_llocked(struct sdei_event *event)
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 03/13] firmware: arm_sdei: Retrieve event number from event instance
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 01/13] firmware: arm_sdei: Remove sdei_is_err() Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 02/13] firmware: arm_sdei: Common block for failing path in sdei_event_create() Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 04/13] firmware: arm_sdei: Avoid nested statements in sdei_init() Gavin Shan
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

In sdei_event_create(), the event number is retrieved from the
variable @event_num for the shared event. The event number was
stored in the event instance. So we can fetch it from the event
instance, similar to what we're doing for the private event.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Acked-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index a126ab7e3490..0f49fff20cc7 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -217,7 +217,7 @@ static struct sdei_event *sdei_event_create(u32 event_num,
 			goto fail;
 		}
 
-		reg->event_num = event_num;
+		reg->event_num = event->event_num;
 		reg->priority = event->priority;
 
 		reg->callback = cb;
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 04/13] firmware: arm_sdei: Avoid nested statements in sdei_init()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (2 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 03/13] firmware: arm_sdei: Retrieve event number from event instance Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 05/13] firmware: arm_sdei: Unregister driver on error " Gavin Shan
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

In sdei_init(), the nested statements can be avoided by bailing
on error from platform_driver_register() or absent ACPI SDEI table.
With it, the code looks a bit more readable.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 0f49fff20cc7..1fa4e577b78e 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -1081,17 +1081,18 @@ static bool __init sdei_present_acpi(void)
 
 static int __init sdei_init(void)
 {
-	int ret = platform_driver_register(&sdei_driver);
-
-	if (!ret && sdei_present_acpi()) {
-		struct platform_device *pdev;
-
-		pdev = platform_device_register_simple(sdei_driver.driver.name,
-						       0, NULL, 0);
-		if (IS_ERR(pdev))
-			pr_info("Failed to register ACPI:SDEI platform device %ld\n",
-				PTR_ERR(pdev));
-	}
+	struct platform_device *pdev;
+	int ret;
+
+	ret = platform_driver_register(&sdei_driver);
+	if (ret || !sdei_present_acpi())
+		return ret;
+
+	pdev = platform_device_register_simple(sdei_driver.driver.name,
+					       0, NULL, 0);
+	if (IS_ERR(pdev))
+		pr_info("Failed to register ACPI:SDEI platform device %ld\n",
+			PTR_ERR(pdev));
 
 	return ret;
 }
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 05/13] firmware: arm_sdei: Unregister driver on error in sdei_init()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (3 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 04/13] firmware: arm_sdei: Avoid nested statements in sdei_init() Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 06/13] firmware: arm_sdei: Remove duplicate check in sdei_get_conduit() Gavin Shan
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

The SDEI platform device is created from device-tree node or ACPI
(SDEI) table. For the later case, the platform device is created
explicitly by this module. It'd better to unregister the driver on
failure to create the device to keep the symmetry. The driver, owned
by this module, isn't needed if the device isn't existing.

Besides, the errno (@ret) should be updated accordingly in this
case.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 1fa4e577b78e..e7e9059c395b 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -1090,9 +1090,12 @@ static int __init sdei_init(void)
 
 	pdev = platform_device_register_simple(sdei_driver.driver.name,
 					       0, NULL, 0);
-	if (IS_ERR(pdev))
-		pr_info("Failed to register ACPI:SDEI platform device %ld\n",
-			PTR_ERR(pdev));
+	if (IS_ERR(pdev)) {
+		ret = PTR_ERR(pdev);
+		platform_driver_unregister(&sdei_driver);
+		pr_info("Failed to register ACPI:SDEI platform device %d\n",
+			ret);
+	}
 
 	return ret;
 }
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 06/13] firmware: arm_sdei: Remove duplicate check in sdei_get_conduit()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (4 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 05/13] firmware: arm_sdei: Unregister driver on error " Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 07/13] firmware: arm_sdei: Remove redundant error message in sdei_probe() Gavin Shan
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

The following two checks are duplicate because @acpi_disabled doesn't
depend on CONFIG_ACPI. So the duplicate check (IS_ENABLED(CONFIG_ACPI))
can be dropped. More details is provided to keep the commit log complete:

   * @acpi_disabled is defined in arch/arm64/kernel/acpi.c when
     CONFIG_ACPI is enabled.
   * @acpi_disabled in defined in include/acpi.h when CONFIG_ACPI
     is disabled.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Acked-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index e7e9059c395b..5daa4e20595c 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -958,7 +958,7 @@ static int sdei_get_conduit(struct platform_device *pdev)
 		}
 
 		pr_warn("invalid \"method\" property: %s\n", method);
-	} else if (IS_ENABLED(CONFIG_ACPI) && !acpi_disabled) {
+	} else if (!acpi_disabled) {
 		if (acpi_psci_use_hvc()) {
 			sdei_firmware_call = &sdei_smccc_hvc;
 			return SMCCC_CONDUIT_HVC;
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 07/13] firmware: arm_sdei: Remove redundant error message in sdei_probe()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (5 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 06/13] firmware: arm_sdei: Remove duplicate check in sdei_get_conduit() Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 08/13] firmware: arm_sdei: Remove while loop in sdei_event_register() Gavin Shan
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

This removes the redundant error message in sdei_probe() because
the case can be identified from the errno in next error message.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Acked-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 5daa4e20595c..4caeef3e1e0b 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -982,8 +982,6 @@ static int sdei_probe(struct platform_device *pdev)
 		return 0;
 
 	err = sdei_api_get_version(&ver);
-	if (err == -EOPNOTSUPP)
-		pr_err("advertised but not implemented in platform firmware\n");
 	if (err) {
 		pr_err("Failed to get SDEI version: %d\n", err);
 		sdei_mark_interface_broken();
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 08/13] firmware: arm_sdei: Remove while loop in sdei_event_register()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (6 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 07/13] firmware: arm_sdei: Remove redundant error message in sdei_probe() Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 09/13] firmware: arm_sdei: Remove while loop in sdei_event_unregister() Gavin Shan
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

This removes the unnecessary while loop in sdei_event_register()
because of the following two reasons. This shouldn't cause any
functional changes.

   * The while loop is executed for once, meaning it's not needed
     in theory.
   * With the while loop removed, the nested statements can be
     avoid to make the code a bit cleaner.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
 drivers/firmware/arm_sdei.c | 52 ++++++++++++++++++-------------------
 1 file changed, 25 insertions(+), 27 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 4caeef3e1e0b..6595bd66aa73 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -590,36 +590,34 @@ int sdei_event_register(u32 event_num, sdei_event_callback *cb, void *arg)
 	WARN_ON(in_nmi());
 
 	mutex_lock(&sdei_events_lock);
-	do {
-		if (sdei_event_find(event_num)) {
-			pr_warn("Event %u already registered\n", event_num);
-			err = -EBUSY;
-			break;
-		}
+	if (sdei_event_find(event_num)) {
+		pr_warn("Event %u already registered\n", event_num);
+		err = -EBUSY;
+		goto unlock;
+	}
 
-		event = sdei_event_create(event_num, cb, arg);
-		if (IS_ERR(event)) {
-			err = PTR_ERR(event);
-			pr_warn("Failed to create event %u: %d\n", event_num,
-				err);
-			break;
-		}
+	event = sdei_event_create(event_num, cb, arg);
+	if (IS_ERR(event)) {
+		err = PTR_ERR(event);
+		pr_warn("Failed to create event %u: %d\n", event_num, err);
+		goto unlock;
+	}
 
-		cpus_read_lock();
-		err = _sdei_event_register(event);
-		if (err) {
-			sdei_event_destroy(event);
-			pr_warn("Failed to register event %u: %d\n", event_num,
-				err);
-		} else {
-			spin_lock(&sdei_list_lock);
-			event->reregister = true;
-			spin_unlock(&sdei_list_lock);
-		}
-		cpus_read_unlock();
-	} while (0);
-	mutex_unlock(&sdei_events_lock);
+	cpus_read_lock();
+	err = _sdei_event_register(event);
+	if (err) {
+		sdei_event_destroy(event);
+		pr_warn("Failed to register event %u: %d\n", event_num, err);
+		goto cpu_unlock;
+	}
 
+	spin_lock(&sdei_list_lock);
+	event->reregister = true;
+	spin_unlock(&sdei_list_lock);
+cpu_unlock:
+	cpus_read_unlock();
+unlock:
+	mutex_unlock(&sdei_events_lock);
 	return err;
 }
 
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 09/13] firmware: arm_sdei: Remove while loop in sdei_event_unregister()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (7 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 08/13] firmware: arm_sdei: Remove while loop in sdei_event_register() Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 10/13] firmware: arm_sdei: Cleanup on cross call function Gavin Shan
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

This removes the unnecessary while loop in sdei_event_unregister()
because of the following two reasons. This shouldn't cause any
functional changes.

   * The while loop is executed for once, meaning it's not needed
     in theory.
   * With the while loop removed, the nested statements can be
     avoid to make the code a bit cleaner.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
 drivers/firmware/arm_sdei.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 6595bd66aa73..790bff70d169 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -491,24 +491,23 @@ int sdei_event_unregister(u32 event_num)
 
 	mutex_lock(&sdei_events_lock);
 	event = sdei_event_find(event_num);
-	do {
-		if (!event) {
-			pr_warn("Event %u not registered\n", event_num);
-			err = -ENOENT;
-			break;
-		}
+	if (!event) {
+		pr_warn("Event %u not registered\n", event_num);
+		err = -ENOENT;
+		goto unlock;
+	}
 
-		spin_lock(&sdei_list_lock);
-		event->reregister = false;
-		event->reenable = false;
-		spin_unlock(&sdei_list_lock);
+	spin_lock(&sdei_list_lock);
+	event->reregister = false;
+	event->reenable = false;
+	spin_unlock(&sdei_list_lock);
 
-		err = _sdei_event_unregister(event);
-		if (err)
-			break;
+	err = _sdei_event_unregister(event);
+	if (err)
+		goto unlock;
 
-		sdei_event_destroy(event);
-	} while (0);
+	sdei_event_destroy(event);
+unlock:
 	mutex_unlock(&sdei_events_lock);
 
 	return err;
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 10/13] firmware: arm_sdei: Cleanup on cross call function
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (8 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 09/13] firmware: arm_sdei: Remove while loop in sdei_event_unregister() Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 11/13] firmware: arm_sdei: Introduce sdei_do_local_call() Gavin Shan
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

This applies cleanup on the cross call functions, no functional
changes are introduced:

   * Wrap the code block of CROSSCALL_INIT inside "do { } while (0)"
     as linux kernel usually does. Otherwise, scripts/checkpatch.pl
     reports warning regarding this.
   * Use smp_call_func_t for @fn argument in sdei_do_cross_call()
     as the function is called on target CPU(s).
   * Remove unnecessary space before @event in sdei_do_cross_call()

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 790bff70d169..786c1b6d4af3 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -78,11 +78,15 @@ struct sdei_crosscall_args {
 	int first_error;
 };
 
-#define CROSSCALL_INIT(arg, event)	(arg.event = event, \
-					 arg.first_error = 0, \
-					 atomic_set(&arg.errors, 0))
-
-static inline int sdei_do_cross_call(void *fn, struct sdei_event * event)
+#define CROSSCALL_INIT(arg, event)		\
+	do {					\
+		arg.event = event;		\
+		arg.first_error = 0;		\
+		atomic_set(&arg.errors, 0);	\
+	} while (0)
+
+static inline int sdei_do_cross_call(smp_call_func_t fn,
+				     struct sdei_event *event)
 {
 	struct sdei_crosscall_args arg;
 
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 11/13] firmware: arm_sdei: Introduce sdei_do_local_call()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (9 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 10/13] firmware: arm_sdei: Cleanup on cross call function Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 12/13] firmware: arm_sdei: Remove _sdei_event_register() Gavin Shan
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

During the CPU hotplug, the private events are registered, enabled
or unregistered on the specific CPU. It repeats the same steps:
initializing cross call argument, make function call on local CPU,
check the returned error.

This introduces sdei_do_local_call() to cover the first steps. The
other benefit is to make CROSSCALL_INIT and struct sdei_crosscall_args
are only visible to sdei_do_{cross, local}_call().

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 41 ++++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 16 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 786c1b6d4af3..cf1a37b40e24 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -85,6 +85,17 @@ struct sdei_crosscall_args {
 		atomic_set(&arg.errors, 0);	\
 	} while (0)
 
+static inline int sdei_do_local_call(smp_call_func_t fn,
+				     struct sdei_event *event)
+{
+	struct sdei_crosscall_args arg;
+
+	CROSSCALL_INIT(arg, event);
+	fn(&arg);
+
+	return arg.first_error;
+}
+
 static inline int sdei_do_cross_call(smp_call_func_t fn,
 				     struct sdei_event *event)
 {
@@ -677,7 +688,7 @@ static int sdei_reregister_shared(void)
 static int sdei_cpuhp_down(unsigned int cpu)
 {
 	struct sdei_event *event;
-	struct sdei_crosscall_args arg;
+	int err;
 
 	/* un-register private events */
 	spin_lock(&sdei_list_lock);
@@ -685,12 +696,11 @@ static int sdei_cpuhp_down(unsigned int cpu)
 		if (event->type == SDEI_EVENT_TYPE_SHARED)
 			continue;
 
-		CROSSCALL_INIT(arg, event);
-		/* call the cross-call function locally... */
-		_local_event_unregister(&arg);
-		if (arg.first_error)
+		err = sdei_do_local_call(_local_event_unregister, event);
+		if (err) {
 			pr_err("Failed to unregister event %u: %d\n",
-			       event->event_num, arg.first_error);
+			       event->event_num, err);
+		}
 	}
 	spin_unlock(&sdei_list_lock);
 
@@ -700,7 +710,7 @@ static int sdei_cpuhp_down(unsigned int cpu)
 static int sdei_cpuhp_up(unsigned int cpu)
 {
 	struct sdei_event *event;
-	struct sdei_crosscall_args arg;
+	int err;
 
 	/* re-register/enable private events */
 	spin_lock(&sdei_list_lock);
@@ -709,20 +719,19 @@ static int sdei_cpuhp_up(unsigned int cpu)
 			continue;
 
 		if (event->reregister) {
-			CROSSCALL_INIT(arg, event);
-			/* call the cross-call function locally... */
-			_local_event_register(&arg);
-			if (arg.first_error)
+			err = sdei_do_local_call(_local_event_register, event);
+			if (err) {
 				pr_err("Failed to re-register event %u: %d\n",
-				       event->event_num, arg.first_error);
+				       event->event_num, err);
+			}
 		}
 
 		if (event->reenable) {
-			CROSSCALL_INIT(arg, event);
-			_local_event_enable(&arg);
-			if (arg.first_error)
+			err = sdei_do_local_call(_local_event_enable, event);
+			if (err) {
 				pr_err("Failed to re-enable event %u: %d\n",
-				       event->event_num, arg.first_error);
+				       event->event_num, err);
+			}
 		}
 	}
 	spin_unlock(&sdei_list_lock);
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 12/13] firmware: arm_sdei: Remove _sdei_event_register()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (10 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 11/13] firmware: arm_sdei: Introduce sdei_do_local_call() Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-22 13:04 ` [PATCH v5 13/13] firmware: arm_sdei: Remove _sdei_event_unregister() Gavin Shan
  2020-09-28 22:13 ` [PATCH v5 00/13] Refactor SDEI client driver Will Deacon
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

The function _sdei_event_register() is called by sdei_event_register()
and sdei_device_thaw() as the following functional call chain shows.
_sdei_event_register() covers the shared and private events, but
sdei_device_thaw() only covers the shared events. So the logic to
cover the private events in _sdei_event_register() isn't needed by
sdei_device_thaw().

Similarly, sdei_reregister_event_llocked() covers the shared and
private events in the regard of reenablement. The logic to cover
the private events isn't needed by sdei_device_thaw() either.

   sdei_event_register          sdei_device_thaw
      _sdei_event_register         sdei_reregister_shared
                                      sdei_reregister_event_llocked
                                         _sdei_event_register

This removes _sdei_event_register() and sdei_reregister_event_llocked().
Their logic is moved to sdei_event_register() and sdei_reregister_shared().
This shouldn't cause any logical changes.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 77 ++++++++++++++-----------------------
 1 file changed, 28 insertions(+), 49 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index cf1a37b40e24..361d142ad2a8 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -577,25 +577,6 @@ static void _local_event_register(void *data)
 	sdei_cross_call_return(arg, err);
 }
 
-static int _sdei_event_register(struct sdei_event *event)
-{
-	int err;
-
-	lockdep_assert_held(&sdei_events_lock);
-
-	if (event->type == SDEI_EVENT_TYPE_SHARED)
-		return sdei_api_event_register(event->event_num,
-					       sdei_entry_point,
-					       event->registered,
-					       SDEI_EVENT_REGISTER_RM_ANY, 0);
-
-	err = sdei_do_cross_call(_local_event_register, event);
-	if (err)
-		sdei_do_cross_call(_local_event_unregister, event);
-
-	return err;
-}
-
 int sdei_event_register(u32 event_num, sdei_event_callback *cb, void *arg)
 {
 	int err;
@@ -618,7 +599,17 @@ int sdei_event_register(u32 event_num, sdei_event_callback *cb, void *arg)
 	}
 
 	cpus_read_lock();
-	err = _sdei_event_register(event);
+	if (event->type == SDEI_EVENT_TYPE_SHARED) {
+		err = sdei_api_event_register(event->event_num,
+					      sdei_entry_point,
+					      event->registered,
+					      SDEI_EVENT_REGISTER_RM_ANY, 0);
+	} else {
+		err = sdei_do_cross_call(_local_event_register, event);
+		if (err)
+			sdei_do_cross_call(_local_event_unregister, event);
+	}
+
 	if (err) {
 		sdei_event_destroy(event);
 		pr_warn("Failed to register event %u: %d\n", event_num, err);
@@ -635,33 +626,6 @@ int sdei_event_register(u32 event_num, sdei_event_callback *cb, void *arg)
 	return err;
 }
 
-static int sdei_reregister_event_llocked(struct sdei_event *event)
-{
-	int err;
-
-	lockdep_assert_held(&sdei_events_lock);
-	lockdep_assert_held(&sdei_list_lock);
-
-	err = _sdei_event_register(event);
-	if (err) {
-		pr_err("Failed to re-register event %u\n", event->event_num);
-		sdei_event_destroy_llocked(event);
-		return err;
-	}
-
-	if (event->reenable) {
-		if (event->type == SDEI_EVENT_TYPE_SHARED)
-			err = sdei_api_event_enable(event->event_num);
-		else
-			err = sdei_do_cross_call(_local_event_enable, event);
-	}
-
-	if (err)
-		pr_err("Failed to re-enable event %u\n", event->event_num);
-
-	return err;
-}
-
 static int sdei_reregister_shared(void)
 {
 	int err = 0;
@@ -674,9 +638,24 @@ static int sdei_reregister_shared(void)
 			continue;
 
 		if (event->reregister) {
-			err = sdei_reregister_event_llocked(event);
-			if (err)
+			err = sdei_api_event_register(event->event_num,
+					sdei_entry_point, event->registered,
+					SDEI_EVENT_REGISTER_RM_ANY, 0);
+			if (err) {
+				pr_err("Failed to re-register event %u\n",
+				       event->event_num);
+				sdei_event_destroy_llocked(event);
 				break;
+			}
+		}
+
+		if (event->reenable) {
+			err = sdei_api_event_enable(event->event_num);
+			if (err) {
+				pr_err("Failed to re-enable event %u\n",
+				       event->event_num);
+				break;
+			}
 		}
 	}
 	spin_unlock(&sdei_list_lock);
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v5 13/13] firmware: arm_sdei: Remove _sdei_event_unregister()
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (11 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 12/13] firmware: arm_sdei: Remove _sdei_event_register() Gavin Shan
@ 2020-09-22 13:04 ` Gavin Shan
  2020-09-28 22:13 ` [PATCH v5 00/13] Refactor SDEI client driver Will Deacon
  13 siblings, 0 replies; 15+ messages in thread
From: Gavin Shan @ 2020-09-22 13:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, Jonathan.Cameron, james.morse, mark.rutland,
	catalin.marinas, will, shan.gavin

_sdei_event_unregister() is called by sdei_event_unregister() and
sdei_device_freeze(). _sdei_event_unregister() covers the shared
and private events, but sdei_device_freeze() only covers the shared
events. So the logic to cover the private events isn't needed by
sdei_device_freeze().

   sdei_event_unregister        sdei_device_freeze
      _sdei_event_unregister       sdei_unregister_shared
                                     _sdei_event_unregister

This removes _sdei_event_unregister(). Its logic is moved to its
callers accordingly. This shouldn't cause any logical changes.

Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 361d142ad2a8..840754dcc6ca 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -487,16 +487,6 @@ static void _local_event_unregister(void *data)
 	sdei_cross_call_return(arg, err);
 }
 
-static int _sdei_event_unregister(struct sdei_event *event)
-{
-	lockdep_assert_held(&sdei_events_lock);
-
-	if (event->type == SDEI_EVENT_TYPE_SHARED)
-		return sdei_api_event_unregister(event->event_num);
-
-	return sdei_do_cross_call(_local_event_unregister, event);
-}
-
 int sdei_event_unregister(u32 event_num)
 {
 	int err;
@@ -517,7 +507,11 @@ int sdei_event_unregister(u32 event_num)
 	event->reenable = false;
 	spin_unlock(&sdei_list_lock);
 
-	err = _sdei_event_unregister(event);
+	if (event->type == SDEI_EVENT_TYPE_SHARED)
+		err = sdei_api_event_unregister(event->event_num);
+	else
+		err = sdei_do_cross_call(_local_event_unregister, event);
+
 	if (err)
 		goto unlock;
 
@@ -543,7 +537,7 @@ static int sdei_unregister_shared(void)
 		if (event->type != SDEI_EVENT_TYPE_SHARED)
 			continue;
 
-		err = _sdei_event_unregister(event);
+		err = sdei_api_event_unregister(event->event_num);
 		if (err)
 			break;
 	}
-- 
2.23.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v5 00/13] Refactor SDEI client driver
  2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
                   ` (12 preceding siblings ...)
  2020-09-22 13:04 ` [PATCH v5 13/13] firmware: arm_sdei: Remove _sdei_event_unregister() Gavin Shan
@ 2020-09-28 22:13 ` Will Deacon
  13 siblings, 0 replies; 15+ messages in thread
From: Will Deacon @ 2020-09-28 22:13 UTC (permalink / raw)
  To: Gavin Shan, linux-arm-kernel
  Cc: catalin.marinas, kernel-team, Will Deacon, mark.rutland,
	james.morse, shan.gavin, linux-kernel, Jonathan.Cameron

On Tue, 22 Sep 2020 23:04:10 +1000, Gavin Shan wrote:
> This series bases on 5.9.rc5 and extracted from (v4) series of "Refactoring
> SDEI client driver", which is prepatory work to support SDEI virtualizaton.
> This series can be checkout from github.
> 
>    git@github.com:gwshan/linux.git (branch: "sdei_client")
> 
> Testing
> =======
> I have the SDEI virtualization code implemented as part of KVM module.
> With that, the SDEI event can be registered/unregistered/enabled/disabled.
> Also, the SDEI event can be injected from host and the guest handler runs
> properly.
> 
> [...]

Applied to arm64 (for-next/sdei), thanks!

[01/13] firmware: arm_sdei: Remove sdei_is_err()
        https://git.kernel.org/arm64/c/5735f5158430
[02/13] firmware: arm_sdei: Common block for failing path in sdei_event_create()
        https://git.kernel.org/arm64/c/119884249fdb
[03/13] firmware: arm_sdei: Retrieve event number from event instance
        https://git.kernel.org/arm64/c/663c0e89c8de
[04/13] firmware: arm_sdei: Avoid nested statements in sdei_init()
        https://git.kernel.org/arm64/c/10fd7c42b795
[05/13] firmware: arm_sdei: Unregister driver on error in sdei_init()
        https://git.kernel.org/arm64/c/63627cae41e3
[06/13] firmware: arm_sdei: Remove duplicate check in sdei_get_conduit()
        https://git.kernel.org/arm64/c/bc110fd32281
[07/13] firmware: arm_sdei: Remove redundant error message in sdei_probe()
        https://git.kernel.org/arm64/c/101119a35ca1
[08/13] firmware: arm_sdei: Remove while loop in sdei_event_register()
        https://git.kernel.org/arm64/c/1bbc75518503
[09/13] firmware: arm_sdei: Remove while loop in sdei_event_unregister()
        https://git.kernel.org/arm64/c/b06146b698e6
[10/13] firmware: arm_sdei: Cleanup on cross call function
        https://git.kernel.org/arm64/c/a27c04e1de87
[11/13] firmware: arm_sdei: Introduce sdei_do_local_call()
        https://git.kernel.org/arm64/c/f4673625a52c
[12/13] firmware: arm_sdei: Remove _sdei_event_register()
        https://git.kernel.org/arm64/c/d2fc580d2dca
[13/13] firmware: arm_sdei: Remove _sdei_event_unregister()
        https://git.kernel.org/arm64/c/4b2b76cbbc8f

Cheers,
-- 
Will

https://fixes.arm64.dev
https://next.arm64.dev
https://will.arm64.dev

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2020-09-28 23:30 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-22 13:04 [PATCH v5 00/13] Refactor SDEI client driver Gavin Shan
2020-09-22 13:04 ` [PATCH v5 01/13] firmware: arm_sdei: Remove sdei_is_err() Gavin Shan
2020-09-22 13:04 ` [PATCH v5 02/13] firmware: arm_sdei: Common block for failing path in sdei_event_create() Gavin Shan
2020-09-22 13:04 ` [PATCH v5 03/13] firmware: arm_sdei: Retrieve event number from event instance Gavin Shan
2020-09-22 13:04 ` [PATCH v5 04/13] firmware: arm_sdei: Avoid nested statements in sdei_init() Gavin Shan
2020-09-22 13:04 ` [PATCH v5 05/13] firmware: arm_sdei: Unregister driver on error " Gavin Shan
2020-09-22 13:04 ` [PATCH v5 06/13] firmware: arm_sdei: Remove duplicate check in sdei_get_conduit() Gavin Shan
2020-09-22 13:04 ` [PATCH v5 07/13] firmware: arm_sdei: Remove redundant error message in sdei_probe() Gavin Shan
2020-09-22 13:04 ` [PATCH v5 08/13] firmware: arm_sdei: Remove while loop in sdei_event_register() Gavin Shan
2020-09-22 13:04 ` [PATCH v5 09/13] firmware: arm_sdei: Remove while loop in sdei_event_unregister() Gavin Shan
2020-09-22 13:04 ` [PATCH v5 10/13] firmware: arm_sdei: Cleanup on cross call function Gavin Shan
2020-09-22 13:04 ` [PATCH v5 11/13] firmware: arm_sdei: Introduce sdei_do_local_call() Gavin Shan
2020-09-22 13:04 ` [PATCH v5 12/13] firmware: arm_sdei: Remove _sdei_event_register() Gavin Shan
2020-09-22 13:04 ` [PATCH v5 13/13] firmware: arm_sdei: Remove _sdei_event_unregister() Gavin Shan
2020-09-28 22:13 ` [PATCH v5 00/13] Refactor SDEI client driver Will Deacon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).