<div><font size=3 face="Times New Roman">Hello Christophe, Ben, Hannes,
Martin, Bart, </font>
<br>
<div><font size=3 face="Times New Roman">I am a member of host-side software
development team of ZXUSP storage project </font>
<br><font size=3 face="Times New Roman">in ZTE Corporation. Facing the
market demand, our team decides to write code to </font>
<br><font size=3 face="Times New Roman">promote multipath efficiency next
month. The whole idea is in the mail below</font><font size=1>.</font><font size=3 face="Times New Roman">We
</font>
<br><font size=3 face="Times New Roman">hope to participate in and make
progress with the open source community, so any </font>
<br><font size=3 face="Times New Roman">suggestion and comment would be
welcome. </font>
<br>
<br><font size=3 face="Times New Roman">Thanks,</font>
<br><font size=3 face="Times New Roman">Tang</font>
<br>
<br><font size=2 face="Times New Roman">------------------------------------------------------------------------------------------------------------------------------</font>
<br><font size=2 face="Times New Roman">------------------------------------------------------------------------------------------------------------------------------</font>
<br><font size=4 face="Times New Roman">1.        Problem</font>
<br><font size=3 face="Times New Roman">In these scenarios, multipath processing
efficiency is low:</font>
<br><font size=3 face="Times New Roman">1) Many paths exist in each multipath
device,</font>
<br><font size=3 face="Times New Roman">2) Devices addition or deletion
during iSCSI login/logout or FC link up/down.</font>
<br>
<br><font size=4 face="Times New Roman">2.        Reasons</font>
<br><font size=3 face="Times New Roman">Multipath process uevents one by
one, and each one also produce a new dm </font>
<br><font size=3 face="Times New Roman">addition change or deletion</font><font size=3 face="sans-serif">
</font><font size=3 face="Times New Roman">uevent to increased system resource
consumption, </font>
<br><font size=3 face="Times New Roman">actually most of these uevents
have no sense at all. </font>
<br>
<br><font size=3 face="Times New Roman">E.g. login procedure of 4 iSCSI
sessions with 3 LUNs:</font>
<br><font size=3 face="Times New Roman">1) Multipath processes these uevents
one by one:</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.806214] add  
   /devices/platform/host3/session44/target3:0:0/3:0:0:0/block/sdc
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.909457] add  
   /devices/platform/host3/session44/target3:0:0/3:0:0:2/block/sdg
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.944956] add  
   /devices/platform/host3/session44/target3:0:0/3:0:0:1/block/sde
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.959215] add  
   /devices/platform/host5/session46/target5:0:0/5:0:0:0/block/sdh
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.978558] add  
   /devices/platform/host5/session46/target5:0:0/5:0:0:2/block/sdk
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.004217] add  
   /devices/platform/host5/session46/target5:0:0/5:0:0:1/block/sdj
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.486361] add  
   /devices/platform/host4/session45/target4:0:0/4:0:0:1/block/sdf
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.495194] add  
   /devices/platform/host4/session45/target4:0:0/4:0:0:0/block/sdd
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.511628] add  
   /devices/platform/host4/session45/target4:0:0/4:0:0:2/block/sdi
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.716292] add  
   /devices/platform/host6/session47/target6:0:0/6:0:0:0/block/sdl
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.748456] add  
   /devices/platform/host6/session47/target6:0:0/6:0:0:1/block/sdm
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.789662] add  
   /devices/platform/host6/session47/target6:0:0/6:0:0:2/block/sdn
(block)</font>
<br>
<br><font size=3 face="Times New Roman">2) Multipath also produce DM uvents
by step 1), which would be processed by </font>
<br><font size=3 face="Times New Roman">udev and other process who listening
kernel: </font>
<br><font size=1 face="Times New Roman">KERNEL[89068.899614] add  
   /devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89068.902477] change  
/devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89068.955364] add  
   /devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89068.960663] change  
/devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89069.018903] add  
   /devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89069.042102] change  
/devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89069.297252] change  
/devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89069.346718] change  
/devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89069.388361] change  
/devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89069.548270] change  
/devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89069.607306] change  
/devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89070.118067] change  
/devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89070.136256] change  
/devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89070.157222] change  
/devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89070.216269] change  
/devices/virtual/block/dm-3 (block)</font>
<br>
<br><font size=3 face="Times New Roman">3) After processing by udev in
step 2), udev also transfers these uevents to </font>
<br><font size=3 face="Times New Roman">multipath</font><font size=3 face="sans-serif">£º</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.926428] add  
   /devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.007511] add  
   /devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.098054] add  
   /devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.291184] change
  /devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.320632] change
  /devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.381434] change
  /devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.637666] change
  /devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.682303] change
  /devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.860877] change
  /devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.904735] change
  /devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89070.327167] change
  /devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89070.371114] change
  /devices/virtual/block/dm-4 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89070.434592] change
  /devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89070.572072] change
  /devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89070.703181] change
  /devices/virtual/block/dm-3 (block)</font>
<br>
<br><font size=3 face="Times New Roman">4) Multipath processes uevents
above.</font>
<br>
<br><font size=3 face="Times New Roman">The efficiency of processing uevents
one by one is low, and it produces too </font>
<br><font size=3 face="Times New Roman">many uevents, which further reducing
the processing efficiency. The problem </font>
<br><font size=3 face="Times New Roman">is similar in the logout procedure
of iSCSI sessions.</font>
<br>
<br><font size=4 face="Times New Roman">3.        Negative
effect</font>
<br><font size=3 face="Times New Roman">Multipath processes so slowly that
it is not satisfied to some applications, For </font>
<br><font size=3 face="Times New Roman">example,</font><font size=3 face="sans-serif">
</font><font size=3 face="Times New Roman">Openstack is often timeout in
waiting for the creation of multipath </font>
<br><font size=3 face="Times New Roman">devices.</font>
<br>
<br><font size=4 face="Times New Roman">4.        Proposal</font>
<br><font size=3 face="Times New Roman">Other than processing uevents one
by one, uevents which coming from the </font>
<br><font size=3 face="Times New Roman">same LUN devices can be mergered
to one, and then uevent processing </font>
<br><font size=3 face="Times New Roman">thread only needs to process it
once, and it only produces one DM addition </font>
<br><font size=3 face="Times New Roman">uevent which could reduce system
resource consumption.</font>
<br>
<br><font size=3 face="Times New Roman">The example in Chapter 2 is continued
to use to explain the proposal:</font>
<br><font size=3 face="Times New Roman">1) Multipath receives block device
addition uevents from udev:</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.806214] add  
   /devices/platform/host3/session44/target3:0:0/3:0:0:0/block/sdc
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.909457] add  
   /devices/platform/host3/session44/target3:0:0/3:0:0:2/block/sdg
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.944956] add  
   /devices/platform/host3/session44/target3:0:0/3:0:0:1/block/sde
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.959215] add  
   /devices/platform/host5/session46/target5:0:0/5:0:0:0/block/sdh
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.978558] add  
   /devices/platform/host5/session46/target5:0:0/5:0:0:2/block/sdk
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.004217] add  
   /devices/platform/host5/session46/target5:0:0/5:0:0:1/block/sdj
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.486361] add  
   /devices/platform/host4/session45/target4:0:0/4:0:0:1/block/sdf
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.495194] add  
   /devices/platform/host4/session45/target4:0:0/4:0:0:0/block/sdd
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.511628] add  
   /devices/platform/host4/session45/target4:0:0/4:0:0:2/block/sdi
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.716292] add  
   /devices/platform/host6/session47/target6:0:0/6:0:0:0/block/sdl
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.748456] add  
   /devices/platform/host6/session47/target6:0:0/6:0:0:1/block/sdm
(block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.789662] add  
   /devices/platform/host6/session47/target6:0:0/6:0:0:2/block/sdn
(block)</font>
<br>
<br><font size=3 face="Times New Roman">2) Multipath merges these 12 uevents
to 3 internal uvents</font>
<br><font size=1 face="Times New Roman">UEVENT add sdc sdh sdd sdl </font>
<br><font size=1 face="Times New Roman">UEVENT add sde sdj sdf sdm </font>
<br><font size=1 face="Times New Roman">UEVENT add sdg sdk sdi sdn</font>
<br>
<br><font size=3 face="Times New Roman">3) Multipath process these 3 uevents
one by one, and only produce 3 addition </font>
<br><font size=3 face="Times New Roman">DM uvents, no dm change uevent
exists.</font>
<br><font size=1 face="Times New Roman">KERNEL[89068.899614] add  
   /devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89068.955364] add  
   /devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">KERNEL[89069.018903] add  
   /devices/virtual/block/dm-4 (block)</font>
<br>
<br><font size=3 face="Times New Roman">4) Udev process these uevents above,
and transfer it to multipath</font>
<br><font size=1 face="Times New Roman">UDEV  [89068.926428] add  
   /devices/virtual/block/dm-2 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.007511] add  
   /devices/virtual/block/dm-3 (block)</font>
<br><font size=1 face="Times New Roman">UDEV  [89069.098054] add  
   /devices/virtual/block/dm-4 (block)</font>
<br>
<br><font size=3 face="Times New Roman">5) Multipath processes these uevents
above, and finishes the creation of multipath </font>
<br><font size=3 face="Times New Roman">devices.</font>
<br>
<br><font size=4 face="Times New Roman">5.        Coding</font>
<br><font size=3 face="Times New Roman">After taking over uevents form
uevent listening thread, uevent processing thread can </font>
<br><font size=3 face="Times New Roman">merger these uevents before processing</font><font size=3 face="sans-serif">£º</font>
<br><font size=1 face="Times New Roman">int uevent_dispatch(int (*uev_trigger)(struct
uevent *, void * trigger_data),</font>
<br><font size=1 face="Times New Roman">         
  void * trigger_data)</font>
<br><font size=1 face="Times New Roman">{</font>
<br><font size=1 face="Times New Roman">    ...</font>
<br><font size=1 face="Times New Roman">    while (1) {</font>
<br><font size=1 face="Times New Roman">        ...</font>
<br><font size=1 face="Times New Roman">        list_splice_init(&uevq,
&uevq_tmp);</font>
<br><font size=1 face="Times New Roman">        ...</font>
<br><font size=1 face="Times New Roman">        </font><font size=1 color=#5291ef face="Times New Roman"><b>list_merger_uevents(&uevq_tmp);</b></font>
<br><font size=1 face="Times New Roman">        service_uevq(&uevq_tmp);</font>
<br><font size=1 face="Times New Roman">    }</font>
<br><font size=1 face="Times New Roman">    ...</font>
<br><font size=1 face="Times New Roman">}</font>
<br><font size=3 face="Times New Roman">In structure of ¡°struct uevent¡±
, an additional member of ¡°char wwid[WWID_SIZE]¡± is </font>
<br><font size=3 face="Times New Roman">added to record each device WWID
for addition or change uevent to identify whether </font>
<br><font size=3 face="Times New Roman">these uevents coming from the same
LUN, and an additional member of </font>
<br><font size=3 face="Times New Roman">¡°struct list_head merger_node¡±
is added to record the list of uevents which having been </font>
<br><font size=3 face="Times New Roman">merged with this uevent:</font>
<br><font size=1 face="Times New Roman">struct uevent {</font>
<br><font size=1 face="Times New Roman">    struct list_head
node;</font>
<br><font size=1 color=#5291ef face="Times New Roman">    <b>struct
list_head merger_node;</b></font>
<br><font size=1 color=#5291ef face="Times New Roman">    <b>char
wwid[WWID_SIZE]</b></font>
<br><font size=1 face="Times New Roman">    struct udev_device
*udev;</font>
<br><font size=1 face="Times New Roman">    ...</font>
<br><font size=1 face="Times New Roman">};</font>
<br>
<br><font size=3 face="Times New Roman">In list_merger_uevents(&uevq_tmp),
each node is traversed from the latest to the oldest, </font>
<br><font size=3 face="Times New Roman">and the older node with the same
WWID and uevent type(e.g. add) would be moved to </font>
<br><font size=3 face="Times New Roman">the merger_node list of the later
node. If a deletion uevent node occurred, other older </font>
<br><font size=3 face="Times New Roman">uevent nodes about this device
would be filtered(Thanks to Martin¡¯s idea). </font>
<br>
<br><font size=3 face="Times New Roman">After above processing, attention
must be paid to that the parameter </font>
<br><font size=3 face="Times New Roman">¡°struct uevent * uev¡± is not
a single uevent any more in and after uev_trigger(), code </font>
<br><font size=3 face="Times New Roman">need to be modified to process
batch uevents in uev_add_path() and so on.</font>
<br>
<br></div></div>