Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

devm-helpers: Add resource managed version of work init

A few drivers which need a work-queue must cancel work at driver detach.
Some of those implement remove() solely for this purpose. Help drivers to
avoid unnecessary remove and error-branch implementation by adding managed
verision of work initialization. This will also help drivers to avoid
mixing manual and devm based unwinding when other resources are handled by
devm.

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/94ff4175e7f2ff134ed2fa7d6e7641005cc9784b.1623146580.git.matti.vaittinen@fi.rohmeurope.com
Signed-off-by: Hans de Goede <hdegoede@redhat.com>

authored by

Matti Vaittinen and committed by
Hans de Goede
7a2c4cc5 6efb943b

+25
+25
include/linux/devm-helpers.h
··· 51 51 return devm_add_action(dev, devm_delayed_work_drop, w); 52 52 } 53 53 54 + static inline void devm_work_drop(void *res) 55 + { 56 + cancel_work_sync(res); 57 + } 58 + 59 + /** 60 + * devm_work_autocancel - Resource-managed work allocation 61 + * @dev: Device which lifetime work is bound to 62 + * @w: Work to be added (and automatically cancelled) 63 + * @worker: Worker function 64 + * 65 + * Initialize work which is automatically cancelled when driver is detached. 66 + * A few drivers need to queue work which must be cancelled before driver 67 + * is detached to avoid accessing removed resources. 68 + * devm_work_autocancel() can be used to omit the explicit 69 + * cancelleation when driver is detached. 70 + */ 71 + static inline int devm_work_autocancel(struct device *dev, 72 + struct work_struct *w, 73 + work_func_t worker) 74 + { 75 + INIT_WORK(w, worker); 76 + return devm_add_action(dev, devm_work_drop, w); 77 + } 78 + 54 79 #endif