Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82f68251 authored by James Bottomley's avatar James Bottomley Committed by Rafael J. Wysocki
Browse files

pm_qos: Get rid of the allocation in pm_qos_add_request()



All current users of pm_qos_add_request() have the ability to supply
the memory required by the pm_qos routines, so make them do this and
eliminate the kmalloc() with pm_qos_add_request().  This has the
double benefit of making the call never fail and allowing it to be
called from atomic context.

Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
Signed-off-by: default avatarmark gross <markgross@thegnar.org>
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
parent 5f279845
Loading
Loading
Loading
Loading
+7 −10
Original line number Diff line number Diff line
@@ -2901,10 +2901,10 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
			 * dropped transactions.
			 */
			pm_qos_update_request(
				adapter->netdev->pm_qos_req, 55);
				&adapter->netdev->pm_qos_req, 55);
		} else {
			pm_qos_update_request(
				adapter->netdev->pm_qos_req,
				&adapter->netdev->pm_qos_req,
				PM_QOS_DEFAULT_VALUE);
		}
	}
@@ -3196,8 +3196,8 @@ int e1000e_up(struct e1000_adapter *adapter)

	/* DMA latency requirement to workaround early-receive/jumbo issue */
	if (adapter->flags & FLAG_HAS_ERT)
		adapter->netdev->pm_qos_req =
			pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY,
		pm_qos_add_request(&adapter->netdev->pm_qos_req,
				   PM_QOS_CPU_DMA_LATENCY,
				   PM_QOS_DEFAULT_VALUE);

	/* hardware has been reset, we need to reload some things */
@@ -3263,11 +3263,8 @@ void e1000e_down(struct e1000_adapter *adapter)
	e1000_clean_tx_ring(adapter);
	e1000_clean_rx_ring(adapter);

	if (adapter->flags & FLAG_HAS_ERT) {
		pm_qos_remove_request(
			      adapter->netdev->pm_qos_req);
		adapter->netdev->pm_qos_req = NULL;
	}
	if (adapter->flags & FLAG_HAS_ERT)
		pm_qos_remove_request(&adapter->netdev->pm_qos_req);

	/*
	 * TODO: for power management, we could drop the link and
+4 −5
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@
#define DRV_VERSION "1.0.0-k0"
char igbvf_driver_name[] = "igbvf";
const char igbvf_driver_version[] = DRV_VERSION;
struct pm_qos_request_list *igbvf_driver_pm_qos_req;
static struct pm_qos_request_list igbvf_driver_pm_qos_req;
static const char igbvf_driver_string[] =
				"Intel(R) Virtual Function Network Driver";
static const char igbvf_copyright[] = "Copyright (c) 2009 Intel Corporation.";
@@ -2902,7 +2902,7 @@ static int __init igbvf_init_module(void)
	printk(KERN_INFO "%s\n", igbvf_copyright);

	ret = pci_register_driver(&igbvf_driver);
	igbvf_driver_pm_qos_req = pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY,
	pm_qos_add_request(&igbvf_driver_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
			   PM_QOS_DEFAULT_VALUE);

	return ret;
@@ -2918,8 +2918,7 @@ module_init(igbvf_init_module);
static void __exit igbvf_exit_module(void)
{
	pci_unregister_driver(&igbvf_driver);
	pm_qos_remove_request(igbvf_driver_pm_qos_req);
	igbvf_driver_pm_qos_req = NULL;
	pm_qos_remove_request(&igbvf_driver_pm_qos_req);
}
module_exit(igbvf_exit_module);

+6 −6
Original line number Diff line number Diff line
@@ -174,7 +174,7 @@ that only one external action is invoked at a time.
#define DRV_DESCRIPTION	"Intel(R) PRO/Wireless 2100 Network Driver"
#define DRV_COPYRIGHT	"Copyright(c) 2003-2006 Intel Corporation"

struct pm_qos_request_list *ipw2100_pm_qos_req;
struct pm_qos_request_list ipw2100_pm_qos_req;

/* Debugging stuff */
#ifdef CONFIG_IPW2100_DEBUG
@@ -1741,7 +1741,7 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
	/* the ipw2100 hardware really doesn't want power management delays
	 * longer than 175usec
	 */
	pm_qos_update_request(ipw2100_pm_qos_req, 175);
	pm_qos_update_request(&ipw2100_pm_qos_req, 175);

	/* If the interrupt is enabled, turn it off... */
	spin_lock_irqsave(&priv->low_lock, flags);
@@ -1889,7 +1889,7 @@ static void ipw2100_down(struct ipw2100_priv *priv)
	ipw2100_disable_interrupts(priv);
	spin_unlock_irqrestore(&priv->low_lock, flags);

	pm_qos_update_request(ipw2100_pm_qos_req, PM_QOS_DEFAULT_VALUE);
	pm_qos_update_request(&ipw2100_pm_qos_req, PM_QOS_DEFAULT_VALUE);

	/* We have to signal any supplicant if we are disassociating */
	if (associated)
@@ -6669,7 +6669,7 @@ static int __init ipw2100_init(void)
	if (ret)
		goto out;

	ipw2100_pm_qos_req = pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY,
	pm_qos_add_request(&ipw2100_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
			   PM_QOS_DEFAULT_VALUE);
#ifdef CONFIG_IPW2100_DEBUG
	ipw2100_debug_level = debug;
@@ -6692,7 +6692,7 @@ static void __exit ipw2100_exit(void)
			   &driver_attr_debug_level);
#endif
	pci_unregister_driver(&ipw2100_pci_driver);
	pm_qos_remove_request(ipw2100_pm_qos_req);
	pm_qos_remove_request(&ipw2100_pm_qos_req);
}

module_init(ipw2100_init);
+1 −1
Original line number Diff line number Diff line
@@ -779,7 +779,7 @@ struct net_device {
	 */
	char			name[IFNAMSIZ];

	struct pm_qos_request_list *pm_qos_req;
	struct pm_qos_request_list pm_qos_req;

	/* device name hash chain */
	struct hlist_node	name_hlist;
+10 −3
Original line number Diff line number Diff line
#ifndef _LINUX_PM_QOS_PARAMS_H
#define _LINUX_PM_QOS_PARAMS_H
/* interface for the pm_qos_power infrastructure of the linux kernel.
 *
 * Mark Gross <mgross@linux.intel.com>
 */
#include <linux/list.h>
#include <linux/plist.h>
#include <linux/notifier.h>
#include <linux/miscdevice.h>

@@ -14,9 +16,12 @@
#define PM_QOS_NUM_CLASSES 4
#define PM_QOS_DEFAULT_VALUE -1

struct pm_qos_request_list;
struct pm_qos_request_list {
	struct plist_node list;
	int pm_qos_class;
};

struct pm_qos_request_list *pm_qos_add_request(int pm_qos_class, s32 value);
void pm_qos_add_request(struct pm_qos_request_list *l, int pm_qos_class, s32 value);
void pm_qos_update_request(struct pm_qos_request_list *pm_qos_req,
		s32 new_value);
void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req);
@@ -24,4 +29,6 @@ void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req);
int pm_qos_request(int pm_qos_class);
int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier);
int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier);
int pm_qos_request_active(struct pm_qos_request_list *req);

#endif
Loading