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

Re: [PATCH v2 08/18] IOMMU/x86: support freeing of pagetables


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Fri, 10 Dec 2021 14:51:37 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=j6OTVpimcPuYbvwbTgXb89vt8uWITNd/FZzxmO3+HuM=; b=mIPbAmJUEi1h2Q02d9xeRJ4d3VAK3BXpaGmwi8q1NdUfV86cL/NcaGEN+Sermy45j/d/qKe9MAjO1tT4tVxCkVAGCCrLQ62AnGiVcSQ+3ikdhvV+6QUC9XOOb7RX0diG7t0KkErfK96+zRvSba/4crV9xX89x4TowVrWz+oNAK6nKi+B6NK+qOtEYdlmGB0oItYqRE/8PrHpUJwFCrEm4JFe2pkJ44N9tkIOaD7vydafKIVNYT/NtW94MTrVhtVCLA7Vj3JIMlMTspmXhW2kyMyBBcNMsU8pCQ2F18wwFbLMfSxWt8kqj52XcdL/C/6U+cofUcbXewoLmzVNfZwOgQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eiUqKv63CdQneT4EWs4cBIRSDZrU7K/VlAPeuBbN5TJOCUDQjzUX39pShZqX8c20V18Pp0qY3AN5t4MxUn9tdxfxlOftxH7Q3sz0KgeuPRgzz18JUBwjCFEocMmQoccPP1xr5gopuIXOWKGsD4oCXa8p0Arz80I3l/4YadiV0m57vz+JPUyr5MTegq20K8YEibpkpfgAHljDGvbsIWFLRhV2LQkqDkoSMAqrNdQE+x6lQTwlAlTaZ/+OzGwNAsMtp3nwrYyfzoog1ennOIch+IeDuS49xqBPNkcIrTQQ+URyD0sS/dNj9f9Os4zk/kO9tdUYyVxG78kwAbGZGb8MdA==
  • Authentication-results: esa6.hc3370-68.iphmx.com; dkim=pass (signature verified) header.i=@citrix.onmicrosoft.com
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Paul Durrant <paul@xxxxxxx>, Wei Liu <wl@xxxxxxx>
  • Delivery-date: Fri, 10 Dec 2021 13:51:59 +0000
  • Ironport-data: A9a23:Y8Ou8Kix6C8iufOgCjduOxolX161ghcKZh0ujC45NGQN5FlHY01je htvD2uBOqyLZDTwLoxzYIW2/E9UsMfRy9BgT1No+C81RSkb9cadCdqndUqhZCn6wu8v7a5EA 2fyTvGacajYm1eF/k/F3oAMKRCQ7InQLlbGILes1htZGEk0GE/NtTo5w7Rg29Qx2YDga++wk YiaT/P3aQfNNwFcagr424rbwP+4lK2v0N+wlgVWicFj5DcypVFMZH4sDfjZw0/DaptVBoaHq 9Prl9lVyI97EyAFUbtJmp6jGqEDryW70QKm0hK6UID66vROS7BbPg/W+5PwZG8O4whlkeydx /1d76OoWVYAIpeQ290Tb0VGLipBI6pZreqvzXiX6aR/zmXDenrohf5vEFs3LcsT/eMf7WNmr KJCbmpXN1ba2rzwkOnTpupE36zPKOHxO4wSoDd4xCzxBvc6W5HTBa7N4Le02R9t154eR62HO qL1bxIoQz3jSDdpZWs6S746rtq5iGfnLy9X/Qf9Sa0fvDGIkV0ZPKLWGMLcZ9iiVchT2EGCq Qru4GDREhwcctuFxlKt8Hihm+vOliPTQ58JGfuz8fsCqE2ewCkfBQMbUXO/oOKlkQiuVtRHM UsW9yEy668o+ySWosLVBkPi5iTe51hFBoQWQ7ZSBByxJrT881ymHnhVZyJ7NJ8fuvNqWwEh6 UGOgIa8bdBwi4G9RXWY/7aSiDq9PykJMGMPDRM5oRs5D8rL+99q0E+WJjp3OOvs14CuR2msq 9yfhHVm390uYdg3O7JXFLwtqxalvdD3QwE8/W07tUr1v1oiNOZJi2FFgGU3DMqszq7FHjFtX 1BewqByCdzi67nXzERhp81XQ9mUCw6tamG0vLKWN8BJG86R03CiZ5tMxzp1OV1kNM0JERewP hSC4VwMuMELbSfyBUOSX25XI55ypUQHPY66Ps04k/IUOsQhHON51H8GibGsM5DFzxF3zPBX1 WazesewF3cKYZmLPxLtL9rxJYQDn3hkrUuKHMiT503+jdK2OS7EIZ9YYQDmRr1os8u5TPD9r o832z2ikE4EDoUTo0D/rOYuELz9BSRhWM2t9ZUILrXrz8gPMDhJNsI9CIgJIuRNt69Uiv3J7 je6XEpZw0D4nnrJNUOBbXULVV8ldcoXQasTMXN+MFC29WIkZIrzvq4Te4FuJess9fB5zO4yR P4AIp3SDvNKQzXB2jIccZii89AyKEX13VqDb3i/fTwyX598XAiVqNXqSRTiqXsVBS2tuMpg/ 7D5jlHHQYAOThhJBdrNbK791Eu4uHUQwbogX0bBLtRJVl/r9Yxmd374gvMtepleIhTf3DqKk Q2RBE5A9+XKpoY09vjPhLyF8Nj1Q7cvQBICEjCCv7isNCTc8m6y+qN6Ub6FLWLHSWf52KS+f uEJnfvyB+IKwQRRuI1mHrc1ka9nv4nzp6VXxxhPFWnQawj5EatpJ3SL0JUdtqBJwbMF6wK6V ljWp4tfMLSNfsjkDEQQNEwuaeHajaMYnTzb7PIUJkTm5XAooOrbABsKZxTc2jZAKLZVMZ8+x bZzscEb3AWzlx42P4vUlStT7WmNciQNXqhPWkv222M3Zt7HEm1/XKE=
  • Ironport-hdrordr: A9a23:jQdVpaPl8/j+TsBcTyX155DYdb4zR+YMi2TDiHofdfUFSKClfp 6V8cjztSWUtN4QMEtQ/uxoHJPwO080lKQFmrX5WI3NYOCIghrLEGgP1/qG/9SkIVyCygc/79 YfT0EdMqyIMbESt6+Ti2PZYrVQseVvsprY/ds2p00dMj2CAJsQiTuRZDzrdnGfE2J9dOYE/d enl4F6jgvlXU5SQtWwB3EDUeSGj9rXlKj+aRpDIxI88gGBgR6h9ba/SnGjr1ojegIK5Y1n3X nOkgT/6Knmm/anyiXE32uWy5hNgtPuxvZKGcTJoMkILTfHjBquee1aKve/lQFwhNvqxEchkd HKrRtlF8Nv60nJdmXwmhfp0xmI6kdZ11bSjXujxVfzq83wQzw3T+Bbg5hCTxff4008+Plhza NixQuixtRqJCKFuB64y8nDVhlsmEbxi2Eli/Qvg3tWVpZbQKNNrLYY4FheHP47bW3HAbgcYa lT5fznlbVrmQvwVQGagoAv+q3hYp0LJGbGfqBY0fbllgS/nxhCvjwlLYIk7zM9HakGOup5Dt L/Q9BVfYF1P78rhJ1GdZU8qOuMeyXwqEH3QSqvyWqOLtBzB5uKke+x3IkI
  • Ironport-sdr: EiiN3/yZYCkNpnUb9YP2yIhPkSfB7LZqdHBO7nhG2YZcU+XF84ryPkivltC50a855ZPggLAHgh WdGdNR5FvuAMxsFz1AnzSGqg0X1vTNOmXcfWWwOWDcasxL7Q3dttCFB26DeyjDc75Jrc/TFluN PGzZXNU+2vRWZtvptDsvH8oqZrqgS8jesRAd+nyDWVKVUvchpc/INpOFl6Mx1mW54BP92LThtm nn132mruXOEqt80n/vrY59SvodH3eKvHP6nWojpLdsZekSgPq0yfd6ktOe2rlBBY4cOO5XtJGk FkLSFgBI7y/gbp/KJUihZ542
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Fri, Sep 24, 2021 at 11:48:21AM +0200, Jan Beulich wrote:
> For vendor specific code to support superpages we need to be able to
> deal with a superpage mapping replacing an intermediate page table (or
> hierarchy thereof). Consequently an iommu_alloc_pgtable() counterpart is
> needed to free individual page tables while a domain is still alive.
> Since the freeing needs to be deferred until after a suitable IOTLB
> flush was performed, released page tables get queued for processing by a
> tasklet.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> I was considering whether to use a softirq-taklet instead. This would
> have the benefit of avoiding extra scheduling operations, but come with
> the risk of the freeing happening prematurely because of a
> process_pending_softirqs() somewhere.

The main one that comes to mind would be the debug keys and it's usage
of process_pending_softirqs that could interfere with iommu unmaps, so
I guess if only for that reason it's best to run in idle vcpu context.

> --- a/xen/drivers/passthrough/x86/iommu.c
> +++ b/xen/drivers/passthrough/x86/iommu.c
> @@ -12,6 +12,7 @@
>   * this program; If not, see <http://www.gnu.org/licenses/>.
>   */
>  
> +#include <xen/cpu.h>
>  #include <xen/sched.h>
>  #include <xen/iommu.h>
>  #include <xen/paging.h>
> @@ -463,6 +464,85 @@ struct page_info *iommu_alloc_pgtable(st
>      return pg;
>  }
>  
> +/*
> + * Intermediate page tables which get replaced by large pages may only be
> + * freed after a suitable IOTLB flush. Hence such pages get queued on a
> + * per-CPU list, with a per-CPU tasklet processing the list on the assumption
> + * that the necessary IOTLB flush will have occurred by the time tasklets get
> + * to run. (List and tasklet being per-CPU has the benefit of accesses not
> + * requiring any locking.)
> + */
> +static DEFINE_PER_CPU(struct page_list_head, free_pgt_list);
> +static DEFINE_PER_CPU(struct tasklet, free_pgt_tasklet);
> +
> +static void free_queued_pgtables(void *arg)
> +{
> +    struct page_list_head *list = arg;
> +    struct page_info *pg;
> +
> +    while ( (pg = page_list_remove_head(list)) )
> +        free_domheap_page(pg);

Should you add a preempt check here to yield and schedule the tasklet
again, in order to be able to process any pending work?

Maybe just calling process_pending_softirqs would be enough?

Thanks, Roger.



 


Rackspace

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