From: VMware, Inc <> Date: Tue, 17 Nov 2009 22:14:22 +0000 (-0800) Subject: Internal branch sync. Included in this change: X-Git-Tag: 2009.11.16-210370~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=47971e6a5fc343c4eb819982d12e4c386156389a;p=thirdparty%2Fopen-vm-tools.git Internal branch sync. Included in this change: . 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 --- diff --git a/open-vm-tools/lib/include/memaligned.h b/open-vm-tools/lib/include/memaligned.h index 93b68fbf1..6a0d34466 100644 --- a/open-vm-tools/lib/include/memaligned.h +++ b/open-vm-tools/lib/include/memaligned.h @@ -98,7 +98,7 @@ AlignedMallocImpl(size_t size) // IN return NULL; } - buf = malloc(paddedSize); + buf = (void **)malloc(paddedSize); if (!buf) { return NULL; } diff --git a/open-vm-tools/lib/include/vix.h b/open-vm-tools/lib/include/vix.h index af927ebb9..065f7c829 100644 --- a/open-vm-tools/lib/include/vix.h +++ b/open-vm-tools/lib/include/vix.h @@ -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, diff --git a/open-vm-tools/lib/include/x86cpuid.h b/open-vm-tools/lib/include/x86cpuid.h index a509fb6ed..e3d4f4b64 100644 --- a/open-vm-tools/lib/include/x86cpuid.h +++ b/open-vm-tools/lib/include/x86cpuid.h @@ -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 /* diff --git a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_drv.c b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_drv.c index 0267f8a31..fec0db40e 100644 --- a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_drv.c +++ b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_drv.c @@ -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"); diff --git a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.c b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.c index 468b79048..465b2f022 100644 --- a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.c +++ b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.c @@ -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; diff --git a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.h b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.h index bda62f959..ec031aa7c 100644 --- a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.h +++ b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm.h @@ -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, diff --git a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm_shared.h b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm_shared.h index a838d51e7..1e77871f6 100644 --- a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm_shared.h +++ b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_shm_shared.h @@ -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 diff --git a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_version.h b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_version.h index 37044fa7d..47aa16e7c 100644 --- a/open-vm-tools/modules/linux/vmxnet3/vmxnet3_version.h +++ b/open-vm-tools/modules/linux/vmxnet3/vmxnet3_version.h @@ -25,11 +25,11 @@ #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_ */ diff --git a/open-vm-tools/vmware-user/stringxx/string.cc b/open-vm-tools/vmware-user/stringxx/string.cc index 152c776ac..5ff876623 100644 --- a/open-vm-tools/vmware-user/stringxx/string.cc +++ b/open-vm-tools/vmware-user/stringxx/string.cc @@ -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: diff --git a/open-vm-tools/vmware-user/stringxx/string.hh b/open-vm-tools/vmware-user/stringxx/string.hh index f90ffce4d..98f609255 100644 --- a/open-vm-tools/vmware-user/stringxx/string.hh +++ b/open-vm-tools/vmware-user/stringxx/string.hh @@ -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;