[Mesa-dev] [PATCH 2/2] pipe-loader: Add support for render nodes v2
David Herrmann
dh.herrmann at gmail.com
Tue Jan 28 06:04:00 PST 2014
Hi Tom
On Mon, Jan 27, 2014 at 5:13 PM, Tom Stellard <tom at stellard.net> wrote:
> From: Tom Stellard <thomas.stellard at amd.com>
>
> v2:
> - Add missing call to pipe_loader_drm_release()
> - Fix render node macros
> - Drop render-node configure option
Patch looks fine to me, but I lack mesa-insights to really comment on
it. But I'd like to get a feedback whether there's still any open
issues with render-nodes. If not, I will fix the minor-allocation-race
and then try to make rnodes the default in 3.15.
Thanks
David
> ---
>
> For reference, version 1 of this patch:
> http://lists.freedesktop.org/archives/mesa-dev/2013-October/047296.html
>
> .../auxiliary/pipe-loader/pipe_loader_drm.c | 80 +++++++++++++++++++++-
> 1 file changed, 77 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
> index 9484db8..7a1af91 100644
> --- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
> +++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
> @@ -49,6 +49,11 @@
> #include "util/u_dl.h"
> #include "util/u_debug.h"
>
> +#define DRM_RENDER_NODE_DEV_NAME_FORMAT "%s/renderD%d"
> +#define DRM_RENDER_NODE_MAX_NODES 63
> +#define DRM_RENDER_NODE_MIN_MINOR 128
> +#define DRM_RENDER_NODE_MAX_MINOR (DRM_RENDER_NODE_MIN_MINOR + DRM_RENDER_NODE_MAX_NODES)
> +
> struct pipe_loader_drm_device {
> struct pipe_loader_device base;
> struct util_dl_library *lib;
> @@ -152,18 +157,87 @@ open_drm_minor(int minor)
> return open(path, O_RDWR, 0);
> }
>
> +static int
> +open_drm_render_node_minor(int minor)
> +{
> + char path[PATH_MAX];
> + snprintf(path, sizeof(path), DRM_RENDER_NODE_DEV_NAME_FORMAT, DRM_DIR_NAME,
> + minor);
> + return open(path, O_RDWR, 0);
> +}
> +
> int
> pipe_loader_drm_probe(struct pipe_loader_device **devs, int ndev)
> {
> - int i, j, fd;
> + int i, k, fd, num_render_node_devs;
> + int j = 0;
> +
> + struct {
> + unsigned vendor_id;
> + unsigned chip_id;
> + } render_node_devs[DRM_RENDER_NODE_MAX_NODES];
> +
> + /* Look for render nodes first */
> + for (i = DRM_RENDER_NODE_MIN_MINOR, j = 0;
> + i <= DRM_RENDER_NODE_MAX_MINOR; i++) {
> + fd = open_drm_render_node_minor(i);
> + struct pipe_loader_device *dev;
> + if (fd < 0)
> + continue;
>
> - for (i = 0, j = 0; i < DRM_MAX_MINOR; i++) {
> + if (!pipe_loader_drm_probe_fd(&dev, fd, false)) {
> + close(fd);
> + continue;
> + }
> +
> + render_node_devs[j].vendor_id = dev->u.pci.vendor_id;
> + render_node_devs[j].chip_id = dev->u.pci.chip_id;
> +
> + if (j < ndev) {
> + devs[j] = dev;
> + } else {
> + close(fd);
> + dev->ops->release(&dev);
> + }
> + j++;
> + }
> +
> + num_render_node_devs = j;
> +
> + /* Next look for drm devices. */
> + for (i = 0; i < DRM_MAX_MINOR; i++) {
> + struct pipe_loader_device *dev;
> + boolean duplicate = FALSE;
> fd = open_drm_minor(i);
> if (fd < 0)
> continue;
>
> - if (j >= ndev || !pipe_loader_drm_probe_fd(&devs[j], fd, true))
> + if (!pipe_loader_drm_probe_fd(&dev, fd, true)) {
> close(fd);
> + continue;
> + }
> +
> + /* Check to make sure we aren't already accessing this device via
> + * render nodes.
> + */
> + for (k = 0; k < num_render_node_devs; k++) {
> + if (dev->u.pci.vendor_id == render_node_devs[k].vendor_id &&
> + dev->u.pci.chip_id == render_node_devs[k].chip_id) {
> + close(fd);
> + dev->ops->release(&dev);
> + duplicate = TRUE;
> + break;
> + }
> + }
> +
> + if (duplicate)
> + continue;
> +
> + if (j < ndev) {
> + devs[j] = dev;
> + } else {
> + dev->ops->release(&dev);
> + }
>
> j++;
> }
> --
> 1.8.1.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list