系統 - Debian - 解決error: struct mm_struct has no member named mmap_sem; did you mean mmap_base問題



參考資訊:
https://github.com/FrescoLogic/FL2000/issues/59
https://github.com/FrescoLogic/FL2000/issues/61

問題如下:

make -C /usr/src/linux-headers-6.1.0-39-amd64/ M=/home/steward/FL2000/src modules
make[1]: Entering directory '/usr/src/linux-headers-6.1.0-39-amd64'
  CC [M]  /home/steward/FL2000/src/fl2000_surface.o
/home/steward/FL2000/src/fl2000_surface.c: In function ‘fl2000_surface_pin_down’:
/home/steward/FL2000/src/fl2000_surface.c:115:47: error: ‘struct mm_struct’ has no member named ‘mmap_sem’; did you mean ‘mmap_base’?
  115 |                         up_read(&current->mm->mmap_sem);
      |                                               ^~~~~~~~
      |                                               mmap_base
/home/steward/FL2000/src/fl2000_surface.c:129:41: error: ‘struct mm_struct’ has no member named ‘mmap_sem’; did you mean ‘mmap_base’?
  129 |                 down_read(&current->mm->mmap_sem);
      |                                         ^~~~~~~~
      |                                         mmap_base
/home/steward/FL2000/src/fl2000_surface.c:144:39: error: ‘struct mm_struct’ has no member named ‘mmap_sem’; did you mean ‘mmap_base’?
  144 |                 up_read(&current->mm->mmap_sem);
      |                                       ^~~~~~~~
      |                                       mmap_base
/home/steward/FL2000/src/fl2000_surface.c: In function ‘fl2000_surface_map’:
/home/steward/FL2000/src/fl2000_surface.c:228:42: error: too many arguments to function ‘vm_map_ram’
  228 |                 surface->mapped_buffer = vm_map_ram(
      |                                          ^~~~~~~~~~
In file included from /home/steward/FL2000/src/fl2000_include.h:30,
                 from /home/steward/FL2000/src/fl2000_surface.c:8:
/usr/src/linux-headers-6.1.0-39-common/include/linux/vmalloc.h:129:14: note: declared here
  129 | extern void *vm_map_ram(struct page **pages, unsigned int count, int node);
      |              ^~~~~~~~~~
make[2]: *** [/usr/src/linux-headers-6.1.0-39-common/scripts/Makefile.build:255: /home/steward/FL2000/src/fl2000_surface.o] Error 1
make[1]: *** [/usr/src/linux-headers-6.1.0-39-common/Makefile:2050: /home/steward/FL2000/src] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.1.0-39-amd64'
make: *** [Makefile:41: all] Error 2

解法如下:

@@ -106,13 +106,13 @@ int fl2000_surface_pin_down(
        case SURFACE_TYPE_VIRTUAL_FRAGMENTED_VOLATILE:
        case SURFACE_TYPE_VIRTUAL_FRAGMENTED_PERSISTENT:
                while (surface->pages_pinned != nr_pages) {
-                       down_read(&current->mm->mmap_sem);
+                       down_read(&current->mm->mmap_lock);
                        pages_pinned = fl2000_get_user_pages(
                                surface->user_buffer,
                                nr_pages,
                                pages,
                                NULL);
-                       up_read(&current->mm->mmap_sem);
+                       up_read(&current->mm->mmap_lock);
                        if (pages_pinned <= 0) {
                                dbg_msg(TRACE_LEVEL_ERROR, DBG_PNP,
                                        "get_user_pages fails with %d\n", pages_pinned);
@@ -126,7 +126,7 @@ int fl2000_surface_pin_down(
                break;
 
        case SURFACE_TYPE_VIRTUAL_CONTIGUOUS:
-               down_read(&current->mm->mmap_sem);
+               down_read(&current->mm->mmap_lock);
                /*
                 * work-around the user memory which is mapped from driver,
                 * but with VM_IO, VM_PFNMAP flags. This API assumes the mmaped user addr
@@ -141,7 +141,7 @@ int fl2000_surface_pin_down(
                        pages,
                        NULL);
                vma->vm_flags = old_flags;
-               up_read(&current->mm->mmap_sem);
+               up_read(&current->mm->mmap_lock);
                if (pages_pinned <= 0) {
                        dbg_msg(TRACE_LEVEL_ERROR, DBG_PNP,
                                "get_user_pages fails with %d\n", pages_pinned);
@@ -228,8 +228,8 @@ int fl2000_surface_map(
                surface->mapped_buffer = vm_map_ram(
                        surface->pages,
                        surface->nr_pages,
-                       -1,
-                       PAGE_KERNEL);
+                       -1);//,
+                       //PAGE_KERNEL);
                if (surface->mapped_buffer == NULL) {
                        dbg_msg(TRACE_LEVEL_ERROR, DBG_PNP, "vm_map_ram failed?");
                        ret_val = -ENOMEM;