Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754093AbZA0KRz (ORCPT ); Tue, 27 Jan 2009 05:17:55 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752152AbZA0KRq (ORCPT ); Tue, 27 Jan 2009 05:17:46 -0500 Received: from gw.goop.org ([64.81.55.164]:59581 "EHLO mail.goop.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752145AbZA0KRp (ORCPT ); Tue, 27 Jan 2009 05:17:45 -0500 Message-ID: <497EDF43.2030406@goop.org> Date: Tue, 27 Jan 2009 02:17:39 -0800 From: Jeremy Fitzhardinge User-Agent: Thunderbird 2.0.0.19 (X11/20090105) MIME-Version: 1.0 To: Ingo Molnar CC: Zachary Amsden , Nick Piggin , Linux Kernel Mailing List , Linus Torvalds , "hpa@zytor.com" , "jeremy@xensource.com" , "chrisw@sous-sol.org" , "rusty@rustcorp.com.au" , Andrew Morton , Xen-devel Subject: Re: lmbench lat_mmap slowdown with CONFIG_PARAVIRT References: <20090120112634.GA20858@elte.hu> <20090120140324.GA26424@elte.hu> <49763806.5090009@goop.org> <20090120205653.GA19710@elte.hu> <20090121072718.GN24891@wotan.suse.de> <4977A051.8050203@goop.org> <1232663311.16317.176.camel@bodhitayantram.eng.vmware.com> <4978F6C6.3090003@goop.org> <1232664907.16317.182.camel@bodhitayantram.eng.vmware.com> <49790BCC.1040807@goop.org> <20090127075912.GA6551@elte.hu> In-Reply-To: <20090127075912.GA6551@elte.hu> X-Enigmail-Version: 0.95.6 Content-Type: multipart/mixed; boundary="------------090104090504070103040109" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 50732 Lines: 840 This is a multi-part message in MIME format. --------------090104090504070103040109 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Ingo Molnar wrote: > ping? > > This is a very serious paravirt_ops slowdown affecting the native kernel's > performance to the tune of 5-10% in certain workloads. > > It's been about 2 years ago that paravirt_ops went upstream, when you told > us that something like this would never happen, that paravirt_ops is > designed so flexibly that it will never hinder the native kernel - and if > it does it will be easy to fix it. Now is the time to fulfill that > promise. I couldn't exactly reproduce your results, but I guess they're similar in shape. Comparing 2.6.29-rc2-nopv with -pvops, I saw this ratio (pass 1-5). Interestingly I'm seeing identical instruction counts for pvops vs non-pvops, and a lower cycle count. The cache references are way up and the miss rate is up a bit, which I guess is the source of the slowdown. With the attached patch, I get a clear improvement; it replaces the do-nothing pte_val/make_pte functions with inlined movs to move the argument to return, overpatching the 6-byte indirect call (on i386 it would just be all nopped out). CPU cycles and cache misses are way down, and the tick count is down from ~5% worse to ~2%. But the cache reference rate is even higher, which really doesn't make sense to me. But the patch is a clear improvement, and its hard to see how it could make anything worse (its always going to replace an indirect call with simple inlined code). (Full numbers in spreadsheet.) I have a couple of other patches to reduce the register pressure of the pvops calls, but I'm trying to work out how to make sure its not all to complex and/or fragile. J --------------090104090504070103040109 Content-Type: application/vnd.oasis.opendocument.spreadsheet; name="pvops-mmap-measurements.ods" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="pvops-mmap-measurements.ods" UEsDBBQAAAAAAJtROzqFbDmKLgAAAC4AAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQu b2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0UEsDBBQACAAIAJtROzoAAAAAAAAAAAAA AAAbAAAAT2JqZWN0UmVwbGFjZW1lbnRzL09iamVjdCAx7VpdbBRVFD67nf5sW3Zb+RGpxDVA AlEL/YMKiVWgYLW2lraUJ0ltDGmKLdi+SKwBtdWgmBijRRI0JihC+Ik0GNQYMWJi9EEjLyjG B2NMfDAhPigvun7n3ntm7myxuzPdmrgyycw3c+/5zj3nu2fuzE67dUPrA12bIlRDeotQFdlb pIjo62Kix+cRbeOulbcQ9eDk5QjR8zCPoi2V2oezCotWDautVZ5Fkp7C2a04i6oBoqqVN7aK uBy0PoPLQvHjuxgzF6lUit1G6AIu5tK2B+/pundTS2vr9s7mju3rmze3tLH1UZXNm+rYoI5F NJHQwfPWYyXKSQlyu2e3N6U2Vw6XcqWJpt3S+vdOObM8+7IcggjVaii3aUp86fF7Ltil0oZ7 K9O0aW7bmG6vtrGMkvt6Jicntf4v4mK+HqOza0v7/c3+GRhSWfSrYx2ORVQ3h6hwIdFmx8Nq aJpc4CG3i52pHg+nbgW+K1+IvuAfhWV7qCCitIDsmfdvkGExuWVoyRBI7GvHu5L9q3gcE6eT KR4/7fw8TWMMQBut1DTGALS1cU1jDED7vVTTGAPQJos1jTEAbZejaYwBaHdENI1xWlqYG8tb R1+ym/fjoklFcCeOCWrtf/iRx3pH+ocGk529g8PaaFFELxVRl5fybgm1ujxnvEfoWWuRoHFc OGkB0MJXTCvKml41rTHabZZtdh1fxK5q+MAS6AW2hl4wggjmQbY7SiTbWn+2tfmY7S/lkm2d P9u6fMy2o1KyrZdsz5K+zMNsL86XbBv8c9sQINtsnlW8RB4K/qz6qETTGAPQ+Al9yDypA9CO VWoaY8AHKtPkeTzDx4D7FjVI075FtatBWtRxriuyYwVCmd+S/FFmO5NOttnO8C3oP3EfrcLZ OezbIYZDNXX1qxjZlm+lDbC/iv21qOrFolkPRp4tJSzBN9gXz9cSrJ4iwU/Yx1wJVuevBN9V agkaM0jQmJ8S8I0wEVdJ1q/ySdCTdiPwbZC3EnSXaQlqM0hQm58SHMZ+Q4mWoH6KBOUwPulK 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 o/p9u8su7vE0tU00cKUFyBxlSYoiLhmUQtY5+vx4j9/QqXg6QlUJxkkJrG+5NLE23w3X0SxL TZaPOeqVJEC10ETSlmtiGIGOy1UiPk1cquWNCxaqO9i3DZ9MqGzZK5eewzM72LdLRcdQ2bJz T329glB50k1cQcyg7agRf6qYGiG/cnQxpiMYj+OYjPsEVI2zw+GA3detYLZxXa8aR5UM84bb ZBpnSYZXVvbtmavg41FD/01GD3XwVIf6zvHYharg+Tr4ekT7MnxE+/KqfKZEF5x6oX0fALZ2 W2G5+K7puzR9wcuzR48P8VEJw5WHs4c4ow3bugDtrQsycxmeiZgPdvwrreyh70Z+xYp3oMxW SBX+48/d2W1ZyopuaWZSJy5CbEWXy4+AW24otsozin4XiLe0dqhYN9SymHBxxLdXVvEDUEsH CNNwOqppAQAA8gQAAFBLAwQUAAgACACbUTs6AAAAAAAAAAAAAAAAEQAAAE9iamVjdCAzL21l dGEueG1sjZFBb4MwDIXv+xUo6hUcyiaVCKi0w669rOcJBZdmAxslYfDzV2B07bTDjrE/v/fs ZPuxbYJPtM4w5SKOpAiQNFeG6lwcX1/CndgXDxmfTkajqlj3LZIPW/RlcBklp5ZWLnpLiktn nKKyRae8VtwhrSPqllaz0VIZG0MfuTh73ymAYRiiIYnY1hCnaQpzd0UrfeW63jYzVWnABicH B3EUw8pOCf8bamJvIzHz1WjCl9Cz3VbKR1jeIvhe5uZ8W1Gst5pEi2yWrpHQlp5tcbioHX7U kkhujmTG4L7+1ll+R+0hkbJNN8+9aaowTZ52GfzSy+DODf76p+ILUEsHCBOShsX5AAAA5QEA AFBLAwQUAAAAAACbUTs6TVf45BAEAAAQBAAACAAAAG1ldGEueG1sPD94bWwgdmVyc2lvbj0i MS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG9mZmljZTpkb2N1bWVudC1tZXRhIHhtbG5zOm9m ZmljZT0idXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpvZmZpY2U6MS4w IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6ZGM9 Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczptZXRhPSJ1cm46b2Fz aXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOm1ldGE6MS4wIiB4bWxuczpvb289Imh0 dHA6Ly9vcGVub2ZmaWNlLm9yZy8yMDA0L29mZmljZSIgb2ZmaWNlOnZlcnNpb249IjEuMiI+ PG9mZmljZTptZXRhPjxtZXRhOmluaXRpYWwtY3JlYXRvcj5KZXJlbXkgRml0emhhcmRpbmdl PC9tZXRhOmluaXRpYWwtY3JlYXRvcj48bWV0YTpjcmVhdGlvbi1kYXRlPjIwMDktMDEtMjdU MDE6MjQ6NDA8L21ldGE6Y3JlYXRpb24tZGF0ZT48ZGM6ZGF0ZT4yMDA5LTAxLTI3VDAyOjEy OjUzPC9kYzpkYXRlPjxkYzpjcmVhdG9yPkplcmVteSBGaXR6aGFyZGluZ2U8L2RjOmNyZWF0 b3I+PG1ldGE6ZWRpdGluZy1kdXJhdGlvbj5QVDAwSDExTTU5UzwvbWV0YTplZGl0aW5nLWR1 cmF0aW9uPjxtZXRhOmVkaXRpbmctY3ljbGVzPjE8L21ldGE6ZWRpdGluZy1jeWNsZXM+PG1l dGE6ZG9jdW1lbnQtc3RhdGlzdGljIG1ldGE6dGFibGUtY291bnQ9IjMiIG1ldGE6Y2VsbC1j b3VudD0iMzAwIiBtZXRhOm9iamVjdC1jb3VudD0iMyIvPjxtZXRhOmdlbmVyYXRvcj5PcGVu T2ZmaWNlLm9yZy8zLjAkVW5peCBPcGVuT2ZmaWNlLm9yZ19wcm9qZWN0LzMwMG05JEJ1aWxk LTkzNTg8L21ldGE6Z2VuZXJhdG9yPjxtZXRhOnVzZXItZGVmaW5lZCBtZXRhOm5hbWU9Iklu Zm8gMSIvPjxtZXRhOnVzZXItZGVmaW5lZCBtZXRhOm5hbWU9IkluZm8gMiIvPjxtZXRhOnVz ZXItZGVmaW5lZCBtZXRhOm5hbWU9IkluZm8gMyIvPjxtZXRhOnVzZXItZGVmaW5lZCBtZXRh Om5hbWU9IkluZm8gNCIvPjwvb2ZmaWNlOm1ldGE+PC9vZmZpY2U6ZG9jdW1lbnQtbWV0YT5Q SwMEFAAIAAgAm1E7OgAAAAAAAAAAAAAAABgAAABUaHVtYm5haWxzL3RodW1ibmFpbC5wbmd9 2Xk0lO3fAPBKlseSZMmQqXgKITF2JiTDT7KEEZPtyZjsmSwzDUrKki3Z0oy9IjvDIDNkjbEM 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 AADTGQAAUEsDBBQACAAIAJtROzoAAAAAAAAAAAAAAAAnAAAAQ29uZmlndXJhdGlvbnMyL2Fj Y2VsZXJhdG9yL2N1cnJlbnQueG1sAwBQSwcIAAAAAAIAAAAAAAAAUEsDBBQAAAAAAJtROzoA AAAAAAAAAAAAAAAcAAAAQ29uZmlndXJhdGlvbnMyL3Byb2dyZXNzYmFyL1BLAwQUAAAAAACb UTs6AAAAAAAAAAAAAAAAGAAAAENvbmZpZ3VyYXRpb25zMi9mbG9hdGVyL1BLAwQUAAAAAACb UTs6AAAAAAAAAAAAAAAAGgAAAENvbmZpZ3VyYXRpb25zMi9wb3B1cG1lbnUvUEsDBBQAAAAA AJtROzoAAAAAAAAAAAAAAAAYAAAAQ29uZmlndXJhdGlvbnMyL21lbnViYXIvUEsDBBQAAAAA AJtROzoAAAAAAAAAAAAAAAAYAAAAQ29uZmlndXJhdGlvbnMyL3Rvb2xiYXIvUEsDBBQAAAAA AJtROzoAAAAAAAAAAAAAAAAfAAAAQ29uZmlndXJhdGlvbnMyL2ltYWdlcy9CaXRtYXBzL1BL AwQUAAAAAACbUTs6AAAAAAAAAAAAAAAAGgAAAENvbmZpZ3VyYXRpb25zMi9zdGF0dXNiYXIv UEsDBBQACAAIAJtROzoAAAAAAAAAAAAAAAAMAAAAc2V0dGluZ3MueG1s7Vnfc5s4EH6/v8LD u0NMWvfCxHQc93LxXa7NGCfX9k2Gta2J0DKSsOP+9SfAdBwCNsHw0Bs/eYykb5fd1bc/uPr4 HLDOCoSkyAdG7+zc6AD30Kd8MTAepjfd342Pzm9XOJ9TD2wfvSgArroSlNJbZEcf59JOlwdG JLiNRFJpcxKAtJVnYwg8O2bv7rYTYemTZ0b508BYKhXaprler8/WF2coFmbv8vLSTFazrR7y OV1UFZXu3hWFiD8FxQdSZRJh1vn5OzP9b3S2Su6YxjKczA7Z6ztXWwHpT5cqCGLbdLaPY9UG hhZpryisf1rNKDr38swjlXTGYCiATDE0skW1CfUi5cpwzq/M1yBvAr6DuWoH+V/qq2UR9EWv 37s4Gv4W6GJZqLrVs6zLqvjdgIRdyn14Bj8vC9bFXkrO6PgSmyoaw3rs59SUSugQMJx4sfcm TWPQnJ5Toi1ySNGXR9wlgOpViMBRJCSKe5RU6QvwtcjadV35EvpboSMre/El9C0K+gO5IswN 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 UTs603A6qmkBAADyBAAAEwAAAAAAAAAAAAAAAAD+PQAAT2JqZWN0IDIvc3R5bGVzLnhtbFBL AQIUABQACAAIAJtROzoTkobF+QAAAOUBAAARAAAAAAAAAAAAAAAAAKg/AABPYmplY3QgMi9t ZXRhLnhtbFBLAQIUABQACAAIAJtROzohCwlxPQYAAJIiAAAUAAAAAAAAAAAAAAAAAOBAAABP YmplY3QgMy9jb250ZW50LnhtbFBLAQIUABQACAAIAJtROzrTcDqqaQEAAPIEAAATAAAAAAAA AAAAAAAAAF9HAABPYmplY3QgMy9zdHlsZXMueG1sUEsBAhQAFAAIAAgAm1E7OhOShsX5AAAA 5QEAABEAAAAAAAAAAAAAAAAACUkAAE9iamVjdCAzL21ldGEueG1sUEsBAhQAFAAAAAAAm1E7 Ok1X+OQQBAAAEAQAAAgAAAAAAAAAAAAAAAAAQUoAAG1ldGEueG1sUEsBAhQAFAAIAAgAm1E7 OvUeZE5HGQAA0xkAABgAAAAAAAAAAAAAAAAAd04AAFRodW1ibmFpbHMvdGh1bWJuYWlsLnBu Z1BLAQIUABQACAAIAJtROzoAAAAAAgAAAAAAAAAnAAAAAAAAAAAAAAAAAARoAABDb25maWd1 cmF0aW9uczIvYWNjZWxlcmF0b3IvY3VycmVudC54bWxQSwECFAAUAAAAAACbUTs6AAAAAAAA AAAAAAAAHAAAAAAAAAAAAAAAAABbaAAAQ29uZmlndXJhdGlvbnMyL3Byb2dyZXNzYmFyL1BL AQIUABQAAAAAAJtROzoAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAJVoAABDb25maWd1cmF0 aW9uczIvZmxvYXRlci9QSwECFAAUAAAAAACbUTs6AAAAAAAAAAAAAAAAGgAAAAAAAAAAAAAA AADLaAAAQ29uZmlndXJhdGlvbnMyL3BvcHVwbWVudS9QSwECFAAUAAAAAACbUTs6AAAAAAAA AAAAAAAAGAAAAAAAAAAAAAAAAAADaQAAQ29uZmlndXJhdGlvbnMyL21lbnViYXIvUEsBAhQA FAAAAAAAm1E7OgAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAOWkAAENvbmZpZ3VyYXRpb25z Mi90b29sYmFyL1BLAQIUABQAAAAAAJtROzoAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAG9p AABDb25maWd1cmF0aW9uczIvaW1hZ2VzL0JpdG1hcHMvUEsBAhQAFAAAAAAAm1E7OgAAAAAA AAAAAAAAABoAAAAAAAAAAAAAAAAArGkAAENvbmZpZ3VyYXRpb25zMi9zdGF0dXNiYXIvUEsB AhQAFAAIAAgAm1E7OqsfH6H1AwAAch8AAAwAAAAAAAAAAAAAAAAA5GkAAHNldHRpbmdzLnht bFBLAQIUABQACAAIAJtROzp9v98X1wEAAIwOAAAVAAAAAAAAAAAAAAAAABNuAABNRVRBLUlO Ri9tYW5pZmVzdC54bWxQSwUGAAAAABsAGwAPBwAALXAAAAAA --------------090104090504070103040109 Content-Type: text/plain; name="paravirt-ident.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="paravirt-ident.patch" Subject: x86/pvops: add a paravirt_indent functions to allow special patching Several paravirt ops implementations simply return their arguments, the most obvious being the make_pte/pte_val class of operations on native. On 32-bit, the identity function is literally a no-op, as the calling convention uses the same registers for the first argument and return. On 64-bit, it can be implemented with a single "mov". This patch adds special identity functions for 32 and 64 bit argument, and machinery to recognize them and replace them with either nops or a mov as appropriate. At the moment, the only users for the identity functions are the pagetable entry conversion functions. The result is a measureable improvement on pagetable-heavy benchmarks (2-3%, reducing the pvops overhead from 5 to 2%). Signed-off-by: Jeremy Fitzhardinge --- arch/x86/include/asm/paravirt.h | 5 ++ arch/x86/kernel/paravirt.c | 75 ++++++++++++++++++++++++++++++----- arch/x86/kernel/paravirt_patch_32.c | 12 +++++ arch/x86/kernel/paravirt_patch_64.c | 15 +++++++ 4 files changed, 98 insertions(+), 9 deletions(-) =================================================================== --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h @@ -390,6 +390,8 @@ asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":") unsigned paravirt_patch_nop(void); +unsigned paravirt_patch_ident_32(void *insnbuf, unsigned len); +unsigned paravirt_patch_ident_64(void *insnbuf, unsigned len); unsigned paravirt_patch_ignore(unsigned len); unsigned paravirt_patch_call(void *insnbuf, const void *target, u16 tgt_clobbers, @@ -1378,6 +1380,9 @@ } void _paravirt_nop(void); +u32 _paravirt_ident_32(u32); +u64 _paravirt_ident_64(u64); + #define paravirt_nop ((void *)_paravirt_nop) void paravirt_use_bytelocks(void); =================================================================== --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c @@ -44,6 +44,17 @@ { } +/* identity function, which can be inlined */ +u32 _paravirt_ident_32(u32 x) +{ + return x; +} + +u64 _paravirt_ident_64(u64 x) +{ + return x; +} + static void __init default_banner(void) { printk(KERN_INFO "Booting paravirtualized kernel on %s\n", @@ -138,9 +149,16 @@ if (opfunc == NULL) /* If there's no function, patch it with a ud2a (BUG) */ ret = paravirt_patch_insns(insnbuf, len, ud2a, ud2a+sizeof(ud2a)); - else if (opfunc == paravirt_nop) + else if (opfunc == _paravirt_nop) /* If the operation is a nop, then nop the callsite */ ret = paravirt_patch_nop(); + + /* identity functions just return their single argument */ + else if (opfunc == _paravirt_ident_32) + ret = paravirt_patch_ident_32(insnbuf, len); + else if (opfunc == _paravirt_ident_64) + ret = paravirt_patch_ident_64(insnbuf, len); + else if (type == PARAVIRT_PATCH(pv_cpu_ops.iret) || type == PARAVIRT_PATCH(pv_cpu_ops.irq_enable_sysexit) || type == PARAVIRT_PATCH(pv_cpu_ops.usergs_sysret32) || @@ -373,6 +391,45 @@ #endif }; +typedef pte_t make_pte_t(pteval_t); +typedef pmd_t make_pmd_t(pmdval_t); +typedef pud_t make_pud_t(pudval_t); +typedef pgd_t make_pgd_t(pgdval_t); + +typedef pteval_t pte_val_t(pte_t); +typedef pmdval_t pmd_val_t(pmd_t); +typedef pudval_t pud_val_t(pud_t); +typedef pgdval_t pgd_val_t(pgd_t); + + +#if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) +/* 32-bit pagetable entries */ +#define paravirt_native_make_pte (make_pte_t *)_paravirt_ident_32 +#define paravirt_native_pte_val (pte_val_t *)_paravirt_ident_32 + +#define paravirt_native_make_pmd (make_pmd_t *)_paravirt_ident_32 +#define paravirt_native_pmd_val (pmd_val_t *)_paravirt_ident_32 + +#define paravirt_native_make_pud (make_pud_t *)_paravirt_ident_32 +#define paravirt_native_pud_val (pud_val_t *)_paravirt_ident_32 + +#define paravirt_native_make_pgd (make_pgd_t *)_paravirt_ident_32 +#define paravirt_native_pgd_val (pgd_val_t *)_paravirt_ident_32 +#else +/* 64-bit pagetable entries */ +#define paravirt_native_make_pte (make_pte_t *)_paravirt_ident_64 +#define paravirt_native_pte_val (pte_val_t *)_paravirt_ident_64 + +#define paravirt_native_make_pmd (make_pmd_t *)_paravirt_ident_64 +#define paravirt_native_pmd_val (pmd_val_t *)_paravirt_ident_64 + +#define paravirt_native_make_pud (make_pud_t *)_paravirt_ident_64 +#define paravirt_native_pud_val (pud_val_t *)_paravirt_ident_64 + +#define paravirt_native_make_pgd (make_pgd_t *)_paravirt_ident_64 +#define paravirt_native_pgd_val (pgd_val_t *)_paravirt_ident_64 +#endif + struct pv_mmu_ops pv_mmu_ops = { #ifndef CONFIG_X86_64 .pagetable_setup_start = native_pagetable_setup_start, @@ -424,21 +481,21 @@ .pmd_clear = native_pmd_clear, #endif .set_pud = native_set_pud, - .pmd_val = native_pmd_val, - .make_pmd = native_make_pmd, + .pmd_val = paravirt_native_pmd_val, + .make_pmd = paravirt_native_make_pmd, #if PAGETABLE_LEVELS == 4 - .pud_val = native_pud_val, - .make_pud = native_make_pud, + .pud_val = paravirt_native_pud_val, + .make_pud = paravirt_native_make_pud, .set_pgd = native_set_pgd, #endif #endif /* PAGETABLE_LEVELS >= 3 */ - .pte_val = native_pte_val, - .pgd_val = native_pgd_val, + .pte_val = paravirt_native_pte_val, + .pgd_val = paravirt_native_pgd_val, - .make_pte = native_make_pte, - .make_pgd = native_make_pgd, + .make_pte = paravirt_native_make_pte, + .make_pgd = paravirt_native_make_pgd, .dup_mmap = paravirt_nop, .exit_mmap = paravirt_nop, =================================================================== --- a/arch/x86/kernel/paravirt_patch_32.c +++ b/arch/x86/kernel/paravirt_patch_32.c @@ -12,6 +12,18 @@ DEF_NATIVE(pv_cpu_ops, clts, "clts"); DEF_NATIVE(pv_cpu_ops, read_tsc, "rdtsc"); +unsigned paravirt_patch_ident_32(void *insnbuf, unsigned len) +{ + /* arg in %eax, return in %eax */ + return 0; +} + +unsigned paravirt_patch_ident_64(void *insnbuf, unsigned len) +{ + /* arg in %edx:%eax, return in %edx:%eax */ + return 0; +} + unsigned native_patch(u8 type, u16 clobbers, void *ibuf, unsigned long addr, unsigned len) { =================================================================== --- a/arch/x86/kernel/paravirt_patch_64.c +++ b/arch/x86/kernel/paravirt_patch_64.c @@ -19,6 +19,21 @@ DEF_NATIVE(pv_cpu_ops, usergs_sysret32, "swapgs; sysretl"); DEF_NATIVE(pv_cpu_ops, swapgs, "swapgs"); +DEF_NATIVE(, mov32, "mov %edi, %eax"); +DEF_NATIVE(, mov64, "mov %rdi, %rax"); + +unsigned paravirt_patch_ident_32(void *insnbuf, unsigned len) +{ + return paravirt_patch_insns(insnbuf, len, + start__mov32, end__mov32); +} + +unsigned paravirt_patch_ident_64(void *insnbuf, unsigned len) +{ + return paravirt_patch_insns(insnbuf, len, + start__mov64, end__mov64); +} + unsigned native_patch(u8 type, u16 clobbers, void *ibuf, unsigned long addr, unsigned len) { --------------090104090504070103040109-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/