Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 00:58:42 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm: drm_atomic_uapi.c
        src/sys/external/bsd/drm2/include/linux: file.h sync_file.h

Log Message:
Work out sync file construction API.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/dist/drm/drm_atomic_uapi.c
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/include/linux/file.h \
    src/sys/external/bsd/drm2/include/linux/sync_file.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/drm_atomic_uapi.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_atomic_uapi.c:1.2 src/sys/external/bsd/drm2/dist/drm/drm_atomic_uapi.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/drm_atomic_uapi.c:1.2	Sat Dec 18 23:44:57 2021
+++ src/sys/external/bsd/drm2/dist/drm/drm_atomic_uapi.c	Sun Dec 19 00:58:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_atomic_uapi.c,v 1.2 2021/12/18 23:44:57 riastradh Exp $	*/
+/*	$NetBSD: drm_atomic_uapi.c,v 1.3 2021/12/19 00:58:42 riastradh Exp $	*/
 
 /*
  * Copyright (C) 2014 Red Hat
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_atomic_uapi.c,v 1.2 2021/12/18 23:44:57 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_atomic_uapi.c,v 1.3 2021/12/19 00:58:42 riastradh Exp $");
 
 #include <drm/drm_atomic_uapi.h>
 #include <drm/drm_atomic.h>
@@ -1091,6 +1091,38 @@ struct drm_out_fence_state {
 static int setup_out_fence(struct drm_out_fence_state *fence_state,
 			   struct dma_fence *fence)
 {
+#ifdef __NetBSD__
+	int fd = -1;
+	struct file *fp = NULL;
+	int ret;
+
+	/* Allocate a file descriptor.	*/
+	/* XXX errno NetBSD->Linux */
+	ret = -fd_allocfile(&fp, &fd);
+	if (ret)
+		goto out;
+
+	/* Prepare to transmit it to user.  */
+	/* XXX errno NetBSD->Linux */
+	ret = -copyout(&fence_state->fd, &fd, sizeof fd);
+	if (ret)
+		goto out;
+
+	/* Create sync file.  */
+	fence_state->sync_file = sync_file_create(fence, fp);
+	if (fence_state->sync_file == NULL) {
+		ret = -ENOMEM;
+		goto out;
+	}
+	fp = NULL;		/* sync_file consumes */
+
+out:	if (fp != NULL) {
+		fd_abort(curproc, fp, fd);
+		fd = -1;
+	}
+	fence_state->fd = fd;
+	return ret;
+#else
 	fence_state->fd = get_unused_fd_flags(O_CLOEXEC);
 	if (fence_state->fd < 0)
 		return fence_state->fd;
@@ -1103,6 +1135,7 @@ static int setup_out_fence(struct drm_ou
 		return -ENOMEM;
 
 	return 0;
+#endif
 }
 
 static int prepare_signaling(struct drm_device *dev,
@@ -1264,10 +1297,15 @@ static void complete_signaling(struct dr
 		return;
 
 	for (i = 0; i < num_fences; i++) {
+#ifdef __NetBSD__
+		if (fd_getfile(fence_state[i].fd))
+			(void)fd_close(fence_state[i].fd);
+#else
 		if (fence_state[i].sync_file)
 			fput(fence_state[i].sync_file->file);
 		if (fence_state[i].fd >= 0)
 			put_unused_fd(fence_state[i].fd);
+#endif
 
 		/* If this fails log error to the user */
 		if (fence_state[i].out_fence_ptr &&

Index: src/sys/external/bsd/drm2/include/linux/file.h
diff -u src/sys/external/bsd/drm2/include/linux/file.h:1.2 src/sys/external/bsd/drm2/include/linux/file.h:1.3
--- src/sys/external/bsd/drm2/include/linux/file.h:1.2	Tue Mar 18 18:20:43 2014
+++ src/sys/external/bsd/drm2/include/linux/file.h	Sun Dec 19 00:58:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: file.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $	*/
+/*	$NetBSD: file.h,v 1.3 2021/12/19 00:58:42 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -32,4 +32,15 @@
 #ifndef _LINUX_FILE_H_
 #define _LINUX_FILE_H_
 
+#include <sys/filedesc.h>
+#include <sys/proc.h>
+
+struct file;
+
+static inline void
+fd_install(int fd, struct file *fp)
+{
+	fd_affix(curproc, fp, fd);
+}
+
 #endif  /* _LINUX_FILE_H_ */
Index: src/sys/external/bsd/drm2/include/linux/sync_file.h
diff -u src/sys/external/bsd/drm2/include/linux/sync_file.h:1.2 src/sys/external/bsd/drm2/include/linux/sync_file.h:1.3
--- src/sys/external/bsd/drm2/include/linux/sync_file.h:1.2	Sun Dec 19 00:54:36 2021
+++ src/sys/external/bsd/drm2/include/linux/sync_file.h	Sun Dec 19 00:58:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_file.h,v 1.2 2021/12/19 00:54:36 riastradh Exp $	*/
+/*	$NetBSD: sync_file.h,v 1.3 2021/12/19 00:58:42 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -33,10 +33,15 @@
 #define	_LINUX_SYNC_FILE_H_
 
 struct dma_fence;
+struct file;
 struct sync_file;
 
+struct sync_file {
+	struct file	*file;
+};
+
 struct sync_file *
-	sync_file_create(struct dma_fence *);
+	sync_file_create(struct dma_fence *, struct file *);
 struct dma_fence *
 	sync_file_get_fence(int);
 

Reply via email to