[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 1/2] xen: enter/exit lazy_mmu_mode around m2p_override calls
On Tue, Apr 10, 2012 at 05:29:34PM +0100, Stefano Stabellini wrote: > This patch is a significant performance improvement for the > m2p_override: about 6% using the gntdev device. > > Each m2p_add/remove_override call issues a MULTI_grant_table_op and a > __flush_tlb_single if kmap_op != NULL. Batching all the calls together > is a great performance benefit because it means issuing one hypercall > total rather than two hypercall per page. > If paravirt_lazy_mode is set PARAVIRT_LAZY_MMU, all these calls are > going to be batched together, otherwise they are issued one at a time. > > Adding arch_enter_lazy_mmu_mode/arch_leave_lazy_mmu_mode around the > m2p_add/remove_override calls forces paravirt_lazy_mode to > PARAVIRT_LAZY_MMU, therefore makes sure that they are always batched. > > > Changes in v3: > - do not call arch_enter/leave_lazy_mmu_mode in xen_blkbk_unmap, that > can be called in interrupt context. This is with RHEL5 (somehow the pvops kernels don't trigger this): [ 311.247884] xen-blkback:ring-ref 8, event-channel 11, protocol 1 (x86_64-abi) [ 313.200497] ------------[ cut here ]------------ [ 313.205166] kernel BUG at /home/konrad/linux/arch/x86/kernel/paravirt.cahci libahci font bitblit ttm libata softcursor scsi_mod drm_kms_helper wmi xen_blkfront xen_netfront fb_sys_fops sysimgblt sysfillrect syscopyarea xenfs xen_privcmd [last unloaded: dump_dma] [ 313.256453] [ 313.258064] Pid: 3370, comm: run_guests Tainted: G O 3.4.0-rc3upstream-10947-g331a503 #1 System manufacturer System Product Name/F1A75-M [ 313.271667] RIP: e030:[<ffffffff8105f86e>] [<ffffffff8105f86e>] paravirt_enter_lazy_mmu+0x1e/0x30 [ 313.280977] RSP: e02b:ffff8802014549e0 EFLAGS: 00010202 [ 313.286544] RAX: 0000000000000001 RBX: ffff880201454b50 RCX: 0000000000000000 [ 313.293971] RDX: 0000000000000001 RSI: ffff880201454a40 RDI: 0000000000000001 [ 313.301400] RBP: ffff8802014549e0 R08: ffff880000000000 R09: 0000000000000000 [ 313.308829] R10: 0000000000000000 R11: 0000000000000028 R12: 0000000000000001 [ 313.316257] R13: 0000000000000000 R14: 0000000000000030 R15: aaaaaaaaaaaaaaab [ 313.323691] FS: 00007fb6cc941700(0000) GS:ffff880201451000(0000) knlGS:0000000000000000 [ 313.332101] CS: e033 DS: 0000 ES: 0000 CR0: 000000008005003b [ 313.338099] CR2: 0000000001d2a1a8 CR3: 00000001e660e000 CR4: 0000000000000660 [ 313.345527] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 313.352955] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [ 313.360384] Process run_guests (pid: 3370, threadinfo ffff8801ecece000, task ffff8801f4e91080) [ 313.369334] Stack: [ 313.371482] ffff880201454a10 ffffffff81310048 0000000000000001 0000000000000001 [ 313.379181] ffff8801e48c74b0 0000000000000030 ffff880201454be0 ffffffff8138d677 [ 313.386877] 00000000000004b0 0000160000000000 0000000000000000 ffff880201454a40 [ 313.394576] Call Trace: [ 313.397172] <IRQ> [ 313.399411] [<ffffffff81310048>] gnttab_unmap_refs+0x38/0x90 [ 313.405410] [<ffffffff8138d677>] xen_blkbk_unmap+0x1f7/0x220 [ 313.411406] [<ffffffff814b165b>] ? tcp_cleanup_rbuf+0x6b/0x100 [ 313.417579] [<ffffffff814b3bfb>] ? tcp_read_sock+0x1bb/0x220 [ 313.423578] [<ffffffffa030fec0>] ? iscsi_sw_tcp_state_change+0xd0/0xd0 [iscsi_tcp] [ 313.431543] [<ffffffffa03102f3>] ? iscsi_sw_tcp_data_ready+0x73/0xe8 [iscsi_tcp] [ 313.439330] [<ffffffff814b7ea8>] ? __tcp_ack_snd_check+0x68/0x90 [ 313.445686] [<ffffffff81032fed>] ? xen_force_evtchn_callback+0xd/0x10 [ 313.439330] [<ffffffff814b7ea8>] ? __tcp_ack_snd_check+0x68/0x90 [ 313.445686] [<ffffffff81032fed>] ? xen_force_evtchn_callback+0xd/0x10 [ 313.452488] [<ffffffff81033852>] ? check_events+0x12/0x20 [ 313.458216] [<ffffffff8103383f>] ? xen_restore_fl_direct_reloc+0x4/0x4 [ 313.465110] [<ffffffff8113d7f5>] ? kmem_cache_free+0xc5/0x2a0 [ 313.471194] [<ffffffff8138d6e8>] __end_block_io_op+0x48/0x110 [ 313.477283] [<ffffffff8138d7c5>] end_block_io_op+0x15/0x30 [ 313.483099] [<ffffffff81175dc8>] bio_endio+0x18/0x30 [ 313.488381] [<ffffffffa0316239>] dec_pending+0x189/0x290 [dm_mod] [ 313.494824] [<ffffffffa0316569>] clone_endio+0x99/0xd0 [dm_mod] [ 313.501089] [<ffffffff81175dc8>] bio_endio+0x18/0x30 [ 313.506373] [<ffffffff81269cf3>] req_bio_endio+0x83/0xc0 [ 313.512009] [<ffffffff8126b217>] blk_update_request+0xe7/0x450 [ 313.518186] [<ffffffff8131d9d1>] ? xen_virt_to_bus+0x11/0x20 [ 313.524181] [<ffffffff8126b5a2>] blk_update_bidi_request+0x22/0xa0 [ 313.530715] [<ffffffff8126b64a>] blk_end_bidi_request+0x2a/0x80 [ 313.536981] [<ffffffff8126b6db>] blk_end_request+0xb/0x10 [ 313.542712] [<ffffffffa005a96a>] scsi_io_completion+0xaa/0x630 [scsi_mod] [ 313.549870] [<ffffffff815a7c69>] ? _raw_spin_unlock_irqrestore+0x19/0x30 [ 313.556942] [<ffffffffa005290f>] scsi_finish_command+0xcf/0x130 [scsi_mod] [ 313.564193] [<ffffffffa005b03f>] scsi_softirq_done+0x13f/0x160 [scsi_mod] [ 313.571352] [<ffffffff8127168d>] blk_done_softirq+0x7d/0x90 [ 313.577260] [<ffffffff810773a9>] __do_softirq+0xa9/0x160 [ 313.582899] [<ffffffff815afc9c>] call_softirq+0x1c/0x30 [ 313.588446] [<ffffffff81039405>] do_softirq+0x65/0xa0 [ 313.593819] [<ffffffff810771a5>] irq_exit+0xd5/0xf0 [ 313.599010] [<ffffffff8131207f>] xen_evtchn_do_upcall+0x2f/0x40 [ 313.605273] [<ffffffff815afcee>] xen_do_hypervisor_callback+0x1e/0x30 [ 313.612076] <EOI> [ 313.614313] [<ffffffff8111d19e>] ? copy_pte_range+0x36e/0x5f0 [ 313.620401] [<ffffffff8111d6a8>] ? copy_page_range+0x288/0x490 [ 313.626576] [<ffffffff8106e643>] ? dup_mm+0x2d3/0x4a0 [ 313.631946] [<ffffffff8106f710>] ? copy_process+0xf00/0x13e0 [ 313.637944] [<ffffffff8106fe79>] ? do_fork+0x59/0x300 [ 313.643314] [<ffffffff8107e74b>] ? do_sigaction+0x13b/0x1e0 [ 313.649221] [<ffffffff8107f252>] ? __set_task_blocked+0x32/0x80 [ 313.655486] [<ffffffff8107f2f7>] ? set_current_blocked+0x57/0x80 [ 313.661842] [<ffffffff8103fd33>] ? sys_clone+0x23/0x30 [ 313.667302] [<ffffffff815aebc3>] ? stub_clone+0x13/0x20 [ 313.672851] [<ffffffff815ae8b9>] ? system_call_fastpath+0x16/0x1b [ 313.679294] Code: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 55 65 8b 04 25 00 e0 00 00 85 c0 48 89 e5 75 0e 65 c7 04 25 00 e0 00 00 01 00 00 00 c9 c3 <0f> 0b eb fe 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 55 65 48 [ 313.698805] RIP [<ffffffff8105f86e>] paravirt_enter_lazy_mmu+0x1e/0x30 [ 313.705698] RSP <ffff8802014549e0> [ 313.709370] ---[ end trace 6d0134ded298d0e6 ]--- [ 313.714201] Kernel panic - not syncing: Fatal exception in interrupt (XEN) Domain 0 crashed: rebooting machine in 5 seconds. > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > --- > drivers/block/xen-blkback/blkback.c | 2 ++ > drivers/xen/grant-table.c | 8 ++++++++ > 2 files changed, 10 insertions(+), 0 deletions(-) > > diff --git a/drivers/block/xen-blkback/blkback.c > b/drivers/block/xen-blkback/blkback.c > index 0088bf6..0453695 100644 > --- a/drivers/block/xen-blkback/blkback.c > +++ b/drivers/block/xen-blkback/blkback.c > @@ -386,6 +386,7 @@ static int xen_blkbk_map(struct blkif_request *req, > * so that when we access vaddr(pending_req,i) it has the contents of > * the page from the other domain. > */ > + arch_enter_lazy_mmu_mode(); > for (i = 0; i < nseg; i++) { > if (unlikely(map[i].status != 0)) { > pr_debug(DRV_PFX "invalid buffer -- could not remap > it\n"); > @@ -410,6 +411,7 @@ static int xen_blkbk_map(struct blkif_request *req, > seg[i].buf = map[i].dev_bus_addr | > (req->u.rw.seg[i].first_sect << 9); > } > + arch_leave_lazy_mmu_mode(); > return ret; > } > > diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c > index b4d4eac..c7dc2d6 100644 > --- a/drivers/xen/grant-table.c > +++ b/drivers/xen/grant-table.c > @@ -751,6 +751,8 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, > if (xen_feature(XENFEAT_auto_translated_physmap)) > return ret; > > + arch_enter_lazy_mmu_mode(); > + > for (i = 0; i < count; i++) { > /* Do not add to override if the map failed. */ > if (map_ops[i].status) > @@ -769,6 +771,8 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, > return ret; > } > > + arch_leave_lazy_mmu_mode(); > + > return ret; > } > EXPORT_SYMBOL_GPL(gnttab_map_refs); > @@ -785,12 +789,16 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref > *unmap_ops, > if (xen_feature(XENFEAT_auto_translated_physmap)) > return ret; > > + arch_enter_lazy_mmu_mode(); > + > for (i = 0; i < count; i++) { > ret = m2p_remove_override(pages[i], clear_pte); > if (ret) > return ret; > } > > + arch_leave_lazy_mmu_mode(); > + > return ret; > } > EXPORT_SYMBOL_GPL(gnttab_unmap_refs); > -- > 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |