Re: [PATCH v1 1/3] firmware loader: Introduce new API - request_firmware_abort()

2014-11-02 Thread Ming Lei
On Wed, Oct 29, 2014 at 11:04 AM, Kweh, Hock Leong
hock.leong.k...@intel.com wrote:
 -Original Message-
 From: Ming Lei [mailto:ming@canonical.com]
 Sent: Monday, October 27, 2014 12:00 AM

 You can call fw_lookup_buf() directly, otherwise feel free to add:

 Acked-by: Ming Lei ming@canonical.com


 Hi Ming Lei,

 The fw_lookup_buf() is defined inside the conditional preprocessor directive 
 for CONFIG_PM_SLEEP.
 Since the request_firmware_abort() may not only be used in PM_SLEEP, could I 
 move the fw_lookup_buf()
 out from the CONFIG_PM_SLEEP block if we want to call fw_lookup_buf() instead 
 of __fw_lookup_buf()?

Sure.

Thanks,
--
To unsubscribe from this list: send the line unsubscribe linux-efi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


RE: [PATCH v1 1/3] firmware loader: Introduce new API - request_firmware_abort()

2014-10-28 Thread Kweh, Hock Leong
 -Original Message-
 From: Ming Lei [mailto:ming@canonical.com]
 Sent: Monday, October 27, 2014 12:00 AM
 
 You can call fw_lookup_buf() directly, otherwise feel free to add:
 
 Acked-by: Ming Lei ming@canonical.com
 

Hi Ming Lei,

The fw_lookup_buf() is defined inside the conditional preprocessor directive 
for CONFIG_PM_SLEEP.
Since the request_firmware_abort() may not only be used in PM_SLEEP, could I 
move the fw_lookup_buf()
out from the CONFIG_PM_SLEEP block if we want to call fw_lookup_buf() instead 
of __fw_lookup_buf()?

Thanks.


Regards,
Wilson
N�r��yb�X��ǧv�^�)޺{.n�+{�y^n�r���z���h����G���h�(�階�ݢj���m��z�ޖ���f���h���~�m�

Re: [PATCH v1 1/3] firmware loader: Introduce new API - request_firmware_abort()

2014-10-26 Thread Ming Lei
On Fri, Oct 24, 2014 at 2:18 PM, Kweh Hock Leong
hock.leong.k...@intel.com wrote:
 From: Kweh, Hock Leong hock.leong.k...@intel.com

 Besides aborting through user helper interface, a new API
 request_firmware_abort() allows kernel driver module to abort the
 request_firmware() / request_firmware_nowait() when they are no
 longer needed. It is useful for cancelling an outstanding firmware
 load if initiated from inside a module where that module is in the
 process of being unloaded, since the unload function may not have
 a handle to the struct firmware_buf.

 Note for people who use request_firmware_nowait():
 You are required to do your own synchronization after you call
 request_firmware_abort() in order to continue unloading the
 module. The example synchronization code shows below:

 while (THIS_MODULE  module_refcount(THIS_MODULE))
 msleep(20);

 Cc: Matt Fleming matt.flem...@intel.com
 Signed-off-by: Kweh, Hock Leong hock.leong.k...@intel.com
 ---
  drivers/base/firmware_class.c |   30 ++
  include/linux/firmware.h  |4 
  2 files changed, 34 insertions(+)

 diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
 index d276e33..b2fe40b 100644
 --- a/drivers/base/firmware_class.c
 +++ b/drivers/base/firmware_class.c
 @@ -1291,6 +1291,36 @@ request_firmware_nowait(
  }
  EXPORT_SYMBOL(request_firmware_nowait);

 +/**
 + * request_firmware_abort - abort the waiting of firmware request
 + * @fw_name: name of firmware file
 + *
 + * @fw_name is the same name string while calling to request_firmware()
 + * or request_firmware_nowait().
 + **/
 +int request_firmware_abort(const char *fw_name)
 +{
 +   struct firmware_buf *buf;
 +   struct firmware_buf *entry;
 +
 +   spin_lock(fw_cache.lock);
 +   buf = __fw_lookup_buf(fw_name);
 +   spin_unlock(fw_cache.lock);

You can call fw_lookup_buf() directly, otherwise feel free to add:

Acked-by: Ming Lei ming@canonical.com

 +   if (!buf)
 +   return -ENOENT;
 +
 +   mutex_lock(fw_lock);
 +   list_for_each_entry(entry, pending_fw_head, pending_list) {
 +   if (entry == buf) {
 +   __fw_load_abort(buf);
 +   break;
 +   }
 +   }
 +   mutex_unlock(fw_lock);
 +   return 0;
 +}
 +EXPORT_SYMBOL(request_firmware_abort);
 +
  #ifdef CONFIG_PM_SLEEP
  static ASYNC_DOMAIN_EXCLUSIVE(fw_cache_domain);

 diff --git a/include/linux/firmware.h b/include/linux/firmware.h
 index 5952933..ed90c8b 100644
 --- a/include/linux/firmware.h
 +++ b/include/linux/firmware.h
 @@ -47,6 +47,7 @@ int request_firmware_nowait(
 void (*cont)(const struct firmware *fw, void *context));

  void release_firmware(const struct firmware *fw);
 +int request_firmware_abort(const char *fw_name);
  #else
  static inline int request_firmware(const struct firmware **fw,
const char *name,
 @@ -66,6 +67,9 @@ static inline void release_firmware(const struct firmware 
 *fw)
  {
  }

 +static inline int request_firmware_abort(const char *fw_name)
 +{
 +}
  #endif

  #ifdef CONFIG_FW_LOADER_USER_HELPER
 --
 1.7.9.5

--
To unsubscribe from this list: send the line unsubscribe linux-efi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v1 1/3] firmware loader: Introduce new API - request_firmware_abort()

2014-10-24 Thread Kweh Hock Leong
From: Kweh, Hock Leong hock.leong.k...@intel.com

Besides aborting through user helper interface, a new API
request_firmware_abort() allows kernel driver module to abort the
request_firmware() / request_firmware_nowait() when they are no
longer needed. It is useful for cancelling an outstanding firmware
load if initiated from inside a module where that module is in the
process of being unloaded, since the unload function may not have
a handle to the struct firmware_buf.

Note for people who use request_firmware_nowait():
You are required to do your own synchronization after you call
request_firmware_abort() in order to continue unloading the
module. The example synchronization code shows below:

while (THIS_MODULE  module_refcount(THIS_MODULE))
msleep(20);

Cc: Matt Fleming matt.flem...@intel.com
Signed-off-by: Kweh, Hock Leong hock.leong.k...@intel.com
---
 drivers/base/firmware_class.c |   30 ++
 include/linux/firmware.h  |4 
 2 files changed, 34 insertions(+)

diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index d276e33..b2fe40b 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -1291,6 +1291,36 @@ request_firmware_nowait(
 }
 EXPORT_SYMBOL(request_firmware_nowait);
 
+/**
+ * request_firmware_abort - abort the waiting of firmware request
+ * @fw_name: name of firmware file
+ *
+ * @fw_name is the same name string while calling to request_firmware()
+ * or request_firmware_nowait().
+ **/
+int request_firmware_abort(const char *fw_name)
+{
+   struct firmware_buf *buf;
+   struct firmware_buf *entry;
+
+   spin_lock(fw_cache.lock);
+   buf = __fw_lookup_buf(fw_name);
+   spin_unlock(fw_cache.lock);
+   if (!buf)
+   return -ENOENT;
+
+   mutex_lock(fw_lock);
+   list_for_each_entry(entry, pending_fw_head, pending_list) {
+   if (entry == buf) {
+   __fw_load_abort(buf);
+   break;
+   }
+   }
+   mutex_unlock(fw_lock);
+   return 0;
+}
+EXPORT_SYMBOL(request_firmware_abort);
+
 #ifdef CONFIG_PM_SLEEP
 static ASYNC_DOMAIN_EXCLUSIVE(fw_cache_domain);
 
diff --git a/include/linux/firmware.h b/include/linux/firmware.h
index 5952933..ed90c8b 100644
--- a/include/linux/firmware.h
+++ b/include/linux/firmware.h
@@ -47,6 +47,7 @@ int request_firmware_nowait(
void (*cont)(const struct firmware *fw, void *context));
 
 void release_firmware(const struct firmware *fw);
+int request_firmware_abort(const char *fw_name);
 #else
 static inline int request_firmware(const struct firmware **fw,
   const char *name,
@@ -66,6 +67,9 @@ static inline void release_firmware(const struct firmware *fw)
 {
 }
 
+static inline int request_firmware_abort(const char *fw_name)
+{
+}
 #endif
 
 #ifdef CONFIG_FW_LOADER_USER_HELPER
-- 
1.7.9.5

--
To unsubscribe from this list: send the line unsubscribe linux-efi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html