mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge branch 'timers/posix-cpu-timers-for-tglx' of
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks into timers/core Frederic sayed: "Most of these patches have been hanging around for several month now, in -mmotm for a significant chunk. They already missed a few releases." Signed-off-by: Thomas Gleixner <[email protected]>
This commit is contained in:
commit
2b0f89317e
1549 changed files with 23077 additions and 10621 deletions
|
|
@ -19,11 +19,10 @@ config XEN_SELFBALLOONING
|
|||
by the current usage of anonymous memory ("committed AS") and
|
||||
controlled by various sysfs-settable parameters. Configuring
|
||||
FRONTSWAP is highly recommended; if it is not configured, self-
|
||||
ballooning is disabled by default but can be enabled with the
|
||||
'selfballooning' kernel boot parameter. If FRONTSWAP is configured,
|
||||
ballooning is disabled by default. If FRONTSWAP is configured,
|
||||
frontswap-selfshrinking is enabled by default but can be disabled
|
||||
with the 'noselfshrink' kernel boot parameter; and self-ballooning
|
||||
is enabled by default but can be disabled with the 'noselfballooning'
|
||||
with the 'tmem.selfshrink=0' kernel boot parameter; and self-ballooning
|
||||
is enabled by default but can be disabled with the 'tmem.selfballooning=0'
|
||||
kernel boot parameter. Note that systems without a sufficiently
|
||||
large swap device should not enable self-ballooning.
|
||||
|
||||
|
|
|
|||
|
|
@ -407,7 +407,8 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
|
|||
nr_pages = ARRAY_SIZE(frame_list);
|
||||
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
if ((page = alloc_page(gfp)) == NULL) {
|
||||
page = alloc_page(gfp);
|
||||
if (page == NULL) {
|
||||
nr_pages = i;
|
||||
state = BP_EAGAIN;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -504,7 +504,7 @@ static void privcmd_close(struct vm_area_struct *vma)
|
|||
struct page **pages = vma->vm_private_data;
|
||||
int numpgs = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
|
||||
|
||||
if (!xen_feature(XENFEAT_auto_translated_physmap || !numpgs || !pages))
|
||||
if (!xen_feature(XENFEAT_auto_translated_physmap) || !numpgs || !pages)
|
||||
return;
|
||||
|
||||
xen_unmap_domain_mfn_range(vma, numpgs, pages);
|
||||
|
|
|
|||
|
|
@ -11,11 +11,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/cleancache.h>
|
||||
|
||||
/* temporary ifdef until include/linux/frontswap.h is upstream */
|
||||
#ifdef CONFIG_FRONTSWAP
|
||||
#include <linux/frontswap.h>
|
||||
#endif
|
||||
|
||||
#include <xen/xen.h>
|
||||
#include <xen/interface/xen.h>
|
||||
|
|
@ -24,6 +20,36 @@
|
|||
#include <asm/xen/hypervisor.h>
|
||||
#include <xen/tmem.h>
|
||||
|
||||
#ifndef CONFIG_XEN_TMEM_MODULE
|
||||
bool __read_mostly tmem_enabled = false;
|
||||
|
||||
static int __init enable_tmem(char *s)
|
||||
{
|
||||
tmem_enabled = true;
|
||||
return 1;
|
||||
}
|
||||
__setup("tmem", enable_tmem);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CLEANCACHE
|
||||
static bool cleancache __read_mostly = true;
|
||||
module_param(cleancache, bool, S_IRUGO);
|
||||
static bool selfballooning __read_mostly = true;
|
||||
module_param(selfballooning, bool, S_IRUGO);
|
||||
#endif /* CONFIG_CLEANCACHE */
|
||||
|
||||
#ifdef CONFIG_FRONTSWAP
|
||||
static bool frontswap __read_mostly = true;
|
||||
module_param(frontswap, bool, S_IRUGO);
|
||||
#else /* CONFIG_FRONTSWAP */
|
||||
#define frontswap (0)
|
||||
#endif /* CONFIG_FRONTSWAP */
|
||||
|
||||
#ifdef CONFIG_XEN_SELFBALLOONING
|
||||
static bool selfshrinking __read_mostly = true;
|
||||
module_param(selfshrinking, bool, S_IRUGO);
|
||||
#endif /* CONFIG_XEN_SELFBALLOONING */
|
||||
|
||||
#define TMEM_CONTROL 0
|
||||
#define TMEM_NEW_POOL 1
|
||||
#define TMEM_DESTROY_POOL 2
|
||||
|
|
@ -129,16 +155,6 @@ static int xen_tmem_flush_object(u32 pool_id, struct tmem_oid oid)
|
|||
return xen_tmem_op(TMEM_FLUSH_OBJECT, pool_id, oid, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_XEN_TMEM_MODULE
|
||||
bool __read_mostly tmem_enabled = false;
|
||||
|
||||
static int __init enable_tmem(char *s)
|
||||
{
|
||||
tmem_enabled = true;
|
||||
return 1;
|
||||
}
|
||||
__setup("tmem", enable_tmem);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CLEANCACHE
|
||||
static int xen_tmem_destroy_pool(u32 pool_id)
|
||||
|
|
@ -230,20 +246,6 @@ static int tmem_cleancache_init_shared_fs(char *uuid, size_t pagesize)
|
|||
return xen_tmem_new_pool(shared_uuid, TMEM_POOL_SHARED, pagesize);
|
||||
}
|
||||
|
||||
static bool disable_cleancache __read_mostly;
|
||||
static bool disable_selfballooning __read_mostly;
|
||||
#ifdef CONFIG_XEN_TMEM_MODULE
|
||||
module_param(disable_cleancache, bool, S_IRUGO);
|
||||
module_param(disable_selfballooning, bool, S_IRUGO);
|
||||
#else
|
||||
static int __init no_cleancache(char *s)
|
||||
{
|
||||
disable_cleancache = true;
|
||||
return 1;
|
||||
}
|
||||
__setup("nocleancache", no_cleancache);
|
||||
#endif
|
||||
|
||||
static struct cleancache_ops tmem_cleancache_ops = {
|
||||
.put_page = tmem_cleancache_put_page,
|
||||
.get_page = tmem_cleancache_get_page,
|
||||
|
|
@ -361,20 +363,6 @@ static void tmem_frontswap_init(unsigned ignored)
|
|||
xen_tmem_new_pool(private, TMEM_POOL_PERSIST, PAGE_SIZE);
|
||||
}
|
||||
|
||||
static bool disable_frontswap __read_mostly;
|
||||
static bool disable_frontswap_selfshrinking __read_mostly;
|
||||
#ifdef CONFIG_XEN_TMEM_MODULE
|
||||
module_param(disable_frontswap, bool, S_IRUGO);
|
||||
module_param(disable_frontswap_selfshrinking, bool, S_IRUGO);
|
||||
#else
|
||||
static int __init no_frontswap(char *s)
|
||||
{
|
||||
disable_frontswap = true;
|
||||
return 1;
|
||||
}
|
||||
__setup("nofrontswap", no_frontswap);
|
||||
#endif
|
||||
|
||||
static struct frontswap_ops tmem_frontswap_ops = {
|
||||
.store = tmem_frontswap_store,
|
||||
.load = tmem_frontswap_load,
|
||||
|
|
@ -382,8 +370,6 @@ static struct frontswap_ops tmem_frontswap_ops = {
|
|||
.invalidate_area = tmem_frontswap_flush_area,
|
||||
.init = tmem_frontswap_init
|
||||
};
|
||||
#else /* CONFIG_FRONTSWAP */
|
||||
#define disable_frontswap_selfshrinking 1
|
||||
#endif
|
||||
|
||||
static int xen_tmem_init(void)
|
||||
|
|
@ -391,12 +377,12 @@ static int xen_tmem_init(void)
|
|||
if (!xen_domain())
|
||||
return 0;
|
||||
#ifdef CONFIG_FRONTSWAP
|
||||
if (tmem_enabled && !disable_frontswap) {
|
||||
if (tmem_enabled && frontswap) {
|
||||
char *s = "";
|
||||
struct frontswap_ops *old_ops =
|
||||
frontswap_register_ops(&tmem_frontswap_ops);
|
||||
struct frontswap_ops *old_ops;
|
||||
|
||||
tmem_frontswap_poolid = -1;
|
||||
old_ops = frontswap_register_ops(&tmem_frontswap_ops);
|
||||
if (IS_ERR(old_ops) || old_ops) {
|
||||
if (IS_ERR(old_ops))
|
||||
return PTR_ERR(old_ops);
|
||||
|
|
@ -408,7 +394,7 @@ static int xen_tmem_init(void)
|
|||
#endif
|
||||
#ifdef CONFIG_CLEANCACHE
|
||||
BUG_ON(sizeof(struct cleancache_filekey) != sizeof(struct tmem_oid));
|
||||
if (tmem_enabled && !disable_cleancache) {
|
||||
if (tmem_enabled && cleancache) {
|
||||
char *s = "";
|
||||
struct cleancache_ops *old_ops =
|
||||
cleancache_register_ops(&tmem_cleancache_ops);
|
||||
|
|
@ -419,8 +405,15 @@ static int xen_tmem_init(void)
|
|||
}
|
||||
#endif
|
||||
#ifdef CONFIG_XEN_SELFBALLOONING
|
||||
xen_selfballoon_init(!disable_selfballooning,
|
||||
!disable_frontswap_selfshrinking);
|
||||
/*
|
||||
* There is no point of driving pages to the swap system if they
|
||||
* aren't going anywhere in tmem universe.
|
||||
*/
|
||||
if (!frontswap) {
|
||||
selfshrinking = false;
|
||||
selfballooning = false;
|
||||
}
|
||||
xen_selfballoon_init(selfballooning, selfshrinking);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ static void pcistub_device_release(struct kref *kref)
|
|||
else
|
||||
pci_restore_state(dev);
|
||||
|
||||
if (pci_find_capability(dev, PCI_CAP_ID_MSIX)) {
|
||||
if (dev->msix_cap) {
|
||||
struct physdev_pci_device ppdev = {
|
||||
.seg = pci_domain_nr(dev->bus),
|
||||
.bus = dev->bus->number,
|
||||
|
|
@ -371,7 +371,7 @@ static int pcistub_init_device(struct pci_dev *dev)
|
|||
if (err)
|
||||
goto config_release;
|
||||
|
||||
if (pci_find_capability(dev, PCI_CAP_ID_MSIX)) {
|
||||
if (dev->msix_cap) {
|
||||
struct physdev_pci_device ppdev = {
|
||||
.seg = pci_domain_nr(dev->bus),
|
||||
.bus = dev->bus->number,
|
||||
|
|
|
|||
|
|
@ -53,15 +53,12 @@
|
|||
* System configuration note: Selfballooning should not be enabled on
|
||||
* systems without a sufficiently large swap device configured; for best
|
||||
* results, it is recommended that total swap be increased by the size
|
||||
* of the guest memory. Also, while technically not required to be
|
||||
* configured, it is highly recommended that frontswap also be configured
|
||||
* and enabled when selfballooning is running. So, selfballooning
|
||||
* is disabled by default if frontswap is not configured and can only
|
||||
* be enabled with the "selfballooning" kernel boot option; similarly
|
||||
* selfballooning is enabled by default if frontswap is configured and
|
||||
* can be disabled with the "noselfballooning" kernel boot option. Finally,
|
||||
* when frontswap is configured, frontswap-selfshrinking can be disabled
|
||||
* with the "noselfshrink" kernel boot option.
|
||||
* of the guest memory. Note, that selfballooning should be disabled by default
|
||||
* if frontswap is not configured. Similarly selfballooning should be enabled
|
||||
* by default if frontswap is configured and can be disabled with the
|
||||
* "tmem.selfballooning=0" kernel boot option. Finally, when frontswap is
|
||||
* configured, frontswap-selfshrinking can be disabled with the
|
||||
* "tmem.selfshrink=0" kernel boot option.
|
||||
*
|
||||
* Selfballooning is disallowed in domain0 and force-disabled.
|
||||
*
|
||||
|
|
@ -120,9 +117,6 @@ static DECLARE_DELAYED_WORK(selfballoon_worker, selfballoon_process);
|
|||
/* Enable/disable with sysfs. */
|
||||
static bool frontswap_selfshrinking __read_mostly;
|
||||
|
||||
/* Enable/disable with kernel boot option. */
|
||||
static bool use_frontswap_selfshrink = true;
|
||||
|
||||
/*
|
||||
* The default values for the following parameters were deemed reasonable
|
||||
* by experimentation, may be workload-dependent, and can all be
|
||||
|
|
@ -176,35 +170,6 @@ static void frontswap_selfshrink(void)
|
|||
frontswap_shrink(tgt_frontswap_pages);
|
||||
}
|
||||
|
||||
static int __init xen_nofrontswap_selfshrink_setup(char *s)
|
||||
{
|
||||
use_frontswap_selfshrink = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("noselfshrink", xen_nofrontswap_selfshrink_setup);
|
||||
|
||||
/* Disable with kernel boot option. */
|
||||
static bool use_selfballooning = true;
|
||||
|
||||
static int __init xen_noselfballooning_setup(char *s)
|
||||
{
|
||||
use_selfballooning = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("noselfballooning", xen_noselfballooning_setup);
|
||||
#else /* !CONFIG_FRONTSWAP */
|
||||
/* Enable with kernel boot option. */
|
||||
static bool use_selfballooning;
|
||||
|
||||
static int __init xen_selfballooning_setup(char *s)
|
||||
{
|
||||
use_selfballooning = true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("selfballooning", xen_selfballooning_setup);
|
||||
#endif /* CONFIG_FRONTSWAP */
|
||||
|
||||
#define MB2PAGES(mb) ((mb) << (20 - PAGE_SHIFT))
|
||||
|
|
|
|||
|
|
@ -534,7 +534,7 @@ static int xenbus_map_ring_valloc_hvm(struct xenbus_device *dev,
|
|||
|
||||
err = xenbus_map_ring(dev, gnt_ref, &node->handle, addr);
|
||||
if (err)
|
||||
goto out_err;
|
||||
goto out_err_free_ballooned_pages;
|
||||
|
||||
spin_lock(&xenbus_valloc_lock);
|
||||
list_add(&node->next, &xenbus_valloc_pages);
|
||||
|
|
@ -543,8 +543,9 @@ static int xenbus_map_ring_valloc_hvm(struct xenbus_device *dev,
|
|||
*vaddr = addr;
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
out_err_free_ballooned_pages:
|
||||
free_xenballooned_pages(1, &node->page);
|
||||
out_err:
|
||||
kfree(node);
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ int xb_wait_for_data_to_read(void);
|
|||
int xs_input_avail(void);
|
||||
extern struct xenstore_domain_interface *xen_store_interface;
|
||||
extern int xen_store_evtchn;
|
||||
extern enum xenstore_init xen_store_domain_type;
|
||||
|
||||
extern const struct file_operations xen_xenbus_fops;
|
||||
|
||||
|
|
|
|||
|
|
@ -70,22 +70,21 @@ static long xenbus_alloc(domid_t domid)
|
|||
return err;
|
||||
}
|
||||
|
||||
static long xenbus_backend_ioctl(struct file *file, unsigned int cmd, unsigned long data)
|
||||
static long xenbus_backend_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long data)
|
||||
{
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
switch (cmd) {
|
||||
case IOCTL_XENBUS_BACKEND_EVTCHN:
|
||||
if (xen_store_evtchn > 0)
|
||||
return xen_store_evtchn;
|
||||
return -ENODEV;
|
||||
|
||||
case IOCTL_XENBUS_BACKEND_SETUP:
|
||||
return xenbus_alloc(data);
|
||||
|
||||
default:
|
||||
return -ENOTTY;
|
||||
case IOCTL_XENBUS_BACKEND_EVTCHN:
|
||||
if (xen_store_evtchn > 0)
|
||||
return xen_store_evtchn;
|
||||
return -ENODEV;
|
||||
case IOCTL_XENBUS_BACKEND_SETUP:
|
||||
return xenbus_alloc(data);
|
||||
default:
|
||||
return -ENOTTY;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -69,6 +69,9 @@ EXPORT_SYMBOL_GPL(xen_store_evtchn);
|
|||
struct xenstore_domain_interface *xen_store_interface;
|
||||
EXPORT_SYMBOL_GPL(xen_store_interface);
|
||||
|
||||
enum xenstore_init xen_store_domain_type;
|
||||
EXPORT_SYMBOL_GPL(xen_store_domain_type);
|
||||
|
||||
static unsigned long xen_store_mfn;
|
||||
|
||||
static BLOCKING_NOTIFIER_HEAD(xenstore_chain);
|
||||
|
|
@ -719,17 +722,11 @@ static int __init xenstored_local_init(void)
|
|||
return err;
|
||||
}
|
||||
|
||||
enum xenstore_init {
|
||||
UNKNOWN,
|
||||
PV,
|
||||
HVM,
|
||||
LOCAL,
|
||||
};
|
||||
static int __init xenbus_init(void)
|
||||
{
|
||||
int err = 0;
|
||||
enum xenstore_init usage = UNKNOWN;
|
||||
uint64_t v = 0;
|
||||
xen_store_domain_type = XS_UNKNOWN;
|
||||
|
||||
if (!xen_domain())
|
||||
return -ENODEV;
|
||||
|
|
@ -737,29 +734,29 @@ static int __init xenbus_init(void)
|
|||
xenbus_ring_ops_init();
|
||||
|
||||
if (xen_pv_domain())
|
||||
usage = PV;
|
||||
xen_store_domain_type = XS_PV;
|
||||
if (xen_hvm_domain())
|
||||
usage = HVM;
|
||||
xen_store_domain_type = XS_HVM;
|
||||
if (xen_hvm_domain() && xen_initial_domain())
|
||||
usage = LOCAL;
|
||||
xen_store_domain_type = XS_LOCAL;
|
||||
if (xen_pv_domain() && !xen_start_info->store_evtchn)
|
||||
usage = LOCAL;
|
||||
xen_store_domain_type = XS_LOCAL;
|
||||
if (xen_pv_domain() && xen_start_info->store_evtchn)
|
||||
xenstored_ready = 1;
|
||||
|
||||
switch (usage) {
|
||||
case LOCAL:
|
||||
switch (xen_store_domain_type) {
|
||||
case XS_LOCAL:
|
||||
err = xenstored_local_init();
|
||||
if (err)
|
||||
goto out_error;
|
||||
xen_store_interface = mfn_to_virt(xen_store_mfn);
|
||||
break;
|
||||
case PV:
|
||||
case XS_PV:
|
||||
xen_store_evtchn = xen_start_info->store_evtchn;
|
||||
xen_store_mfn = xen_start_info->store_mfn;
|
||||
xen_store_interface = mfn_to_virt(xen_store_mfn);
|
||||
break;
|
||||
case HVM:
|
||||
case XS_HVM:
|
||||
err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
|
||||
if (err)
|
||||
goto out_error;
|
||||
|
|
|
|||
|
|
@ -47,6 +47,13 @@ struct xen_bus_type {
|
|||
struct bus_type bus;
|
||||
};
|
||||
|
||||
enum xenstore_init {
|
||||
XS_UNKNOWN,
|
||||
XS_PV,
|
||||
XS_HVM,
|
||||
XS_LOCAL,
|
||||
};
|
||||
|
||||
extern struct device_attribute xenbus_dev_attrs[];
|
||||
|
||||
extern int xenbus_match(struct device *_dev, struct device_driver *_drv);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
#include "xenbus_probe.h"
|
||||
|
||||
|
||||
static struct workqueue_struct *xenbus_frontend_wq;
|
||||
|
||||
/* device/<type>/<id> => <type>-<id> */
|
||||
static int frontend_bus_id(char bus_id[XEN_BUS_ID_SIZE], const char *nodename)
|
||||
{
|
||||
|
|
@ -89,9 +91,40 @@ static void backend_changed(struct xenbus_watch *watch,
|
|||
xenbus_otherend_changed(watch, vec, len, 1);
|
||||
}
|
||||
|
||||
static void xenbus_frontend_delayed_resume(struct work_struct *w)
|
||||
{
|
||||
struct xenbus_device *xdev = container_of(w, struct xenbus_device, work);
|
||||
|
||||
xenbus_dev_resume(&xdev->dev);
|
||||
}
|
||||
|
||||
static int xenbus_frontend_dev_resume(struct device *dev)
|
||||
{
|
||||
/*
|
||||
* If xenstored is running in this domain, we cannot access the backend
|
||||
* state at the moment, so we need to defer xenbus_dev_resume
|
||||
*/
|
||||
if (xen_store_domain_type == XS_LOCAL) {
|
||||
struct xenbus_device *xdev = to_xenbus_device(dev);
|
||||
|
||||
if (!xenbus_frontend_wq) {
|
||||
pr_err("%s: no workqueue to process delayed resume\n",
|
||||
xdev->nodename);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
INIT_WORK(&xdev->work, xenbus_frontend_delayed_resume);
|
||||
queue_work(xenbus_frontend_wq, &xdev->work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return xenbus_dev_resume(dev);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops xenbus_pm_ops = {
|
||||
.suspend = xenbus_dev_suspend,
|
||||
.resume = xenbus_dev_resume,
|
||||
.resume = xenbus_frontend_dev_resume,
|
||||
.freeze = xenbus_dev_suspend,
|
||||
.thaw = xenbus_dev_cancel,
|
||||
.restore = xenbus_dev_resume,
|
||||
|
|
@ -440,6 +473,8 @@ static int __init xenbus_probe_frontend_init(void)
|
|||
|
||||
register_xenstore_notifier(&xenstore_notifier);
|
||||
|
||||
xenbus_frontend_wq = create_workqueue("xenbus_frontend");
|
||||
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(xenbus_probe_frontend_init);
|
||||
|
|
|
|||
Loading…
Reference in a new issue