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