udmabuf.go RawHistoryFolder

1package main
2
3import (
4	"fmt"
5	"os"
6	"unsafe"
7
8	"golang.org/x/sys/unix"
9)
10
11// udmabuf turns memfd pages into a real dmabuf: a linear buffer any GPU
12// driver imports. fill gets the page-aligned backing store, size bytes long.
13func udmabuf(size int, fill func(data []byte)) (*os.File, error) {
14	dev, err := os.OpenFile("/dev/udmabuf", os.O_RDWR, 0)
15	if err != nil {
16		return nil, fmt.Errorf("udmabuf unavailable: %w", err)
17	}
18	defer dev.Close()
19	size = (size + os.Getpagesize() - 1) / os.Getpagesize() * os.Getpagesize()
20	mem, err := unix.MemfdCreate("testpattern-dmabuf", unix.MFD_ALLOW_SEALING|unix.MFD_CLOEXEC)
21	if err != nil {
22		return nil, err
23	}
24	defer unix.Close(mem)
25	if err := unix.Ftruncate(mem, int64(size)); err != nil {
26		return nil, err
27	}
28	data, err := unix.Mmap(mem, 0, size, unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED)
29	if err != nil {
30		return nil, err
31	}
32	fill(data)
33	if err := unix.Munmap(data); err != nil {
34		return nil, err
35	}
36	if _, err := unix.FcntlInt(uintptr(mem), unix.F_ADD_SEALS, unix.F_SEAL_SHRINK); err != nil {
37		return nil, err
38	}
39	// struct udmabuf_create { u32 memfd; u32 flags; u64 offset; u64 size; }
40	arg := struct {
41		memfd, flags uint32
42		offset, size uint64
43	}{memfd: uint32(mem), flags: 1 /* CLOEXEC */, size: uint64(size)}
44	const udmabufCreate = 0x40187542 // _IOW('u', 0x42, struct udmabuf_create)
45	fd, _, errno := unix.Syscall(unix.SYS_IOCTL, dev.Fd(), udmabufCreate, uintptr(unsafe.Pointer(&arg)))
46	if errno != 0 {
47		return nil, fmt.Errorf("udmabuf create: %w", errno)
48	}
49	return os.NewFile(fd, "dmabuf"), nil
50}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 25

Tags 10

↑↓ moveenter openesc close