Hi. Thanks very much! I will try these patches. -Lixiaokeng On 2020/7/28 0:45, Benjamin Marzinski wrote: > 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