hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/drivers/media/v4l2-core/videobuf-dma-sg.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * helper functions for SG DMA video4linux capture buffers
34 *
....@@ -12,10 +13,6 @@
1213 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
1314 * (c) 2006 Mauro Carvalho Chehab, <mchehab@kernel.org>
1415 * (c) 2006 Ted Walther and John Sokol
15
- *
16
- * This program is free software; you can redistribute it and/or modify
17
- * it under the terms of the GNU General Public License as published by
18
- * the Free Software Foundation; either version 2
1916 */
2017
2118 #include <linux/init.h>
....@@ -24,13 +21,13 @@
2421 #include <linux/sched/mm.h>
2522 #include <linux/slab.h>
2623 #include <linux/interrupt.h>
24
+#include <linux/pgtable.h>
2725
2826 #include <linux/dma-mapping.h>
2927 #include <linux/vmalloc.h>
3028 #include <linux/pagemap.h>
3129 #include <linux/scatterlist.h>
3230 #include <asm/page.h>
33
-#include <asm/pgtable.h>
3431
3532 #include <media/videobuf-dma-sg.h>
3633
....@@ -183,15 +180,15 @@
183180 if (rw == READ)
184181 flags |= FOLL_WRITE;
185182
186
- dprintk(1, "init user [0x%lx+0x%lx => %d pages]\n",
183
+ dprintk(1, "init user [0x%lx+0x%lx => %lu pages]\n",
187184 data, size, dma->nr_pages);
188185
189
- err = get_user_pages_longterm(data & PAGE_MASK, dma->nr_pages,
190
- flags, dma->pages, NULL);
186
+ err = pin_user_pages(data & PAGE_MASK, dma->nr_pages,
187
+ flags | FOLL_LONGTERM, dma->pages, NULL);
191188
192189 if (err != dma->nr_pages) {
193190 dma->nr_pages = (err >= 0) ? err : 0;
194
- dprintk(1, "get_user_pages_longterm: err=%d [%d]\n", err,
191
+ dprintk(1, "pin_user_pages: err=%d [%lu]\n", err,
195192 dma->nr_pages);
196193 return err < 0 ? err : -EINVAL;
197194 }
....@@ -203,19 +200,19 @@
203200 {
204201 int ret;
205202
206
- down_read(&current->mm->mmap_sem);
203
+ mmap_read_lock(current->mm);
207204 ret = videobuf_dma_init_user_locked(dma, direction, data, size);
208
- up_read(&current->mm->mmap_sem);
205
+ mmap_read_unlock(current->mm);
209206
210207 return ret;
211208 }
212209
213210 static int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction,
214
- int nr_pages)
211
+ unsigned long nr_pages)
215212 {
216213 int i;
217214
218
- dprintk(1, "init kernel [%d pages]\n", nr_pages);
215
+ dprintk(1, "init kernel [%lu pages]\n", nr_pages);
219216
220217 dma->direction = direction;
221218 dma->vaddr_pages = kcalloc(nr_pages, sizeof(*dma->vaddr_pages),
....@@ -241,11 +238,11 @@
241238 dma->vaddr = vmap(dma->vaddr_pages, nr_pages, VM_MAP | VM_IOREMAP,
242239 PAGE_KERNEL);
243240 if (NULL == dma->vaddr) {
244
- dprintk(1, "vmalloc_32(%d pages) failed\n", nr_pages);
241
+ dprintk(1, "vmalloc_32(%lu pages) failed\n", nr_pages);
245242 goto out_free_pages;
246243 }
247244
248
- dprintk(1, "vmalloc is at addr %p, size=%d\n",
245
+ dprintk(1, "vmalloc is at addr %p, size=%lu\n",
249246 dma->vaddr, nr_pages << PAGE_SHIFT);
250247
251248 memset(dma->vaddr, 0, nr_pages << PAGE_SHIFT);
....@@ -270,9 +267,9 @@
270267 }
271268
272269 static int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction,
273
- dma_addr_t addr, int nr_pages)
270
+ dma_addr_t addr, unsigned long nr_pages)
274271 {
275
- dprintk(1, "init overlay [%d pages @ bus 0x%lx]\n",
272
+ dprintk(1, "init overlay [%lu pages @ bus 0x%lx]\n",
276273 nr_pages, (unsigned long)addr);
277274 dma->direction = direction;
278275
....@@ -352,11 +349,8 @@
352349 BUG_ON(dma->sglen);
353350
354351 if (dma->pages) {
355
- for (i = 0; i < dma->nr_pages; i++) {
356
- if (dma->direction == DMA_FROM_DEVICE)
357
- set_page_dirty_lock(dma->pages[i]);
358
- put_page(dma->pages[i]);
359
- }
352
+ unpin_user_pages_dirty_lock(dma->pages, dma->nr_pages,
353
+ dma->direction == DMA_FROM_DEVICE);
360354 kfree(dma->pages);
361355 dma->pages = NULL;
362356 }
....@@ -506,9 +500,11 @@
506500 struct videobuf_buffer *vb,
507501 struct v4l2_framebuffer *fbuf)
508502 {
509
- int err, pages;
510
- dma_addr_t bus;
511503 struct videobuf_dma_sg_memory *mem = vb->priv;
504
+ unsigned long pages;
505
+ dma_addr_t bus;
506
+ int err;
507
+
512508 BUG_ON(!mem);
513509
514510 MAGIC_CHECK(mem->magic, MAGIC_SG_MEM);
....@@ -539,7 +535,7 @@
539535 } else {
540536 /* NOTE: HACK: videobuf_iolock on V4L2_MEMORY_MMAP
541537 buffers can only be called from videobuf_qbuf
542
- we take current->mm->mmap_sem there, to prevent
538
+ we take current->mm->mmap_lock there, to prevent
543539 locking inversion, so don't take it here */
544540
545541 err = videobuf_dma_init_user_locked(&mem->dma,