Hello,

On Wed, 18 Apr 2007, Chaskiel M Grundman wrote:

While your change (make osi_Alloc not run under the GLOCK) is completely legitimate, your findings indicate a problem with the linux_alloc implementation. I would suggest the following also be done (not in the link-fix patch):

in the vmalloc branch of LINUX/osi_alloc.c:linux_alloc, the code should assert if (!drop_glock && haveGlock) and drop the glock around the vmalloc call if (drop_glock && haveGlock)

      } else {
+         osi_Assert(drop_glock || !haveGlock);
+         if (drop_glock && haveGlock)
+               AFS_GUNLOCK();
          new = (void *)vmalloc(asize);
+           if (drop_glock && haveGlock)
+               AFS_GLOCK();
          if (new)            /* piggy back alloc type */
              new = (void *)(VM_TYPE | (unsigned long)new);
      }


Note that you can pass GFP_NOFS to vmalloc, if you use the __vmalloc() function instead. This is also an exported symbol in Linux:


(untested)

--- openafs/src/afs/LINUX/osi_alloc.c.orig      2004-12-07 01:12:12.000000000 
-0500
+++ openafs/src/afs/LINUX/osi_alloc.c   2007-04-18 14:38:34.000000000 -0400
@@ -57,7 +57,7 @@
 /* externs : can we do this in a better way. Including vmalloc.h causes other
  * problems.*/
 extern void vfree(void *addr);
-extern void *vmalloc(unsigned long size);
+extern void *__vmalloc(unsigned long size, int gfp_mask, pgprot_t prot);
 #endif

 /* Allocator support functions (static) */
@@ -98,7 +98,9 @@
            if (new)            /* piggy back alloc type */
                new = (void *)(KM_TYPE | (unsigned long)new);
        } else {
-           new = (void *)vmalloc(asize);
+           new = (void *)__vmalloc(asize,
+                                   GFP_KERNEL | __GFP_HIGHMEM | GFP_NOFS,
+                                   PAGE_KERNEL);
            if (new)            /* piggy back alloc type */
                new = (void *)(VM_TYPE | (unsigned long)new);
        }




I don't understand the usage of AFS_GLOCK(); why is it safe to drop and re-acquire it in cases like this? Is AFS_GLOCK intended to serialize all AFS calls coming from vnode methods in the kernel?

Can anyone (briefly) enlighten me?


Thanks,

Chris Wing
[EMAIL PROTECTED]
_______________________________________________
OpenAFS-devel mailing list
[email protected]
https://lists.openafs.org/mailman/listinfo/openafs-devel

Reply via email to