RE: [PATCH] xen-blkback: prevent premature module unload
From: Durrant, Paul <hidden>
Date: 2019-12-11 13:27:58
Also in:
lkml, xen-devel
-----Original Message----- From: Roger Pau Monné <redacted> Sent: 11 December 2019 11:29 To: Durrant, Paul <redacted> Cc: xen-devel@lists.xenproject.org; linux-block@vger.kernel.org; linux- kernel@vger.kernel.org; Konrad Rzeszutek Wilk [off-list ref]; Jens Axboe [off-list ref] Subject: Re: [PATCH] xen-blkback: prevent premature module unload On Tue, Dec 10, 2019 at 02:53:05PM +0000, Paul Durrant wrote:quoted
Objects allocated by xen_blkif_alloc come from the 'blkif_cache' kmem cache. This cache is destoyed when xen-blkif is unloaded so it is necessary to wait for the deferred free routine used for such objects to complete. This necessity was missed in commit 14855954f636 "xen-blkback: allow module to be cleanly unloaded". This patch fixes the problem by taking/releasing extra module references in xen_blkif_alloc/free() respectively. Signed-off-by: Paul Durrant <redacted>Reviewed-by: Roger Pau Monné <redacted> One nit below.quoted
--- Cc: Konrad Rzeszutek Wilk <redacted> Cc: "Roger Pau Monné" <redacted> Cc: Jens Axboe <axboe@kernel.dk> --- drivers/block/xen-blkback/xenbus.c | 10 ++++++++++ 1 file changed, 10 insertions(+)diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.cquoted
index e8c5c54e1d26..59d576d27ca7 100644--- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c@@ -171,6 +171,15 @@ static struct xen_blkif *xen_blkif_alloc(domid_tdomid)quoted
blkif->domid = domid; atomic_set(&blkif->refcnt, 1); init_completion(&blkif->drain_complete); + + /* + * Because freeing back to the cache may be deferred, it is not + * safe to unload the module (and hence destroy the cache) until + * this has completed. To prevent premature unloading, take an + * extra module reference here and release only when the object + * has been free back to the cache.^ freed
Oh yes. Can this be done on commit, or would you like me to send a v2? Paul
quoted
+ */ + __module_get(THIS_MODULE); INIT_WORK(&blkif->free_work, xen_blkif_deferred_free); return blkif;@@ -320,6 +329,7 @@ static void xen_blkif_free(struct xen_blkif *blkif) /* Make sure everything is drained before shutting down */ kmem_cache_free(xen_blkif_cachep, blkif); + module_put(THIS_MODULE); } int __init xen_blkif_interface_init(void) --2.20.1