lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 677/846] xen/gntdev: fix unmap notification order
    Date
    From: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>

    commit ce2f46f3531a03781181b7f4bd1ff9f8c5086e7e upstream.

    While working with Xen's libxenvchan library I have faced an issue with
    unmap notifications sent in wrong order if both UNMAP_NOTIFY_SEND_EVENT
    and UNMAP_NOTIFY_CLEAR_BYTE were requested: first we send an event channel
    notification and then clear the notification byte which renders in the below
    inconsistency (cli_live is the byte which was requested to be cleared on unmap):

    [ 444.514243] gntdev_put_map UNMAP_NOTIFY_SEND_EVENT map->notify.event 6
    libxenvchan_is_open cli_live 1
    [ 444.515239] __unmap_grant_pages UNMAP_NOTIFY_CLEAR_BYTE at 14

    Thus it is not possible to reliably implement the checks like
    - wait for the notification (UNMAP_NOTIFY_SEND_EVENT)
    - check the variable (UNMAP_NOTIFY_CLEAR_BYTE)
    because it is possible that the variable gets checked before it is cleared
    by the kernel.

    To fix that we need to re-order the notifications, so the variable is first
    gets cleared and then the event channel notification is sent.
    With this fix I can see the correct order of execution:

    [ 54.522611] __unmap_grant_pages UNMAP_NOTIFY_CLEAR_BYTE at 14
    [ 54.537966] gntdev_put_map UNMAP_NOTIFY_SEND_EVENT map->notify.event 6
    libxenvchan_is_open cli_live 0

    Cc: stable@vger.kernel.org
    Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Link: https://lore.kernel.org/r/20211210092817.580718-1-andr2000@gmail.com
    Signed-off-by: Juergen Gross <jgross@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/xen/gntdev.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    --- a/drivers/xen/gntdev.c
    +++ b/drivers/xen/gntdev.c
    @@ -250,13 +250,13 @@ void gntdev_put_map(struct gntdev_priv *
    if (!refcount_dec_and_test(&map->users))
    return;

    + if (map->pages && !use_ptemod)
    + unmap_grant_pages(map, 0, map->count);
    +
    if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
    notify_remote_via_evtchn(map->notify.event);
    evtchn_put(map->notify.event);
    }
    -
    - if (map->pages && !use_ptemod)
    - unmap_grant_pages(map, 0, map->count);
    gntdev_free_map(map);
    }


    \
     
     \ /
      Last update: 2022-01-25 01:11    [W:4.024 / U:0.484 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site