[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v8 2/8] xen: mapcache: Unmap first entries in buckets
 
 
On Mon, Jul 1, 2024 at 2:55 PM Anthony PERARD <anthony.perard@xxxxxxxxxx> wrote:
  Hi all, 
 
Following this commit, a test which install Debian in a guest with OVMF 
as firmware started to fail. QEMU exit with an error when GRUB is 
running on the freshly installed Debian (I don't know if GRUB is 
starting Linux or not). 
The error is: 
    Bad ram offset ffffffffffffffff 
 
Some logs: 
http://logs.test-lab.xenproject.org/osstest/logs/186611/test-amd64-amd64-xl-qemuu-ovmf-amd64/info.html 
 
Any idea? Something is trying to do something with the address "-1" when 
it shouldn't? 
  
 
 Hi Anothny, 
 
 Yes, it looks like something is calling qemu_get_ram_block() on something that isn't mapped. One possible path is in qemu_ram_block_from_host() but there may be others. 
 
 The following patch may help. Any chance you could try to get a backtrace from QEMU when it failed? 
 
 diff --git a/system/physmem.c b/system/physmem.c index 33d09f7571..2669c4dbbb 100644 --- a/system/physmem.c +++ b/system/physmem.c @@ -2277,6 +2277,9 @@ RAMBlock *qemu_ram_block_from_host(void *ptr, bool round_offset,          ram_addr_t ram_addr;          RCU_READ_LOCK_GUARD();          ram_addr = xen_ram_addr_from_mapcache(ptr); +        if (ram_addr == RAM_ADDR_INVALID) { +            return NULL; +        }          block = qemu_get_ram_block(ram_addr);          if (block) {              *offset = ram_addr - block->offset;
  
 
 
 
 
 
   
Cheers, 
 
Anthony 
 
On Wed, May 29, 2024 at 04:07:33PM +0200, Edgar E. Iglesias wrote: 
> From: "Edgar E. Iglesias" <edgar.iglesias@xxxxxxx> 
>  
> When invalidating memory ranges, if we happen to hit the first 
> entry in a bucket we were never unmapping it. This was harmless 
> for foreign mappings but now that we're looking to reuse the 
> mapcache for transient grant mappings, we must unmap entries 
> when invalidated. 
>  
> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xxxxxxx> 
> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> 
> --- 
>  hw/xen/xen-mapcache.c | 11 ++++++++--- 
>  1 file changed, 8 insertions(+), 3 deletions(-) 
>  
> diff --git a/hw/xen/xen-mapcache.c b/hw/xen/xen-mapcache.c 
> index bc860f4373..ec95445696 100644 
> --- a/hw/xen/xen-mapcache.c 
> +++ b/hw/xen/xen-mapcache.c 
> @@ -491,18 +491,23 @@ static void xen_invalidate_map_cache_entry_unlocked(MapCache *mc, 
>          return; 
>      } 
>      entry->lock--; 
> -    if (entry->lock > 0 || pentry == NULL) { 
> +    if (entry->lock > 0) { 
>          return; 
>      } 
>   
> -    pentry->next = entry->next; 
>      ram_block_notify_remove(entry->vaddr_base, entry->size, entry->size); 
>      if (munmap(entry->vaddr_base, entry->size) != 0) { 
>          perror("unmap fails"); 
>          exit(-1); 
>      } 
> + 
>      g_free(entry->valid_mapping); 
> -    g_free(entry); 
> +    if (pentry) { 
> +        pentry->next = entry->next; 
> +        g_free(entry); 
> +    } else { 
> +        memset(entry, 0, sizeof *entry); 
> +    } 
>  } 
>   
>  typedef struct XenMapCacheData { 
> --  
> 2.40.1 
>  
>  
--  
 
Anthony Perard | Vates XCP-ng Developer 
 
XCP-ng & Xen Orchestra - Vates solutions 
 
web: https://vates.tech 
  
 
    
     |