]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Internal branch sync. Included in this change:
authorVMware, Inc <>
Tue, 17 Nov 2009 22:14:22 +0000 (14:14 -0800)
committerMarcelo Vanzin <mvanzin@vmware.com>
Tue, 17 Nov 2009 22:14:22 +0000 (14:14 -0800)
. Add a module parameter to vmxnet3_shm to adjust the size of the shared
  memory pool.

. Changes in shared code that don't affect open-vm-tools functionality.

Signed-off-by: Marcelo Vanzin <mvanzin@vmware.com>
open-vm-tools/lib/include/memaligned.h
open-vm-tools/lib/include/vix.h
open-vm-tools/lib/include/x86cpuid.h
open-vm-tools/modules/linux/vmxnet3/vmxnet3_drv.c
open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.c
open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.h
open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm_shared.h
open-vm-tools/modules/linux/vmxnet3/vmxnet3_version.h
open-vm-tools/vmware-user/stringxx/string.cc
open-vm-tools/vmware-user/stringxx/string.hh

index 93b68fbf19de057c873bb5efbba24fd7b68b667a..6a0d3446652000129d4365e065e1dc4d4c12ac97 100644 (file)
@@ -98,7 +98,7 @@ AlignedMallocImpl(size_t size) // IN
       return NULL;
    }
 
-   buf = malloc(paddedSize);
+   buf = (void **)malloc(paddedSize);
    if (!buf) {
       return NULL;
    }
index af927ebb9e004e1bab72182d70d32724b0110928..065f7c829a5c004197676fcdd4f173056218b350 100644 (file)
@@ -420,6 +420,8 @@ enum {
    VIX_PROPERTY_VM_VMTEAM_PATHNAME                    = 105, 
    VIX_PROPERTY_VM_MEMORY_SIZE                        = 106,
    VIX_PROPERTY_VM_READ_ONLY                          = 107,
+   VIX_PROPERTY_VM_NAME                               = 108,
+   VIX_PROPERTY_VM_GUESTOS                            = 109,
    VIX_PROPERTY_VM_IN_VMTEAM                          = 128,
    VIX_PROPERTY_VM_POWER_STATE                        = 129,
    VIX_PROPERTY_VM_TOOLS_STATE                        = 152,
index a509fb6ed7981148fd6c7f4b14638c57adec969b..e3d4f4b64859be3a4996e4bfdb16d7a536bef7f0 100644 (file)
@@ -375,7 +375,8 @@ FIELDDEF(  5, EDX, INTEL,  16,  4, MWAIT_C4_SUBSTATE,   NA,  FALSE)
 FLAGDEF(   6, EAX, INTEL,   0,  1, THERMAL_SENSOR,      NA,  FALSE)     \
 FLAGDEF(   6, EAX, INTEL,   1,  1, TURBO_MODE,          NA,  FALSE)     \
 FIELDDEF(  6, EBX, INTEL,   0,  4, NUM_INTR_THRESHOLDS, NA,  FALSE)     \
-FLAGDEF(   6, ECX, INTEL,   0,  1, HW_COORD_FEEDBACK,   NA,  FALSE)
+FLAGDEF(   6, ECX, INTEL,   0,  1, HW_COORD_FEEDBACK,   NA,  FALSE)    \
+FLAGDEF(   6, ECX, INTEL,   3,  1, ENERGY_PERF_BIAS,    NA,  FALSE)
 
 /*    LEVEL, REG, VENDOR, POS, SIZE, NAME,       MON SUPP, CPL3, [FUNC] */
 #define CPUID_FIELD_DATA_LEVEL_A                                               \
@@ -494,7 +495,15 @@ FLAGDEFA( 8A, EDX, AMD,     0,  1, SVM_NP,              NO,  FALSE, NPT)       \
 FLAGDEF(  8A, EDX, AMD,     1,  1, SVM_LBR,             NO,  FALSE)            \
 FLAGDEF(  8A, EDX, AMD,     2,  1, SVM_LOCK,            NO,  FALSE)            \
 FLAGDEF(  8A, EDX, AMD,     3,  1, SVM_NRIP,            NO,  FALSE)            \
-FIELDDEF( 8A, EDX, AMD,     4, 28, SVMEDX_RSVD,         NO,  FALSE)
+FLAGDEF(  8A, EDX, AMD,    10,  1, SVM_PAUSE_FILTER,    NO,  FALSE)
+
+
+
+#define CPUID_FIELD_DATA_LEVEL_8A_BD                                           \
+FIELDDEF( 8A, EDX, AMD,     4,  6, SVMEDX_RSVD0,        NO,  FALSE)            \
+FIELDDEF( 8A, EDX, AMD,    11, 21, SVMEDX_RSVD1,        NO,  FALSE)
+
+
 
 
 #define CPUID_FIELD_DATA                                              \
@@ -507,7 +516,8 @@ FIELDDEF( 8A, EDX, AMD,     4, 28, SVMEDX_RSVD,         NO,  FALSE)
    CPUID_FIELD_DATA_LEVEL_B                                           \
    CPUID_FIELD_DATA_LEVEL_80                                          \
    CPUID_FIELD_DATA_LEVEL_81                                          \
-   CPUID_FIELD_DATA_LEVEL_8x
+   CPUID_FIELD_DATA_LEVEL_8x                                          \
+   CPUID_FIELD_DATA_LEVEL_8A_BD
 
 
 /*
index 0267f8a312444085961f45a45a8a511e21ab5aa8..fec0db40eff3c5ee5f609fd5a0229a535a74c7d1 100644 (file)
@@ -51,6 +51,7 @@ static int enable_shm[VMXNET3_SHM_MAX_DEVICES + 1] =
 { [0 ... VMXNET3_SHM_MAX_DEVICES] = -1 };
 static char *shm_disclaimer = NULL;
 static int correct_shm_disclaimer;
+static int shm_pool_size = SHM_DEFAULT_DATA_SIZE;
 #define VMXNET3_SHM_DISCLAIMER "IReallyWantThisModeIAmAVMwarePartner"
 
 /*
@@ -2317,7 +2318,7 @@ vmxnet3_open(struct net_device *netdev)
        if (adapter->is_shm) {
                printk(KERN_INFO "bringing up shared memory vmxnet3 %s\n",
                       netdev->name);
-               err = vmxnet3_shm_open(adapter, netdev->name);
+               err = vmxnet3_shm_open(adapter, netdev->name, shm_pool_size);
                if (err) {
                        goto shm_err;
                }
@@ -3055,3 +3056,5 @@ module_param_array(enable_shm, int, &num_enable_shm, 0);
 MODULE_PARM_DESC(enable_shm, "Shared memory enable");
 module_param(shm_disclaimer, charp, 0);
 MODULE_PARM_DESC(shm_disclaimer, "Shared memory disclaimer");
+module_param(shm_pool_size, int, 0);
+MODULE_PARM_DESC(shm_pool_size, "Shared memory pool size");
index 468b790484c075d7d3b7dd5f5af96b2f8d3273a4..465b2f022d923a8bb63df60c65781dd9c706fb31 100644 (file)
@@ -332,7 +332,7 @@ vmxnet3_shm_init_allocator(struct vmxnet3_shm_pool *shm)
 
                BUG_ON(i == SHM_INVALID_IDX);
        }
-       BUG_ON(shm->allocator.count > SHM_DATA_SIZE);
+       BUG_ON(shm->allocator.count > shm->data.num_pages);
 }
 
 
@@ -402,16 +402,19 @@ vmxnet3_shm_pool_reset(struct vmxnet3_shm_pool *shm)
 
 struct vmxnet3_shm_pool *
 vmxnet3_shm_pool_create(struct vmxnet3_adapter *adapter,
-               char *name)
+               char *name, int pool_size)
 {
        int i;
        unsigned long flags;
        struct vmxnet3_shm_pool *shm;
        struct vmxnet3_shm_ctl *ctl_ptr;
        struct page *ctl_page;
+       int shm_size = sizeof(*shm) +
+               pool_size * sizeof(uint16) +
+               pool_size * sizeof(struct vmxnet3_shm_mapped_page);
 
        /* Allocate shm_pool kobject */
-       shm = kmalloc(sizeof(*shm), GFP_KERNEL);
+       shm = vmalloc(shm_size);
        if (shm == NULL)
                goto fail_shm;
 
@@ -424,7 +427,7 @@ vmxnet3_shm_pool_create(struct vmxnet3_adapter *adapter,
        shm->adapter = adapter;
 
        /* Allocate data pages */
-       shm->data.num_pages = SHM_DATA_SIZE;
+       shm->data.num_pages = pool_size;
        for (i = 1; i < shm->data.num_pages; i++) {
                struct page *page = alloc_page(GFP_KERNEL);
                if (page == NULL)
@@ -525,12 +528,12 @@ vmxnet3_shm_pool_release(struct kobject *kobj)
        }
 
        /* Free data pages */
-       for (i = 1; i < SHM_DATA_SIZE; i++)
+       for (i = 1; i < shm->data.num_pages; i++)
                __free_page(VMXNET3_SHM_IDX2PAGE(shm, i));
 
-       kfree(shm);
-
        printk(KERN_INFO "destroyed vmxnet shared memory pool %s\n", shm->name);
+
+       vfree(shm);
 }
 
 
@@ -594,7 +597,7 @@ vmxnet3_shm_free_page(struct vmxnet3_shm_pool *shm,
        unsigned long flags;
 
        spin_lock_irqsave(&shm->alloc_lock, flags);
-       BUG_ON(shm->allocator.count >= SHM_DATA_SIZE);
+       BUG_ON(shm->allocator.count >= shm->data.num_pages);
        shm->allocator.stack[shm->allocator.count++] = idx;
        spin_unlock_irqrestore(&shm->alloc_lock, flags);
 }
@@ -654,7 +657,7 @@ vmxnet3_shm_chardev_fault(struct vm_area_struct *vma,
        unsigned long idx = vmxnet3_shm_addr2idx(vma, address);
        struct page *pageptr;
 
-       if (idx >= SHM_DATA_START && idx < SHM_DATA_START + SHM_DATA_SIZE)
+       if (idx >= SHM_DATA_START && idx < SHM_DATA_START + shm->data.num_pages)
                pageptr = VMXNET3_SHM_IDX2PAGE(shm, idx - SHM_DATA_START);
        else if (idx >= SHM_CTL_START && idx < SHM_CTL_START + SHM_CTL_SIZE)
                pageptr = shm->ctl.pages[idx - SHM_CTL_START];
@@ -697,7 +700,7 @@ vmxnet3_shm_chardev_nopage(struct vm_area_struct *vma,
        unsigned long idx = vmxnet3_shm_addr2idx(vma, address);
        struct page *pageptr;
 
-       if (idx >= SHM_DATA_START && idx < SHM_DATA_START + SHM_DATA_SIZE)
+       if (idx >= SHM_DATA_START && idx < SHM_DATA_START + shm->data.num_pages)
                pageptr = VMXNET3_SHM_IDX2PAGE(shm, idx - SHM_DATA_START);
        else if (idx >= SHM_CTL_START && idx < SHM_CTL_START + SHM_CTL_SIZE)
                pageptr = shm->ctl.pages[idx - SHM_CTL_START];
@@ -741,7 +744,7 @@ vmxnet3_shm_chardev_nopage(struct vm_area_struct *vma,
        unsigned long idx = vmxnet3_shm_addr2idx(vma, address);
        struct page *pageptr;
 
-       if (idx >= SHM_DATA_START && idx < SHM_DATA_START + SHM_DATA_SIZE)
+       if (idx >= SHM_DATA_START && idx < SHM_DATA_START + shm->data.num_pages)
                pageptr = VMXNET3_SHM_IDX2PAGE(shm, idx - SHM_DATA_START);
        else if (idx >= SHM_CTL_START && idx < SHM_CTL_START + SHM_CTL_SIZE)
                pageptr = shm->ctl.pages[idx - SHM_CTL_START];
@@ -906,7 +909,7 @@ vmxnet3_shm_chardev_ioctl(struct file *filp,
                        return idx1;
 
                case SHM_IOCTL_FREE_ONE:
-                       if (arg != SHM_INVALID_IDX && arg < SHM_DATA_SIZE)
+                       if (arg != SHM_INVALID_IDX && arg < shm->data.num_pages)
                                vmxnet3_shm_free_page(shm, arg);
 
                        return 0;
@@ -1470,9 +1473,15 @@ vmxnet3_shm_user_rx(struct vmxnet3_shm_pool *shm,
 
 int
 vmxnet3_shm_open(struct vmxnet3_adapter *adapter,
-               char *name)
+               char *name, int pool_size)
 {
-       adapter->shm = vmxnet3_shm_pool_create(adapter, name);
+       if (pool_size > SHM_MAX_DATA_SIZE) {
+               printk(KERN_ERR "vmxnet3_shm: requested pool size %d is larger than the maximum %d\n",
+                      pool_size, SHM_MAX_DATA_SIZE);
+               return -EINVAL;
+       }
+
+       adapter->shm = vmxnet3_shm_pool_create(adapter, name, pool_size);
        if (adapter->shm == NULL) {
                printk(KERN_ERR "failed to create shared memory pool\n");
                return -ENOMEM;
index bda62f959ab28177cd8b2bd34355bb4f354c8de0..ec031aa7c3c986f54afbfe01396ff63155309bf0 100644 (file)
@@ -49,7 +49,7 @@ struct vmxnet3_shm_pool
        struct
        {
                /* pages backing the map in virtual address order */
-               struct vmxnet3_shm_mapped_page pages[SHM_DATA_SIZE];
+               struct vmxnet3_shm_mapped_page *pages;
                unsigned int num_pages;
        } data;
 
@@ -67,7 +67,7 @@ struct vmxnet3_shm_pool
                 * count - 1 is the topmost free page.
                 */
                u16 count;
-               u16 stack[SHM_DATA_SIZE];
+               u16 *stack;
        } allocator;
 
        struct
@@ -95,7 +95,7 @@ struct vmxnet3_shm_pool
 int
 vmxnet3_shm_close(struct vmxnet3_adapter *adapter);
 int
-vmxnet3_shm_open(struct vmxnet3_adapter *adapter, char *name);
+vmxnet3_shm_open(struct vmxnet3_adapter *adapter, char *name, int pool_size);
 int
 vmxnet3_shm_user_rx(struct vmxnet3_shm_pool *shm,
                u16 idx, u16 len,
index a838d51e7883a41db6f219a3dc1d9b2dad86403b..1e77871f6a1f1731334b10c59a93891ce7bca918 100644 (file)
@@ -47,7 +47,8 @@
 
 // sizes of shared memory regions in pages
 #define SHM_DATA_START 0
-#define SHM_DATA_SIZE 4096
+#define SHM_DEFAULT_DATA_SIZE 4096
+#define SHM_MAX_DATA_SIZE 16384
 #define SHM_CTL_START 16384
 #define SHM_CTL_SIZE 1
 
index 37044fa7d635260b60c1be43b6c968765d7e6b38..47aa16e7c654273e053e127298b3ade57672745b 100644 (file)
 #ifndef _VMXNET3_VERSION_H_
 #define _VMXNET3_VERSION_H_
 
-#define VMXNET3_DRIVER_VERSION          1.0.4.0
-#define VMXNET3_DRIVER_VERSION_COMMAS   1,0,4,0
-#define VMXNET3_DRIVER_VERSION_STRING   "1.0.4.0"
+#define VMXNET3_DRIVER_VERSION          1.0.5.0
+#define VMXNET3_DRIVER_VERSION_COMMAS   1,0,5,0
+#define VMXNET3_DRIVER_VERSION_STRING   "1.0.5.0"
 
 /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
-#define VMXNET3_DRIVER_VERSION_NUM      0x01000400
+#define VMXNET3_DRIVER_VERSION_NUM      0x01000500
 
 #endif /* _VMXNET3_VERSION_H_ */
index 152c776ac875023ce43abaaef53136587a280f41..5ff87662366b700e2f4b1a0387c6bfb28a62c5d2 100644 (file)
@@ -1227,10 +1227,11 @@ string::replace(size_type i,     // IN
  *
  * utf::string::replace --
  *
- *      Replace all occurences of the given string with another string.
+ *      Mutates this string by replacing all occurrences of one string with
+ *      another.
  *
  * Results:
- *      A utf::string created with the substring replaced.
+ *      A reference to this object.
  *
  * Side effects:
  *      None
@@ -1263,6 +1264,30 @@ string::replace(const string &from, // IN
 }
 
 
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * utf::string::replace_copy --
+ *
+ * Results:
+ *      Returns a new string with all occurrences of one string replaced by
+ *      another.
+ *
+ * Side effects:
+ *      None
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+string
+string::replace_copy(const string& from, // IN
+                     const string& to)   // IN
+   const
+{
+   return string(*this).replace(from, to);
+}
+
+
 /*
  *-----------------------------------------------------------------------------
  *
@@ -1434,7 +1459,7 @@ string::rfind(value_type uc,     // IN
  *
  * utf::string::find_first_of --
  *
- *      Find the first occurence of 's' in this string.  'i' determines where in
+ *      Find the first occurrence of 's' in this string.  'i' determines where in
  *      the current string we start searching for 's'
  *
  * Results:
@@ -1471,7 +1496,7 @@ string::find_first_of(value_type uc,   // IN
  *
  * utf::string::find_first_not_of --
  *
- *      Find the first occurence of a string NOT in 's' in this string.  'i'
+ *      Find the first occurrence of a string NOT in 's' in this string.  'i'
  *      determines where in this string we start searching to NOT 's'.
  *
  * Results:
index f90ffce4dd6f803da34b9e63d0339eec7e635bb5..98f6092556615ac1642e83ba3867743dd6ed4609 100644 (file)
@@ -158,6 +158,7 @@ public:
    iterator erase(iterator pbegin, iterator pend);
    string& replace(size_type i, size_type n, const string& s);
    string& replace(const string &from, const string &to);
+   string replace_copy(const string& from, const string& to) const;
 
    int compare(const string &s, bool ignoreCase = false) const;
    int compare(size_type i, size_type n, const string &s) const;