1. A method, in a data processing system comprising a plurality of physical processors and a memory, for dynamically adjusting assignment of software threads to hardware threads in virtual machine (VM) environments, the method comprising: receiving, by a virtual machine manager (VMM) executing in the data processing system, an indication of workload priority from each VM of a plurality of VMs executing on the data processing system, wherein the indication indicates a priority of a workload executing on the VM determined from a priority policy associated with the VM; monitoring, by the VMM, physical resource usage across all VMs in the plurality of VMs to determine a load level in the data processing system; sending, by the VMM in response to determining a high load level, a notification indicating the high load level to each VM in the plurality of VMs that is over-provisioned, wherein the notifications are sent in accordance with priorities of workloads executing on the VMs in the plurality of VMs such that notifications are sent to relatively low priority VMs prior to sending notifications to relatively high priority VMs in the plurality of VMs; and starting with relatively low priority VMs in the plurality of VMs then by relatively higher priority VMs in the plurality of VMs, automatically adjusting, by each VM in the plurality of VMs that is over-provisioned, assignment of corresponding software threads to hardware threads by performing one of folding or unfolding a number of virtual processors (VPs) allocated to the VM based on the indicated high load level and the priority of the workload executing on the VM, wherein performing one of folding or unfolding the number of VPs allocated to the adjusting VM comprises: determining whether the priority of the adjusting VM is relatively low or relatively high based on the priority policy associated with the adjusting VM; in response to the priority of the adjusting VM being relatively low, folding the number of VPs allocated to the VM down to a minimum number of VPs required for the workload executing on the adjusting VM and assigning software threads to all of the hardware threads represented by the allocated VPs of the adjusting VM to achieve complete utilization of allocated VPs of the adjusting VM; and in response to the priority of the adjusting VM being relatively high, folding or unfolding the number of VPs allocated to the adjusting VM covering a capacity above and beyond the entitlement of the adjusting VM to match the number of available processors from a set of shared resources available in the data processing system up to a maximum number of VPs associated with the adjusting VM, wherein software threads are assigned to only the primary hardware threads represented by the allocated VPs when allocated the maximum number of VPs.