Guest

Alexey Feldgendler

By: a guest on Sep 21st, 2008  |  syntax: None  |  size: 9.33 KB  |  hits: 143  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1.                 diff -urN vmware-server-kernel.orig/vmmon-only/autoconf/fault.c vmware-server-kernel/vmmon-only/autoconf/fault.c
  2. --- vmware-server-kernel.orig/vmmon-only/autoconf/fault.c       1970-01-01 01:00:00.000000000 +0100
  3. +++ vmware-server-kernel/vmmon-only/autoconf/fault.c    2008-09-21 16:56:04.000000000 +0200
  4.  -0,0 +1,18 @@
  5. +/*
  6. + * we'll try to use fault instead of nopage since 2.6.26
  7. + */
  8. +#include <linux/autoconf.h>
  9. +#include <linux/version.h>
  10. +
  11. +#include <linux/mm.h>
  12. +
  13. +int LinuxDriverFault(struct vm_area_struct *vma,
  14. +                                        struct vm_fault *vmf) {
  15. +       (void)vma;
  16. +       (void)vmf;
  17. +       return VM_FAULT_MAJOR;
  18. +}
  19. +
  20. +struct vm_operations_struct vmuser_mops = {
  21. +        .fault = LinuxDriverFault
  22. +};
  23. diff -ur vmware-server-kernel.orig/vmmon-only/linux/driver.c vmware-server-kernel/vmmon-only/linux/driver.c
  24. --- vmware-server-kernel.orig/vmmon-only/linux/driver.c 2008-09-21 16:46:30.000000000 +0200
  25. +++ vmware-server-kernel/vmmon-only/linux/driver.c      2008-09-21 17:17:54.000000000 +0200
  26.  -122,7 +122,12 @@
  27.  
  28.  static int LinuxDriver_Close(struct inode *inode, struct file *filp);
  29.  static unsigned int LinuxDriverPoll(struct file *file, poll_table *wait);
  30. -#if defined(VMW_NOPAGE_261)
  31. +#if defined(VMW_FAULT)
  32. +int LinuxDriverFault(struct vm_area_struct *vma,
  33. +                                        struct vm_fault *vmf);
  34. +int LinuxDriverLockedFault(struct vm_area_struct *vma,
  35. +                           struct vm_fault *vmf);
  36. +#elif defined(VMW_NOPAGE_261)
  37.  static struct page *LinuxDriverNoPage(struct vm_area_struct *vma,
  38.                             unsigned long address, int *type);
  39.  static struct page *LinuxDriverLockedNoPage(struct vm_area_struct *vma,
  40.  -143,11 +148,19 @@
  41.  static void LinuxDriverPollTimeout(unsigned long clientData);
  42.  
  43.  static struct vm_operations_struct vmuser_mops = {
  44. +#if defined(VMW_FAULT)
  45. +       .fault = LinuxDriverFault
  46. +#else
  47.         .nopage = LinuxDriverNoPage
  48. +#endif
  49.  };
  50.  
  51.  struct vm_operations_struct vmuser_locked_mops = {
  52. +#if defined(VMW_FAULT)
  53. +       .fault = LinuxDriverLockedFault
  54. +#else
  55.         .nopage = LinuxDriverLockedNoPage
  56. +#endif
  57.  };
  58.  
  59.  static struct file_operations vmuser_fops;
  60.  -987,7 +1000,10 @@
  61.   *-----------------------------------------------------------------------------
  62.   */
  63.  
  64. -#ifdef VMW_NOPAGE_261
  65. +#if defined(VMW_FAULT)
  66. +int LinuxDriverFault(struct vm_area_struct *vma, //IN
  67. +                                        struct vm_fault *vmf)       //INOUT
  68. +#elif defined(VMW_NOPAGE_261)
  69.  static struct page *LinuxDriverNoPage(struct vm_area_struct *vma, //IN
  70.                                       unsigned long address,      //IN
  71.                                       int *type)                  //OUT: Fault type
  72.  -1004,12 +1020,19 @@
  73.         VMLinux *vmLinux = (VMLinux *) vma->vm_file->private_data;
  74.         unsigned long pg;
  75.        
  76. -       pg = (address - vma->vm_start) >> PAGE_SHIFT;
  77. +       pg = ((unsigned long)vmf->virtual_address - vma->vm_start) >> PAGE_SHIFT; // use vmf->pgoff?
  78.         if (pg >= vmLinux->size4Gb) {
  79. +#ifdef VMW_FAULT
  80. +               return VM_FAULT_SIGBUS;
  81. +#else
  82.                 return 0;
  83. +#endif        
  84.         }
  85.         get_page(virt_to_page(vmLinux->pages4Gb[pg]));
  86. -#ifdef KERNEL_2_4_0
  87. +#if defined(VMW_FAULT)
  88. +       vmf->page = virt_to_page(vmLinux->pages4Gb[pg]);
  89. +       return VM_FAULT_MAJOR;
  90. +#elif defined(KERNEL_2_4_0)
  91.  #ifdef VMW_NOPAGE_261
  92.          *type = VM_FAULT_MINOR;
  93.  #endif
  94.  -1037,7 +1060,10 @@
  95.   *-----------------------------------------------------------------------------
  96.   */
  97.  
  98. -#ifdef VMW_NOPAGE_261
  99. +#if defined(VMW_FAULT)
  100. +int LinuxDriverLockedFault(struct vm_area_struct *vma, //IN
  101. +                                                  struct vm_fault *vmf) //INOUT
  102. +#elif defined(VMW_NOPAGE_261)
  103.  static struct page *LinuxDriverLockedNoPage(struct vm_area_struct *vma, //IN
  104.                                             unsigned long address,      //IN
  105.                                             int *type)                  //OUT: Fault type
  106.  -1057,33 +1083,56 @@
  107.     struct VMHostEntry* vmhe;
  108.     struct page* result;
  109.        
  110. -   pg = ((address - vma->vm_start) >> PAGE_SHIFT) + compat_vm_pgoff(vma);
  111. +   pg = (((unsigned long)vmf->virtual_address - vma->vm_start) >> PAGE_SHIFT) + compat_vm_pgoff(vma); // use vmf->pgoff?
  112.     if (pg >= vmLinux->sizeLocked) {
  113.        printk(KERN_DEBUG "vmmon: Something went wrong: entry %08lX out of range (>=%08X) for mapping on filp %p\n", pg, vmLinux->sizeLocked, vmLinux);
  114. +#ifdef VMW_FAULT
  115. +      return VM_FAULT_SIGBUS;
  116. +#else
  117.        return NOPAGE_SIGBUS;
  118. +#endif
  119.     }
  120.     if (!vmLinux->vm || !vmLinux->vm->vmhost) {
  121.        printk(KERN_DEBUG "vmmon: Something went wrong: no vm or vmhost for mapping on filp %p\n", vmLinux);
  122. +#ifdef VMW_FAULT
  123. +      return VM_FAULT_SIGBUS;
  124. +#else
  125.        return NOPAGE_SIGBUS;
  126. +#endif
  127.     }
  128.     pgt = vmLinux->pagesLocked->ent[pg / VMHOST_MAPPING_PT];
  129.     if (!pgt) {
  130.        printk(KERN_DEBUG "vmmon: Something went wrong: missing entry %08lX from mapping on filp %p\n", pg, vmLinux);
  131. +#ifdef VMW_FAULT
  132. +      return VM_FAULT_SIGBUS;
  133. +#else
  134.        return NOPAGE_SIGBUS;
  135. +#endif
  136.     }
  137.     vmhe = kmap(pgt);
  138.     result = vmhe->ent[pg % VMHOST_MAPPING_PT];
  139.     kunmap(pgt);
  140.     if (!result) {
  141.        printk(KERN_DEBUG "vmmon: Something went wrong: attempt to access non-existing entry %08lX in mapping on filp %p\n", pg, vmLinux);
  142. +#ifdef VMW_FAULT
  143. +      return VM_FAULT_SIGBUS;
  144. +#else
  145.        return NOPAGE_SIGBUS;
  146. +#endif
  147.     }
  148.     if (!PhysTrack_Test(vmLinux->vm->vmhost->AWEPages, page_to_pfn(result))) {
  149.        printk(KERN_DEBUG "vmmon: MPN %08lX not tracked! Someone released it before removing it from VA first!\n", pg);
  150. +#ifdef VMW_FAULT
  151. +      return VM_FAULT_SIGBUS;
  152. +#else
  153.        return NOPAGE_SIGBUS;
  154. +#endif
  155.     }
  156.     get_page(result);
  157. -#ifdef KERNEL_2_4_0
  158. +#if defined(VMW_FAULT)
  159. +   vmf->page = result;
  160. +   return VM_FAULT_MAJOR;
  161. +#elif defined(KERNEL_2_4_0)
  162.  #ifdef VMW_NOPAGE_261
  163.     *type = VM_FAULT_MINOR;
  164.  #endif
  165. diff -ur vmware-server-kernel.orig/vmmon-only/Makefile.kernel vmware-server-kernel/vmmon-only/Makefile.kernel
  166. --- vmware-server-kernel.orig/vmmon-only/Makefile.kernel        2008-09-21 16:46:30.000000000 +0200
  167. +++ vmware-server-kernel/vmmon-only/Makefile.kernel     2008-09-21 16:55:08.000000000 +0200
  168.  -13,6 +13,7 @@
  169.  
  170.  EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE)
  171.  
  172. +EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/fault.c,   -DVMW_FAULT, )
  173.  EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/nopage1.c, -DVMW_NOPAGE_261, )
  174.  EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/skas1.c,   -DVMW_SKAS_MMAP, )
  175.  EXTRA_CFLAGS += $(call vm_check_build, $(SRCROOT)/autoconf/epoll.c,   -DVMW_HAVE_EPOLL, )
  176. diff -ur vmware-server-kernel.orig/vmmon-only/Makefile.normal vmware-server-kernel/vmmon-only/Makefile.normal
  177. --- vmware-server-kernel.orig/vmmon-only/Makefile.normal        2008-09-21 16:46:30.000000000 +0200
  178. +++ vmware-server-kernel/vmmon-only/Makefile.normal     2008-09-21 16:55:07.000000000 +0200
  179.  -60,6 +60,7 @@
  180.  INCLUDE += $(shell $(CC) $(INCLUDE) -E $(SRCROOT)/autoconf/geninclude.c \
  181.            | sed -n -e 's!^APATH!-I$(HEADER_DIR)/asm!p')
  182.  
  183. +CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/fault.c,   -DVMW_FAULT, )
  184.  CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/nopage1.c, -DVMW_NOPAGE_261, )
  185.  CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/skas1.c,   -DVMW_SKAS_MMAP, )
  186.  CC_OPTS += $(call vm_check_build, $(SRCROOT)/autoconf/epoll.c,   -DVMW_HAVE_EPOLL, )
  187. diff -ur vmware-server-kernel.orig/vmnet-only/bridge.c vmware-server-kernel/vmnet-only/bridge.c
  188. --- vmware-server-kernel.orig/vmnet-only/bridge.c       2008-09-21 16:46:29.000000000 +0200
  189. +++ vmware-server-kernel/vmnet-only/bridge.c    2008-09-21 17:31:47.000000000 +0200
  190.  -274,7 +274,7 @@
  191.                          struct net_device *net)  // IN: Network device
  192.  {
  193.  #ifdef VMW_NETDEV_HAS_NET
  194. -   if (net->nd_net != bridge->internalDev->nd_net) {
  195. +   if (dev_net(net) != dev_net(bridge->internalDev)) {
  196.        return 0;
  197.     }
  198.  #endif
  199. diff -ur vmware-server-kernel.orig/vmnet-only/procfs.c vmware-server-kernel/vmnet-only/procfs.c
  200. --- vmware-server-kernel.orig/vmnet-only/procfs.c       2008-09-21 16:46:29.000000000 +0200
  201. +++ vmware-server-kernel/vmnet-only/procfs.c    2008-09-21 17:35:53.000000000 +0200
  202.  -63,7 +63,7 @@
  203.  {
  204.     int retval;
  205.  
  206. -   retval = VNetProc_MakeEntry(&proc_root, "vmnet", S_IFDIR, &base);
  207. +   retval = VNetProc_MakeEntry(NULL, "vmnet", S_IFDIR, &base);
  208.     if (retval) {
  209.        return retval;
  210.     }
  211.  -95,7 +95,7 @@
  212.  void
  213.  VNetProc_Cleanup(void)
  214.  {
  215. -   VNetProc_RemoveEntry(base, &proc_root);
  216. +   VNetProc_RemoveEntry(base, NULL);
  217.     base = NULL;
  218.  }
  219.  
  220. diff -ur vmware-server-kernel.orig/vmnet-only/vmnetInt.h vmware-server-kernel/vmnet-only/vmnetInt.h
  221. --- vmware-server-kernel.orig/vmnet-only/vmnetInt.h     2008-09-21 16:46:29.000000000 +0200
  222. +++ vmware-server-kernel/vmnet-only/vmnetInt.h  2008-09-21 17:30:33.000000000 +0200
  223.  -63,7 +63,7 @@
  224.  #   define dev_lock_list()    read_lock(&dev_base_lock)
  225.  #   define dev_unlock_list()  read_unlock(&dev_base_lock)
  226.  #   ifdef VMW_NETDEV_HAS_NET
  227. -#      define DEV_GET(x)      __dev_get_by_name((x)->internalDev->nd_net, (x)->name)
  228. +#      define DEV_GET(x)      __dev_get_by_name(dev_net((x)->internalDev), (x)->name)
  229.  #   else
  230.  #      define DEV_GET(x)      __dev_get_by_name((x)->name)
  231.  #   endif
  232.  -89,7 +89,7 @@
  233.  
  234.  #ifdef VMW_NETDEV_HAS_NET
  235.  extern struct proto vmnet_proto;
  236. -#   define compat_sk_alloc(_bri, _pri) sk_alloc((_bri)->internalDev->nd_net, \
  237. +#   define compat_sk_alloc(_bri, _pri) sk_alloc(dev_net((_bri)->internalDev), \
  238.                                                  PF_NETLINK, _pri, &vmnet_proto)
  239.  #elif defined(VMW_HAVE_SK_ALLOC_WITH_PROTO)
  240.  extern struct proto vmnet_proto;