mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 11:31:16 +00:00
util: Introduce virHostGetDRMRenderNode helper
This is the first step towards libvirt picking the first available render node instead of QEMU. It also makes sense for us to be able to do that, since we allow specifying the node directly for SPICE, so if there's no render node specified by the user, we should pick the first available one. The algorithm used for that is essentially the same as the one QEMU uses. Signed-off-by: Erik Skultety <eskultet@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
8cb06b7f35
commit
394809694a
@ -3151,6 +3151,7 @@ virGetUserName;
|
|||||||
virGetUserRuntimeDirectory;
|
virGetUserRuntimeDirectory;
|
||||||
virGetUserShell;
|
virGetUserShell;
|
||||||
virHexToBin;
|
virHexToBin;
|
||||||
|
virHostGetDRMRenderNode;
|
||||||
virHostHasIOMMU;
|
virHostHasIOMMU;
|
||||||
virIndexToDiskName;
|
virIndexToDiskName;
|
||||||
virIsDevMapperDevice;
|
virIsDevMapperDevice;
|
||||||
|
@ -2145,3 +2145,56 @@ virHostHasIOMMU(void)
|
|||||||
VIR_DIR_CLOSE(iommuDir);
|
VIR_DIR_CLOSE(iommuDir);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virHostGetDRMRenderNode:
|
||||||
|
*
|
||||||
|
* Picks the first DRM render node available. Missing DRI or missing DRM render
|
||||||
|
* nodes in the system results in an error.
|
||||||
|
*
|
||||||
|
* Returns an absolute path to the first render node available or NULL in case
|
||||||
|
* of an error with the error being reported.
|
||||||
|
* Caller is responsible for freeing the result string.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
virHostGetDRMRenderNode(void)
|
||||||
|
{
|
||||||
|
char *ret = NULL;
|
||||||
|
DIR *driDir = NULL;
|
||||||
|
const char *driPath = "/dev/dri";
|
||||||
|
struct dirent *ent = NULL;
|
||||||
|
int dirErr = 0;
|
||||||
|
bool have_rendernode = false;
|
||||||
|
|
||||||
|
if (virDirOpen(&driDir, driPath) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
while ((dirErr = virDirRead(driDir, &ent, driPath)) > 0) {
|
||||||
|
if (ent->d_type != DT_CHR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (STRPREFIX(ent->d_name, "renderD")) {
|
||||||
|
have_rendernode = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dirErr < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* even if /dev/dri exists, there might be no renderDX nodes available */
|
||||||
|
if (!have_rendernode) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("No DRM render nodes available"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virAsprintf(&ret, "%s/%s", driPath, ent->d_name) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VIR_DIR_CLOSE(driDir);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@ -222,6 +222,8 @@ unsigned long long virMemoryMaxValue(bool ulong) ATTRIBUTE_NOINLINE;
|
|||||||
|
|
||||||
bool virHostHasIOMMU(void);
|
bool virHostHasIOMMU(void);
|
||||||
|
|
||||||
|
char *virHostGetDRMRenderNode(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VIR_ASSIGN_IS_OVERFLOW:
|
* VIR_ASSIGN_IS_OVERFLOW:
|
||||||
* @rvalue: value that is checked (evaluated twice)
|
* @rvalue: value that is checked (evaluated twice)
|
||||||
|
Loading…
Reference in New Issue
Block a user