diff mbox series

libxl: cleanup remaining backend xs dirs after driver domain

Message ID 20201108145942.3089012-1-marmarek@invisiblethingslab.com (mailing list archive)
State New, archived
Headers show
Series libxl: cleanup remaining backend xs dirs after driver domain | expand

Commit Message

Marek Marczykowski-Górecki Nov. 8, 2020, 2:59 p.m. UTC
When device is removed, backend domain (which may be a driver domain) is
responsible for removing backend entries from xenstore. But in case of
driver domain, it has no access to remove all of them - specifically the
directory named after frontend-id remains. This may accumulate enough to
exceed xenstore quote of the driver domain, breaking further devices.

Fix this by calling libxl__xs_path_cleanup() on the backend path from
libxl__device_destroy() in the toolstack domain too. Note
libxl__device_destroy() is called when the driver domain already removed
what it can (see device_destroy_be_watch_cb()->device_hotplug_done()).

Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
---
 tools/libs/light/libxl_device.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Marek Marczykowski-Górecki Dec. 9, 2020, 3:01 p.m. UTC | #1
On Sun, Nov 08, 2020 at 03:59:42PM +0100, Marek Marczykowski-Górecki wrote:
> When device is removed, backend domain (which may be a driver domain) is
> responsible for removing backend entries from xenstore. But in case of
> driver domain, it has no access to remove all of them - specifically the
> directory named after frontend-id remains. This may accumulate enough to
> exceed xenstore quote of the driver domain, breaking further devices.
> 
> Fix this by calling libxl__xs_path_cleanup() on the backend path from
> libxl__device_destroy() in the toolstack domain too. Note
> libxl__device_destroy() is called when the driver domain already removed
> what it can (see device_destroy_be_watch_cb()->device_hotplug_done()).
> 
> Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>

Ping?

> ---
>  tools/libs/light/libxl_device.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/tools/libs/light/libxl_device.c b/tools/libs/light/libxl_device.c
> index e081faf9a94e..f131a6c822c6 100644
> --- a/tools/libs/light/libxl_device.c
> +++ b/tools/libs/light/libxl_device.c
> @@ -763,6 +763,12 @@ int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
>               * from the backend path.
>               */
>              libxl__xs_path_cleanup(gc, t, be_path);
> +        } else if (domid == LIBXL_TOOLSTACK_DOMID && !libxl_only) {
> +            /*
> +             * Then, toolstack domain is in charge of removing the parent
> +             * directory if empty already.
> +             */
> +            libxl__xs_path_cleanup(gc, t, be_path);
>          }
>  
>          rc = libxl__xs_transaction_commit(gc, &t);
Wei Liu Jan. 5, 2021, 12:18 p.m. UTC | #2
On Wed, Dec 09, 2020 at 04:01:21PM +0100, Marek Marczykowski-Górecki wrote:
> On Sun, Nov 08, 2020 at 03:59:42PM +0100, Marek Marczykowski-Górecki wrote:
> > When device is removed, backend domain (which may be a driver domain) is
> > responsible for removing backend entries from xenstore. But in case of
> > driver domain, it has no access to remove all of them - specifically the
> > directory named after frontend-id remains. This may accumulate enough to
> > exceed xenstore quote of the driver domain, breaking further devices.
> > 
> > Fix this by calling libxl__xs_path_cleanup() on the backend path from
> > libxl__device_destroy() in the toolstack domain too. Note
> > libxl__device_destroy() is called when the driver domain already removed
> > what it can (see device_destroy_be_watch_cb()->device_hotplug_done()).
> > 
> > Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
> 
> Ping?

Acked-by: Wei Liu <wl@xen.org>
diff mbox series

Patch

diff --git a/tools/libs/light/libxl_device.c b/tools/libs/light/libxl_device.c
index e081faf9a94e..f131a6c822c6 100644
--- a/tools/libs/light/libxl_device.c
+++ b/tools/libs/light/libxl_device.c
@@ -763,6 +763,12 @@  int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
              * from the backend path.
              */
             libxl__xs_path_cleanup(gc, t, be_path);
+        } else if (domid == LIBXL_TOOLSTACK_DOMID && !libxl_only) {
+            /*
+             * Then, toolstack domain is in charge of removing the parent
+             * directory if empty already.
+             */
+            libxl__xs_path_cleanup(gc, t, be_path);
         }
 
         rc = libxl__xs_transaction_commit(gc, &t);