> From: Sathyanarayanan Kuppuswamy > Sent: Tuesday, June 20, 2023 11:31 AM > > ... > > -static bool tdx_enc_status_changed(unsigned long vaddr, int numpages, > bool enc) > > +static bool tdx_map_gpa(phys_addr_t start, phys_addr_t end, bool enc) > > { > > - phys_addr_t start = __pa(vaddr); > > - phys_addr_t end = __pa(vaddr + numpages * PAGE_SIZE); > > + const int max_retries_per_page = 3; > > Add some details about why you chose 3? Maybe you can also use macro for it. It's a small number recommended by Kirill: https://lwn.net/ml/linux-kernel/20221208194800.n27ak4xj6pmyny46@xxxxxxxxxxxxxxxxx/ The spec doesn't define a max retry count. Normally I guess a max retry count of 2 should be enough, at least for Hyper-V according to my testing. Maybe we can add a comment like this: /* Retrying the hypercall a second time should succeed; use 3 just in case. */ Does this look good to all? > > + struct tdx_hypercall_args args; > > + u64 map_fail_paddr, ret; > > + int retry_count = 0; > > > > if (!enc) { > > /* Set the shared (decrypted) bits: */ > > @@ -718,12 +720,49 @@ static bool tdx_enc_status_changed(unsigned long > vaddr, int numpages, bool enc) > > end |= cc_mkdec(0); > > } > > > > - /* > > - * Notify the VMM about page mapping conversion. More info about ABI > > - * can be found in TDX Guest-Host-Communication Interface (GHCI), > > - * section "TDG.VP.VMCALL<MapGPA>" > > - */ > > - if (_tdx_hypercall(TDVMCALL_MAP_GPA, start, end - start, 0, 0)) > > + while (retry_count < max_retries_per_page) { > > + memset(&args, 0, sizeof(args)); > > + args.r10 = TDX_HYPERCALL_STANDARD; > > + args.r11 = TDVMCALL_MAP_GPA; > > + args.r12 = start; > > + args.r13 = end - start; > > + > > + ret = __tdx_hypercall_ret(&args); > > + if (ret != TDVMCALL_STATUS_RETRY) > > + return !ret; > > + /* > > + * The guest must retry the operation for the pages in the > > + * region starting at the GPA specified in R11. R11 comes > > + * from the untrusted VMM. Sanity check it. > > + */ > > + map_fail_paddr = args.r11; > > Do you really need map_fail_paddr? Why not directly use args.r11? > > > + if (map_fail_paddr < start || map_fail_paddr >= end) > > + return false; Originally, I used r11. Dave says " 'r11' needs a real, logical name": https://lwn.net/ml/linux-kernel/6bb65614-d420-49d3-312f-316dc8ca4cc4@xxxxxxxxx/