<font size=2 face="sans-serif">Hello Ben,</font>
<br>
<br><font size=2 face="sans-serif">I know the issue of </font><tt><font size=2>socket's
buffer fills up, </font></tt>
<br><tt><font size=2>but I think uevent_can_discard() totally process in
memory,</font></tt>
<br><tt><font size=2>it is light-weight and low cpu consumption, and it
reduce the </font></tt>
<br><tt><font size=2>iteration count in merging, the test result is also
good in</font></tt>
<br><tt><font size=2>massive multipath devices scene. </font></tt>
<br>
<br><tt><font size=2>But </font></tt><font size=2>if you still stick to
it</font><tt><font size=2>, I will revert it to uevents </font></tt>
<br><tt><font size=2>processing thread, and call it in uevent_dispatch()
before </font></tt>
<br><tt><font size=2>calling merge_uevq(), </font></tt><font size=2>actually,
I'm going to do that.</font>
<br>
<br><tt><font size=2>Regards</font></tt>
<br><tt><font size=2>Tang Junhui</font></tt>
<br>
<br>
<br>
<br>
<br>
<br><font size=1 color=#5f5f5f face="sans-serif">发件人:    
    </font><font size=1 face="sans-serif">"Benjamin
Marzinski" <bmarzins@redhat.com></font>
<br><font size=1 color=#5f5f5f face="sans-serif">收件人:    
    </font><font size=1 face="sans-serif">tang.junhui@zte.com.cn,
</font>
<br><font size=1 color=#5f5f5f face="sans-serif">抄送:    
   </font><font size=1 face="sans-serif">tang.wenjun3@zte.com.cn,
zhang.kai16@zte.com.cn, dm-devel@redhat.com, bart.vanassche@sandisk.com,
mwilck@suse.com</font>
<br><font size=1 color=#5f5f5f face="sans-serif">日期:    
    </font><font size=1 face="sans-serif">2017/01/04
06:38</font>
<br><font size=1 color=#5f5f5f face="sans-serif">主题:    
   </font><font size=1 face="sans-serif">Re: [dm-devel]
[PATCH 08/12] libmultipath: wait one seconds for more uevents in uevent_listen()
in uevents burst situations</font>
<br><font size=1 color=#5f5f5f face="sans-serif">发件人:    
   </font><font size=1 face="sans-serif">dm-devel-bounces@redhat.com</font>
<br>
<hr noshade>
<br>
<br>
<br><tt><font size=2>On Tue, Dec 27, 2016 at 04:03:25PM +0800, tang.junhui@zte.com.cn
wrote:<br>
> From: tang.junhui <tang.junhui@zte.com.cn><br>
> <br>
> The more uevents are merged, the higher efficiency program will performs.<br>
> So, do not process uevents after receiving immediately in uevents
burst<br>
> situations, but continue wait 1 seconds for more uevents except that
too<br>
> much uevents (2048) have already been received or too much time eclipse<br>
> (60 seconds).<br>
<br>
The issue I have with doing this in uevent_listen is that we seperated<br>
receiving the uevents from servicing the uevents specificially to make<br>
sure what we received them as fast as possible. The udev monitor code<br>
is all based on a NETLINK socket. If our socket's receive buffer fills<br>
up, there is no flow control. Events just start getting dropped, which<br>
does cut down on processing time, but not in a way we would like.<br>
<br>
This issue applies to a lesser extent to you previous two patches. I<br>
don't really see the benefit of making sure that we drop the uevents<br>
as soon as possible.  As long as we don't process them, that should<br>
be good enough, right?<br>
<br>
Now, maybe you put a lot of thought into your timeouts, and feel<br>
confident that we will start processing well before the receive buffer<br>
fills up. But if so, some comments on that would be reassuring, because<br>
from the commit message, they seem fairly arbitrary to me.<br>
<br>
-Ben<br>
<br>
> <br>
> Change-Id: I763d491540e8114a81d12d603281540a81502742<br>
> Signed-off-by: tang.junhui <tang.junhui@zte.com.cn><br>
> ---<br>
>  libmultipath/uevent.c | 35 +++++++++++++++++++++++++++++++++--<br>
>  1 file changed, 33 insertions(+), 2 deletions(-)<br>
> <br>
> diff --git a/libmultipath/uevent.c b/libmultipath/uevent.c<br>
> index cc10d65..b0b05e9 100644<br>
> --- a/libmultipath/uevent.c<br>
> +++ b/libmultipath/uevent.c<br>
> @@ -39,6 +39,7 @@<br>
>  #include <linux/netlink.h><br>
>  #include <pthread.h><br>
>  #include <sys/mman.h><br>
> +#include <sys/time.h><br>
>  #include <libudev.h><br>
>  #include <errno.h><br>
>  <br>
> @@ -490,11 +491,37 @@ struct uevent *uevent_from_udev_device(struct
udev_device *dev)<br>
>                  
return uev;<br>
>  }<br>
>  <br>
> +bool uevent_burst(struct timeval *start_time, int events)<br>
> +{<br>
> +                
struct timeval diff_time, end_time;<br>
> +                
unsigned long speed;<br>
> +                
unsigned long eclipse_ms;<br>
> +<br>
> +                
gettimeofday(&end_time, NULL);<br>
> +                
timersub(&end_time, start_time, &diff_time);<br>
> +<br>
> +                
eclipse_ms = diff_time.tv_sec * 1000 + diff_time.tv_usec / 1000;<br>
> +                
if (eclipse_ms == 0)<br>
> +                
                 return
true;<br>
> +                
/* max wait 60s */<br>
> +                
if (eclipse_ms > 60*1000) {<br>
> +                
                 condlog(1,
"burst continued =%lu ms, stoped", eclipse_ms);<br>
> +                
                 return
false;<br>
> +                
}<br>
> +<br>
> +                
speed = (events * 1000) / eclipse_ms;<br>
> +                
if (speed > 10)<br>
> +                
                 return
true;<br>
> +<br>
> +                
return false;<br>
> +}<br>
> +<br>
>  int uevent_listen(struct udev *udev)<br>
>  {<br>
>                  
int err = 2;<br>
>                  
struct udev_monitor *monitor = NULL;<br>
>                  
int fd, socket_flags, events;<br>
> +                
struct timeval start_time;<br>
>                  
int need_failback = 1;<br>
>                  
int timeout = 30;<br>
>                  
LIST_HEAD(uevlisten_tmp);<br>
> @@ -548,6 +575,7 @@ int uevent_listen(struct udev *udev)<br>
>                  
}<br>
>  <br>
>                  
events = 0;<br>
> +                
gettimeofday(&start_time, NULL);<br>
>                  
while (1) {<br>
>                  
                 struct
uevent *uev;<br>
>                  
                 struct
udev_device *dev;<br>
> @@ -562,7 +590,8 @@ int uevent_listen(struct udev *udev)<br>
>                  
                 errno
= 0;<br>
>                  
                 fdcount
= poll(&ev_poll, 1, poll_timeout);<br>
>                  
                 if
(fdcount && ev_poll.revents & POLLIN) {<br>
> -                
                 
               
timeout = 0;<br>
> +                
                 
               
timeout = uevent_burst(&start_time, events + 1) ? 1:0;<br>
> +<br>
>                  
                 
               
dev = udev_monitor_receive_device(monitor);<br>
>                  
                 
               
if (!dev) {<br>
>                  
                 
               
                 condlog(0,
"failed getting udev device");<br>
> @@ -578,7 +607,8 @@ int uevent_listen(struct udev *udev)<br>
>                  
                 
               
}<br>
>                  
                 
               
list_add_tail(&uev->node, &uevlisten_tmp);<br>
>                  
                 
               
events++;<br>
> -                
                 
               
continue;<br>
> +                
                 
               
if(events < 2048)<br>
> +                
                 
               
                 continue;<br>
>                  
                 }<br>
>                  
                 if
(fdcount < 0) {<br>
>                  
                 
               
if (errno == EINTR)<br>
> @@ -600,6 +630,7 @@ int uevent_listen(struct udev *udev)<br>
>                  
                 
               
pthread_mutex_unlock(uevq_lockp);<br>
>                  
                 
               
events = 0;<br>
>                  
                 }<br>
> +                
                 gettimeofday(&start_time,
NULL);<br>
>                  
                 timeout
= 30;<br>
>                  
}<br>
>                  
need_failback = 0;<br>
> -- <br>
> 2.8.1.windows.1<br>
> <br>
<br>
--<br>
dm-devel mailing list<br>
dm-devel@redhat.com<br>
</font></tt><a href="https://www.redhat.com/mailman/listinfo/dm-devel"><tt><font size=2>https://www.redhat.com/mailman/listinfo/dm-devel</font></tt></a><tt><font size=2><br>
</font></tt>
<br>