[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2/2] call ao_how callback explicitly



 >>>Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> wrote: 
> Bamvor Jian Zhang writes ("Re: [Xen-devel] [PATCH 2/2] call ao_how callback  
> explicitly"): 
> ... 
> > > I'm not sure what you mean.  Under what conditions do you not see the 
> > > callback happen ?  The existing machinery is supposed to take care of 
> > > that.  Specifically, in the patch you're changing, 
> > > libxl__ao_complete_check_progress_reports puts the ao onto 
> > > egc->aos_for_callback.  On the return path from the libxl event 
> > > function back to the application, we are supposed to call 
> > > libxl__egc_cleanup, which in turn calls egc_run_callbacks, which 
> > > should pick up the aos on aos_for_callback.  libxl__egc_cleanup is 
> > > called from the event loops in libxl_event_wait and 
> > > libxl__ao_inprogress and from the macro EGC_FREE.  It should be 
> > > impossible for a path to be missed because inside libxl one needs an 
> > > egc to call libxl__ao_complete. 
> ... 
> > the libvirt libxl driver register the event handler through 
> > libxl_event_register_callbacks, 
>  
> Right. 
>  
> > so the libxl_event_wait could not get the event. 
>  
> I understand from this that you're calling libxl_event_wait ?  (Rather
> than that you're saying that you're not calling libxl_event_wait, but
> doing so wouldn't help.)
i am talking about why i could not call libxl_event_wait.
>
> But, as I understand it, you're passing an ao_how which specifies a
> callback, rather than the generation of an event.  So I think
> libxl_event_wait is irrelevant.
agree.
>  
> > and if the ao_how is used, the libxl__egc_cleanup in 
> > "if ( poller )" statement will not be called either. 
> > even if i could expose the libxl_egc_cleanup to libvirt, i still do not 
> > know when should i call it? 
>  
> No, you shouldn't need to call it explicitly and doing so won't help. 
>  
> > i do not know if there is a event triggered 
> > before the ao_how callback should be called. (is there a fd event when 
> > the async operation complete?). 
>  
> It's the other way around.  The async operation completes, probably, 
> because of an fd event.  So I think the call flow should be: 
>  
>  1. Your application notices the fd is readable (say) 
>  2. Your application calls libxl_osevent_occurred_fd. 
>  3. libxl_osevent_occurred_fd allocates an egc on entry. 
>  4. In libxl, libxl_osevent_occurred_fd calls whatever internal 
>     functions are supposed to respond to the fd.  If appropriate, 
>     this will cause some ao to complete.  All of these calls 
>     will receive the same egc as created in step 3.  I.e.: 
>  5. In libxl, something calls libxl__ao_complete. 
>  6. libxl__ao_complete puts the ao on the egc's aos_for_callback 
>     list. 
>  7. The call stack unwinds inside libxl, eventually returning 
>     to libxl_osevent_occurred_fd. 
>  8. libxl_osevent_occurred_fd uses EGC_FREE on exit, and EGC_FREE 
>     contains a call to libxl__egc_cleanup. 
>  9. libxl__egc_cleanup calls egc_run_callbacks which finds the ao 
>     on the aos_for_callback list and makes your application 
>     callback. 

with log and gdb, i could see above flow except the ao in 
egc->aops_for_callback is empty.
and from gdb i could know that the egc is different between 
libxl__ao_complete_check_progress_reports and fd event(here is 
watchfd_callback).
libxl__ao_complete_check_progress_reports
(gdb) p egc
$1 = (libxl__egc *) 0x7fb1fd03f500

watchfd_callback
(gdb) p egc
$4 = (libxl__egc *) 0x7ffffb291960

after check the code in libxl_osevent_occurred_fd, the egc is created in 
watchfd_callback. so, EGC_FREE could not handle the ao added by 
libxl__ao_complete_check_progress_reports. the latter egc is created by 
AO_CREATE in do_domain_create.
is it correct? if so, could we use the same egc all the time?

here is the full libxl.log:
libxl: debug: libxl_create.c:1230:do_domain_create: ao 0x7fb1d0001e50: create: 
how=0x7fb1f6448e80 callback=0x7fb1f6210fb0 poller=(nil)
libxl: debug: libxl_device.c:257:libxl__device_disk_set_backend: Disk vdev=hda 
spec.backend=tap
libxl: debug: libxl_create.c:675:initiate_domain_create: running bootloader
libxl: debug: libxl_bootloader.c:321:libxl__bootloader_run: not a PV domain, 
skipping bootloader
libxl: debug: libxl_event.c:608:libxl__ev_xswatch_deregister: watch 
w=0x7fb1d0003078: deregister unregistered
libxl: debug: libxl_numa.c:475:libxl__get_numa_candidate: New best NUMA 
placement candidate found: nr_nodes=1, nr_cpus=8, nr_vcpus=9, free_memkb=908
libxl: detail: libxl_dom.c:195:numa_place_domain: NUMA placement candidate with 
1 nodes, 8 cpus and 908 KB free selected
xc: detail: elf_parse_binary: phdr: paddr=0x100000 memsz=0x9f0c8
xc: detail: elf_parse_binary: memory: 0x100000 -> 0x19f0c8
xc: info: VIRTUAL MEMORY ARRANGEMENT:
  Loader:        0000000000100000->000000000019f0c8
  Modules:       0000000000000000->0000000000000000
  TOTAL:         0000000000000000->000000001f800000
  ENTRY ADDRESS: 0000000000100000
xc: info: PHYSICAL MEMORY ALLOCATION:
  4KB PAGES: 0x0000000000000200
  2MB PAGES: 0x00000000000000fb
  1GB PAGES: 0x0000000000000000
xc: detail: elf_load_binary: phdr 0 at 0x7fb1f2f48000 -> 0x7fb1f2fddf4d
libxl: debug: libxl_device.c:257:libxl__device_disk_set_backend: Disk vdev=hda 
spec.backend=tap
libxl: debug: libxl_event.c:559:libxl__ev_xswatch_register: watch 
w=0x7fb1d0002558 wpath=/local/domain/0/backend/vbd/2/768/state token=3/0: 
register slotnum=3
libxl: debug: libxl_create.c:1243:do_domain_create: ao 0x7fb1d0001e50: 
inprogress: poller=(nil), flags=i
libxl: debug: libxl_event.c:503:watchfd_callback: watch w=0x7fb1d0002558 
wpath=/local/domain/0/backend/vbd/2/768/state token=3/0: event 
epath=/local/domain/0/backend/vbd/2/768/state
libxl: debug: libxl_event.c:643:devstate_watch_callback: backend 
/local/domain/0/backend/vbd/2/768/state wanted state 2 ok
libxl: debug: libxl_event.c:596:libxl__ev_xswatch_deregister: watch 
w=0x7fb1d0002558 wpath=/local/domain/0/backend/vbd/2/768/state token=3/0: 
deregister slotnum=3
libxl: debug: libxl_event.c:608:libxl__ev_xswatch_deregister: watch 
w=0x7fb1d0002558: deregister unregistered
libxl: debug: libxl_device.c:959:device_hotplug: calling hotplug script: 
/etc/xen/scripts/block add
libxl: debug: libxl_dm.c:1218:libxl__spawn_local_dm: Spawning device-model 
/usr/lib/xen/bin/qemu-system-i386 with arguments:
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   
/usr/lib/xen/bin/qemu-system-i386
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -xen-domid
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   2
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -chardev
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   
socket,id=libxl-cmd,path=/var/run/xen/qmp-libxl-2,server,nowait
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -mon
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   
chardev=libxl-cmd,mode=control
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -name
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   bjz_04_sles11_sp2
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -vnc
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   127.0.0.1:0,to=99
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -global
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   isa-fdc.driveA=
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -vga
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   cirrus
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -global
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   vga.vram_size_mb=8
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -boot
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   order=c
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -net
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   none
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -M
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   xenfv
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -m
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   504
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   -drive
libxl: debug: libxl_dm.c:1220:libxl__spawn_local_dm:   
file=/var/lib/xen/images_2/bjz_04_sles11_sp2/disk0.raw,if=ide,index=0,media=disk,format=raw,cache=writeback
libxl: debug: libxl_event.c:559:libxl__ev_xswatch_register: watch 
w=0x7fb1d00032b0 wpath=/local/domain/0/device-model/2/state token=3/1: register 
slotnum=3
libxl: debug: libxl_event.c:503:watchfd_callback: watch w=0x7fb1d00032b0 
wpath=/local/domain/0/device-model/2/state token=3/1: event 
epath=/local/domain/0/device-model/2/state
libxl: debug: libxl_event.c:596:libxl__ev_xswatch_deregister: watch 
w=0x7fb1d00032b0 wpath=/local/domain/0/device-model/2/state token=3/1: 
deregister slotnum=3
libxl: debug: libxl_event.c:472:watchfd_callback: watch 
epath=/local/domain/0/device-model/2/state token=3/1: empty slot
libxl: debug: libxl_event.c:608:libxl__ev_xswatch_deregister: watch 
w=0x7fb1d00032b0: deregister unregistered
libxl: debug: libxl_qmp.c:707:libxl__qmp_initialize: connected to 
/var/run/xen/qmp-libxl-2
libxl: debug: libxl_qmp.c:299:qmp_handle_response: message type: qmp
libxl: debug: libxl_qmp.c:555:qmp_send_prepare: next qmp command: '{
    "execute": "qmp_capabilities",
    "id": 1
}
'
libxl: debug: libxl_qmp.c:299:qmp_handle_response: message type: return
libxl: debug: libxl_qmp.c:555:qmp_send_prepare: next qmp command: '{
    "execute": "query-chardev",
    "id": 2
}
'
libxl: debug: libxl_qmp.c:299:qmp_handle_response: message type: return
libxl: debug: libxl_qmp.c:555:qmp_send_prepare: next qmp command: '{
    "execute": "query-vnc",
    "id": 3
}
'
libxl: debug: libxl_qmp.c:299:qmp_handle_response: message type: return
libxl: debug: libxl_event.c:559:libxl__ev_xswatch_register: watch 
w=0x7fb1d0007b58 wpath=/local/domain/0/backend/vif/2/0/state token=3/2: 
register slotnum=3
libxl: debug: libxl_event.c:503:watchfd_callback: watch w=0x7fb1d0007b58 
wpath=/local/domain/0/backend/vif/2/0/state token=3/2: event 
epath=/local/domain/0/backend/vif/2/0/state
libxl: debug: libxl_event.c:643:devstate_watch_callback: backend 
/local/domain/0/backend/vif/2/0/state wanted state 2 ok
libxl: debug: libxl_event.c:596:libxl__ev_xswatch_deregister: watch 
w=0x7fb1d0007b58 wpath=/local/domain/0/backend/vif/2/0/state token=3/2: 
deregister slotnum=3
libxl: debug: libxl_event.c:608:libxl__ev_xswatch_deregister: watch 
w=0x7fb1d0007b58: deregister unregistered
libxl: debug: libxl_device.c:959:device_hotplug: calling hotplug script: 
/etc/xen/scripts/vif-bridge online
libxl: debug: libxl_event.c:472:watchfd_callback: watch 
epath=/local/domain/0/backend/vif/2/0/state token=3/2: empty slot
libxl: debug: libxl_event.c:1737:libxl__ao_progress_report: ao 0x7fb1d0001e50: 
progress report: ignored
libxl: debug: libxl_event.c:1569:libxl__ao_complete: ao 0x7fb1d0001e50: 
complete, rc=0
libxl: debug: libxl_event.c:1599:libxl__ao_complete_check_progress_reports: ao 
0x7fb1d0001e50: complete for callback
libxl: debug: libxl_event.c:1173:egc_run_callbacks: ao 0x7fb1d0001e50: 
completion callback
libxl: debug: libxl_event.c:1541:libxl__ao__destroy: ao 0x7fb1d0001e50: destroy
libxl: debug: libxl_event.c:559:libxl__ev_xswatch_register: watch 
w=0x7fb1d00029b0 wpath=@releaseDomain token=3/3: register slotnum=3
libxl: debug: libxl_event.c:503:watchfd_callback: watch w=0x7fb1d00029b0 
wpath=@releaseDomain token=3/3: event epath=@releaseDomain
libxl: debug: libxl.c:1000:domain_death_xswatch_callback: 
[evg=0x7fb1d0006330:2] from domid=2 nentries=1 rc=1
libxl: debug: libxl.c:1011:domain_death_xswatch_callback: 
[evg=0x7fb1d0006330:2]   got=domaininfos[0] got->domain=2
libxl: debug: libxl.c:1038:domain_death_xswatch_callback:  exists 
shutdown_reported=0 dominf.flags=ffff0022
libxl: debug: libxl.c:1004:domain_death_xswatch_callback: [evg=0] all reported
libxl: debug: libxl.c:1068:domain_death_xswatch_callback: domain death search 
done
xc: debug: hypercall buffer: total allocations:0 total releases:0
xc: debug: hypercall buffer: current allocations:0 maximum allocations:0
xc: debug: hypercall buffer: cache current size:0
xc: debug: hypercall buffer: cache hits:0 misses:0 toobig:0

best regards

bamvor
> The purpose of the "poller" machinery is so that if at step 5 we 
> decide to return an event structure, rather than making a callback, a 
> concurrent call to libxl_event_wait (on a different thread) can be 
> woken up. 
>  
> Can you turn on libxl's debugging and send me a trace of it losing the 
> event ? 
>  
> Ian. 
>  
> _______________________________________________ 
> Xen-devel mailing list 
> Xen-devel@xxxxxxxxxxxxx 
> http://lists.xen.org/xen-devel 
>  
>  


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.