On Sat, Jul 25, 2020 at 01:47:01PM +0800, lixiaokeng wrote: > When one iscsi device logs in and logs out with the "multipath -r" > executed at the same time, memory leak happens in multipathd > process. > > The reason is following. When "multipath -r" is executed, the path > will be free in configure function. Before path_discovery executed, > iscsi device logs out. Then path_discovery will not find any path and > there is no path in the gvecs->pathvec. When map_discovery function > is executed, disassemble_map function will be called. Because > gvecs->pathvec->slot is empty and is_deamon is 1, a path will be > allocated and is not stored in gvecs->pathvec but store in > mpp->pg. But when the mpp is removed and freed by remove_map > function, the path will not be free and can't be find anymore. > > The procedure details given as follows, > 1."multipath -r" is executed > main > ->child > ->reconfigure > ->configure > ->path_discovery //after iscsi logout > ->map_discovery > ->update_multipath_table > ->disassemble_map > ->alloc_path > 2.then "multipath -r" is executed again > main > main > ->child > ->reconfigure > ->remove_maps_and_stop_waiters > ->remove_maps > > Here, we delete checking is_deamon. Because whether the process is a > daemon process or not, we think the path should be add to gvecs->pathvec. There is more work that needs to be done to besides removing the is_daemon check. However, Martin already posted patches that deal with this as part of the his large patchset. https://www.redhat.com/archives/dm-devel/2020-July/msg00245.html You should take a look at those, and at my comments on them, because they should resolve your issue. -Ben > > Reported-by: Tianxiong Li <lutianxiong@xxxxxxxxxx> > Signed-off-by: Lixiaokeng <lixiaokeng@xxxxxxxxxx> > Signed-off-by: Zhiqiang Liu <liuzhiqiang26@xxxxxxxxxx> > > --- > libmultipath/dmparser.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/libmultipath/dmparser.c b/libmultipath/dmparser.c > index b856a07f..d556f642 100644 > --- a/libmultipath/dmparser.c > +++ b/libmultipath/dmparser.c > @@ -315,7 +315,7 @@ int disassemble_map(vector pathvec, char *params, struct multipath *mpp, > WWID_SIZE); > } > /* Only call this in multipath client mode */ > - if (!is_daemon && store_path(pathvec, pp)) > + if (store_path(pathvec, pp)) > goto out1; > } else { > if (!strlen(pp->wwid) && > -- -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel