Merge 521b619acd ("Merge tag 'linux-kselftest-kunit-fixes-5.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest") into android-mainline
Steps on the way to 5.10-rc3 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I57f80255bf5d396e92a54807a516cc41cf07be61
This commit is contained in:
@@ -478,7 +478,7 @@ order to ask the hardware to enter that state. Also, for each
|
||||
statistics of the given idle state. That information is exposed by the kernel
|
||||
via ``sysfs``.
|
||||
|
||||
For each CPU in the system, there is a :file:`/sys/devices/system/cpu<N>/cpuidle/`
|
||||
For each CPU in the system, there is a :file:`/sys/devices/system/cpu/cpu<N>/cpuidle/`
|
||||
directory in ``sysfs``, where the number ``<N>`` is assigned to the given
|
||||
CPU at the initialization time. That directory contains a set of subdirectories
|
||||
called :file:`state0`, :file:`state1` and so on, up to the number of idle state
|
||||
@@ -494,7 +494,7 @@ object corresponding to it, as follows:
|
||||
residency.
|
||||
|
||||
``below``
|
||||
Total number of times this idle state had been asked for, but cerainly
|
||||
Total number of times this idle state had been asked for, but certainly
|
||||
a deeper idle state would have been a better match for the observed idle
|
||||
duration.
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@ Now add the following to ``drivers/misc/Kconfig``:
|
||||
|
||||
config MISC_EXAMPLE_TEST
|
||||
bool "Test for my example"
|
||||
depends on MISC_EXAMPLE && KUNIT
|
||||
depends on MISC_EXAMPLE && KUNIT=y
|
||||
|
||||
and the following to ``drivers/misc/Makefile``:
|
||||
|
||||
|
||||
@@ -561,6 +561,11 @@ Once the kernel is built and installed, a simple
|
||||
|
||||
...will run the tests.
|
||||
|
||||
.. note::
|
||||
Note that you should make sure your test depends on ``KUNIT=y`` in Kconfig
|
||||
if the test does not support module build. Otherwise, it will trigger
|
||||
compile errors if ``CONFIG_KUNIT`` is ``m``.
|
||||
|
||||
Writing new tests for other architectures
|
||||
-----------------------------------------
|
||||
|
||||
|
||||
@@ -14540,6 +14540,14 @@ F: Documentation/devicetree/bindings/mailbox/qcom-ipcc.yaml
|
||||
F: drivers/mailbox/qcom-ipcc.c
|
||||
F: include/dt-bindings/mailbox/qcom-ipcc.h
|
||||
|
||||
QUALCOMM IPQ4019 VQMMC REGULATOR DRIVER
|
||||
M: Robert Marko <robert.marko@sartura.hr>
|
||||
M: Luka Perkov <luka.perkov@sartura.hr>
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/regulator/vqmmc-ipq4019-regulator.yaml
|
||||
F: drivers/regulator/vqmmc-ipq4019-regulator.c
|
||||
|
||||
QUALCOMM RMNET DRIVER
|
||||
M: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
|
||||
M: Sean Tranchetti <stranche@codeaurora.org>
|
||||
|
||||
+2
-2
@@ -354,8 +354,8 @@ static void __init free_highpages(void)
|
||||
/* set highmem page free */
|
||||
for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE,
|
||||
&range_start, &range_end, NULL) {
|
||||
unsigned long start = PHYS_PFN(range_start);
|
||||
unsigned long end = PHYS_PFN(range_end);
|
||||
unsigned long start = PFN_UP(range_start);
|
||||
unsigned long end = PFN_DOWN(range_end);
|
||||
|
||||
/* Ignore complete lowmem entries */
|
||||
if (end <= max_low)
|
||||
|
||||
@@ -273,11 +273,15 @@ void __init hv_apic_init(void)
|
||||
pr_info("Hyper-V: Using enlightened APIC (%s mode)",
|
||||
x2apic_enabled() ? "x2apic" : "xapic");
|
||||
/*
|
||||
* With x2apic, architectural x2apic MSRs are equivalent to the
|
||||
* respective synthetic MSRs, so there's no need to override
|
||||
* the apic accessors. The only exception is
|
||||
* hv_apic_eoi_write, because it benefits from lazy EOI when
|
||||
* available, but it works for both xapic and x2apic modes.
|
||||
* When in x2apic mode, don't use the Hyper-V specific APIC
|
||||
* accessors since the field layout in the ICR register is
|
||||
* different in x2apic mode. Furthermore, the architectural
|
||||
* x2apic MSRs function just as well as the Hyper-V
|
||||
* synthetic APIC MSRs, so there's no benefit in having
|
||||
* separate Hyper-V accessors for x2apic mode. The only
|
||||
* exception is hv_apic_eoi_write, because it benefits from
|
||||
* lazy EOI when available, but the same accessor works for
|
||||
* both xapic and x2apic because the field layout is the same.
|
||||
*/
|
||||
apic_set_eoi_write(hv_apic_eoi_write);
|
||||
if (!x2apic_enabled()) {
|
||||
|
||||
@@ -89,8 +89,8 @@ static void __init free_highpages(void)
|
||||
/* set highmem page free */
|
||||
for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE,
|
||||
&range_start, &range_end, NULL) {
|
||||
unsigned long start = PHYS_PFN(range_start);
|
||||
unsigned long end = PHYS_PFN(range_end);
|
||||
unsigned long start = PFN_UP(range_start);
|
||||
unsigned long end = PFN_DOWN(range_end);
|
||||
|
||||
/* Ignore complete lowmem entries */
|
||||
if (end <= max_low)
|
||||
|
||||
+2
-4
@@ -773,8 +773,7 @@ static void __device_link_del(struct kref *kref)
|
||||
dev_dbg(link->consumer, "Dropping the link to %s\n",
|
||||
dev_name(link->supplier));
|
||||
|
||||
if (link->flags & DL_FLAG_PM_RUNTIME)
|
||||
pm_runtime_drop_link(link->consumer);
|
||||
pm_runtime_drop_link(link);
|
||||
|
||||
list_del_rcu(&link->s_node);
|
||||
list_del_rcu(&link->c_node);
|
||||
@@ -788,8 +787,7 @@ static void __device_link_del(struct kref *kref)
|
||||
dev_info(link->consumer, "Dropping the link to %s\n",
|
||||
dev_name(link->supplier));
|
||||
|
||||
if (link->flags & DL_FLAG_PM_RUNTIME)
|
||||
pm_runtime_drop_link(link->consumer);
|
||||
pm_runtime_drop_link(link);
|
||||
|
||||
list_del(&link->s_node);
|
||||
list_del(&link->c_node);
|
||||
|
||||
+5
-4
@@ -1117,6 +1117,8 @@ static void __device_release_driver(struct device *dev, struct device *parent)
|
||||
|
||||
drv = dev->driver;
|
||||
if (drv) {
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
while (device_links_busy(dev)) {
|
||||
__device_driver_unlock(dev, parent);
|
||||
|
||||
@@ -1128,13 +1130,12 @@ static void __device_release_driver(struct device *dev, struct device *parent)
|
||||
* have released the driver successfully while this one
|
||||
* was waiting, so check for that.
|
||||
*/
|
||||
if (dev->driver != drv)
|
||||
if (dev->driver != drv) {
|
||||
pm_runtime_put(dev);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
pm_runtime_clean_up_links(dev);
|
||||
|
||||
driver_sysfs_remove(dev);
|
||||
|
||||
if (dev->bus)
|
||||
|
||||
@@ -1642,42 +1642,6 @@ void pm_runtime_remove(struct device *dev)
|
||||
pm_runtime_reinit(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* pm_runtime_clean_up_links - Prepare links to consumers for driver removal.
|
||||
* @dev: Device whose driver is going to be removed.
|
||||
*
|
||||
* Check links from this device to any consumers and if any of them have active
|
||||
* runtime PM references to the device, drop the usage counter of the device
|
||||
* (as many times as needed).
|
||||
*
|
||||
* Links with the DL_FLAG_MANAGED flag unset are ignored.
|
||||
*
|
||||
* Since the device is guaranteed to be runtime-active at the point this is
|
||||
* called, nothing else needs to be done here.
|
||||
*
|
||||
* Moreover, this is called after device_links_busy() has returned 'false', so
|
||||
* the status of each link is guaranteed to be DL_STATE_SUPPLIER_UNBIND and
|
||||
* therefore rpm_active can't be manipulated concurrently.
|
||||
*/
|
||||
void pm_runtime_clean_up_links(struct device *dev)
|
||||
{
|
||||
struct device_link *link;
|
||||
int idx;
|
||||
|
||||
idx = device_links_read_lock();
|
||||
|
||||
list_for_each_entry_rcu(link, &dev->links.consumers, s_node,
|
||||
device_links_read_lock_held()) {
|
||||
if (!(link->flags & DL_FLAG_MANAGED))
|
||||
continue;
|
||||
|
||||
while (refcount_dec_not_one(&link->rpm_active))
|
||||
pm_runtime_put_noidle(dev);
|
||||
}
|
||||
|
||||
device_links_read_unlock(idx);
|
||||
}
|
||||
|
||||
/**
|
||||
* pm_runtime_get_suppliers - Resume and reference-count supplier devices.
|
||||
* @dev: Consumer device.
|
||||
@@ -1729,7 +1693,7 @@ void pm_runtime_new_link(struct device *dev)
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
}
|
||||
|
||||
void pm_runtime_drop_link(struct device *dev)
|
||||
static void pm_runtime_drop_link_count(struct device *dev)
|
||||
{
|
||||
spin_lock_irq(&dev->power.lock);
|
||||
WARN_ON(dev->power.links_count == 0);
|
||||
@@ -1737,6 +1701,25 @@ void pm_runtime_drop_link(struct device *dev)
|
||||
spin_unlock_irq(&dev->power.lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* pm_runtime_drop_link - Prepare for device link removal.
|
||||
* @link: Device link going away.
|
||||
*
|
||||
* Drop the link count of the consumer end of @link and decrement the supplier
|
||||
* device's runtime PM usage counter as many times as needed to drop all of the
|
||||
* PM runtime reference to it from the consumer.
|
||||
*/
|
||||
void pm_runtime_drop_link(struct device_link *link)
|
||||
{
|
||||
if (!(link->flags & DL_FLAG_PM_RUNTIME))
|
||||
return;
|
||||
|
||||
pm_runtime_drop_link_count(link->consumer);
|
||||
|
||||
while (refcount_dec_not_one(&link->rpm_active))
|
||||
pm_runtime_put(link->supplier);
|
||||
}
|
||||
|
||||
static bool pm_runtime_need_not_resume(struct device *dev)
|
||||
{
|
||||
return atomic_read(&dev->power.usage_count) <= 1 &&
|
||||
|
||||
@@ -1275,7 +1275,7 @@ static void balloon_up(struct work_struct *dummy)
|
||||
|
||||
/* Refuse to balloon below the floor. */
|
||||
if (avail_pages < num_pages || avail_pages - num_pages < floor) {
|
||||
pr_warn("Balloon request will be partially fulfilled. %s\n",
|
||||
pr_info("Balloon request will be partially fulfilled. %s\n",
|
||||
avail_pages < num_pages ? "Not enough memory." :
|
||||
"Balloon floor reached.");
|
||||
|
||||
|
||||
@@ -176,7 +176,7 @@ struct pvrdma_port_attr {
|
||||
u8 subnet_timeout;
|
||||
u8 init_type_reply;
|
||||
u8 active_width;
|
||||
u16 active_speed;
|
||||
u8 active_speed;
|
||||
u8 phys_state;
|
||||
u8 reserved[2];
|
||||
};
|
||||
|
||||
@@ -524,6 +524,7 @@ static noinline int check_support(struct rvt_dev_info *rdi, int verb)
|
||||
int rvt_register_device(struct rvt_dev_info *rdi)
|
||||
{
|
||||
int ret = 0, i;
|
||||
u64 dma_mask;
|
||||
|
||||
if (!rdi)
|
||||
return -EINVAL;
|
||||
@@ -580,8 +581,10 @@ int rvt_register_device(struct rvt_dev_info *rdi)
|
||||
|
||||
/* DMA Operations */
|
||||
rdi->ibdev.dev.dma_parms = rdi->ibdev.dev.parent->dma_parms;
|
||||
dma_set_coherent_mask(&rdi->ibdev.dev,
|
||||
rdi->ibdev.dev.parent->coherent_dma_mask);
|
||||
dma_mask = IS_ENABLED(CONFIG_64BIT) ? DMA_BIT_MASK(64) : DMA_BIT_MASK(32);
|
||||
ret = dma_coerce_mask_and_coherent(&rdi->ibdev.dev, dma_mask);
|
||||
if (ret)
|
||||
goto bail_wss;
|
||||
|
||||
/* Protection Domain */
|
||||
spin_lock_init(&rdi->n_pds_lock);
|
||||
|
||||
@@ -1118,6 +1118,7 @@ int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name)
|
||||
int err;
|
||||
struct ib_device *dev = &rxe->ib_dev;
|
||||
struct crypto_shash *tfm;
|
||||
u64 dma_mask;
|
||||
|
||||
strlcpy(dev->node_desc, "rxe", sizeof(dev->node_desc));
|
||||
|
||||
@@ -1130,7 +1131,10 @@ int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name)
|
||||
rxe->ndev->dev_addr);
|
||||
dev->dev.dma_parms = &rxe->dma_parms;
|
||||
dma_set_max_seg_size(&dev->dev, UINT_MAX);
|
||||
dma_set_coherent_mask(&dev->dev, dma_get_required_mask(&dev->dev));
|
||||
dma_mask = IS_ENABLED(CONFIG_64BIT) ? DMA_BIT_MASK(64) : DMA_BIT_MASK(32);
|
||||
err = dma_coerce_mask_and_coherent(&dev->dev, dma_mask);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
dev->uverbs_cmd_mask = BIT_ULL(IB_USER_VERBS_CMD_GET_CONTEXT)
|
||||
| BIT_ULL(IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL)
|
||||
|
||||
@@ -306,6 +306,7 @@ static struct siw_device *siw_device_create(struct net_device *netdev)
|
||||
struct siw_device *sdev = NULL;
|
||||
struct ib_device *base_dev;
|
||||
struct device *parent = netdev->dev.parent;
|
||||
u64 dma_mask;
|
||||
int rv;
|
||||
|
||||
if (!parent) {
|
||||
@@ -384,8 +385,10 @@ static struct siw_device *siw_device_create(struct net_device *netdev)
|
||||
base_dev->dev.parent = parent;
|
||||
base_dev->dev.dma_parms = &sdev->dma_parms;
|
||||
dma_set_max_seg_size(&base_dev->dev, UINT_MAX);
|
||||
dma_set_coherent_mask(&base_dev->dev,
|
||||
dma_get_required_mask(&base_dev->dev));
|
||||
dma_mask = IS_ENABLED(CONFIG_64BIT) ? DMA_BIT_MASK(64) : DMA_BIT_MASK(32);
|
||||
if (dma_coerce_mask_and_coherent(&base_dev->dev, dma_mask))
|
||||
goto error;
|
||||
|
||||
base_dev->num_comp_vectors = num_possible_cpus();
|
||||
|
||||
xa_init_flags(&sdev->qp_xa, XA_FLAGS_ALLOC1);
|
||||
|
||||
@@ -622,10 +622,11 @@ static int srpt_refresh_port(struct srpt_port *sport)
|
||||
/**
|
||||
* srpt_unregister_mad_agent - unregister MAD callback functions
|
||||
* @sdev: SRPT HCA pointer.
|
||||
* @port_cnt: number of ports with registered MAD
|
||||
*
|
||||
* Note: It is safe to call this function more than once for the same device.
|
||||
*/
|
||||
static void srpt_unregister_mad_agent(struct srpt_device *sdev)
|
||||
static void srpt_unregister_mad_agent(struct srpt_device *sdev, int port_cnt)
|
||||
{
|
||||
struct ib_port_modify port_modify = {
|
||||
.clr_port_cap_mask = IB_PORT_DEVICE_MGMT_SUP,
|
||||
@@ -633,7 +634,7 @@ static void srpt_unregister_mad_agent(struct srpt_device *sdev)
|
||||
struct srpt_port *sport;
|
||||
int i;
|
||||
|
||||
for (i = 1; i <= sdev->device->phys_port_cnt; i++) {
|
||||
for (i = 1; i <= port_cnt; i++) {
|
||||
sport = &sdev->port[i - 1];
|
||||
WARN_ON(sport->port != i);
|
||||
if (sport->mad_agent) {
|
||||
@@ -3185,7 +3186,8 @@ static int srpt_add_one(struct ib_device *device)
|
||||
if (ret) {
|
||||
pr_err("MAD registration failed for %s-%d.\n",
|
||||
dev_name(&sdev->device->dev), i);
|
||||
goto err_event;
|
||||
i--;
|
||||
goto err_port;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3197,7 +3199,8 @@ static int srpt_add_one(struct ib_device *device)
|
||||
pr_debug("added %s.\n", dev_name(&device->dev));
|
||||
return 0;
|
||||
|
||||
err_event:
|
||||
err_port:
|
||||
srpt_unregister_mad_agent(sdev, i);
|
||||
ib_unregister_event_handler(&sdev->event_handler);
|
||||
err_cm:
|
||||
if (sdev->cm_id)
|
||||
@@ -3221,7 +3224,7 @@ static void srpt_remove_one(struct ib_device *device, void *client_data)
|
||||
struct srpt_device *sdev = client_data;
|
||||
int i;
|
||||
|
||||
srpt_unregister_mad_agent(sdev);
|
||||
srpt_unregister_mad_agent(sdev, sdev->device->phys_port_cnt);
|
||||
|
||||
ib_unregister_event_handler(&sdev->event_handler);
|
||||
|
||||
|
||||
+5
-4
@@ -1181,6 +1181,10 @@ static void _opp_table_kref_release(struct kref *kref)
|
||||
struct opp_device *opp_dev, *temp;
|
||||
int i;
|
||||
|
||||
/* Drop the lock as soon as we can */
|
||||
list_del(&opp_table->node);
|
||||
mutex_unlock(&opp_table_lock);
|
||||
|
||||
_of_clear_opp_table(opp_table);
|
||||
|
||||
/* Release clk */
|
||||
@@ -1208,10 +1212,7 @@ static void _opp_table_kref_release(struct kref *kref)
|
||||
|
||||
mutex_destroy(&opp_table->genpd_virt_dev_lock);
|
||||
mutex_destroy(&opp_table->lock);
|
||||
list_del(&opp_table->node);
|
||||
kfree(opp_table);
|
||||
|
||||
mutex_unlock(&opp_table_lock);
|
||||
}
|
||||
|
||||
void dev_pm_opp_put_opp_table(struct opp_table *opp_table)
|
||||
@@ -1930,7 +1931,7 @@ struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
opp_table = dev_pm_opp_get_opp_table(dev);
|
||||
if (!IS_ERR(opp_table))
|
||||
if (IS_ERR(opp_table))
|
||||
return opp_table;
|
||||
|
||||
/* This should be called before OPPs are initialized */
|
||||
|
||||
@@ -944,6 +944,8 @@ static int _of_add_opp_table_v1(struct device *dev, struct opp_table *opp_table)
|
||||
nr -= 2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
remove_static_opp:
|
||||
_opp_remove_all_static(opp_table);
|
||||
|
||||
|
||||
@@ -586,8 +586,12 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
|
||||
* ATU, so we should not program the ATU here.
|
||||
*/
|
||||
if (pp->bridge->child_ops == &dw_child_pcie_ops) {
|
||||
struct resource_entry *entry =
|
||||
resource_list_first_type(&pp->bridge->windows, IORESOURCE_MEM);
|
||||
struct resource_entry *tmp, *entry = NULL;
|
||||
|
||||
/* Get last memory resource entry */
|
||||
resource_list_for_each_entry(tmp, &pp->bridge->windows)
|
||||
if (resource_type(tmp->res) == IORESOURCE_MEM)
|
||||
entry = tmp;
|
||||
|
||||
dw_pcie_prog_outbound_atu(pci, PCIE_ATU_REGION_INDEX0,
|
||||
PCIE_ATU_TYPE_MEM, entry->res->start,
|
||||
|
||||
@@ -958,25 +958,16 @@ static void mvebu_pcie_powerdown(struct mvebu_pcie_port *port)
|
||||
}
|
||||
|
||||
/*
|
||||
* We can't use devm_of_pci_get_host_bridge_resources() because we
|
||||
* need to parse our special DT properties encoding the MEM and IO
|
||||
* apertures.
|
||||
* devm_of_pci_get_host_bridge_resources() only sets up translateable resources,
|
||||
* so we need extra resource setup parsing our special DT properties encoding
|
||||
* the MEM and IO apertures.
|
||||
*/
|
||||
static int mvebu_pcie_parse_request_resources(struct mvebu_pcie *pcie)
|
||||
{
|
||||
struct device *dev = &pcie->pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
|
||||
int ret;
|
||||
|
||||
/* Get the bus range */
|
||||
ret = of_pci_parse_bus_range(np, &pcie->busn);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to parse bus-range property: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
pci_add_resource(&bridge->windows, &pcie->busn);
|
||||
|
||||
/* Get the PCIe memory aperture */
|
||||
mvebu_mbus_get_pcie_mem_aperture(&pcie->mem);
|
||||
if (resource_size(&pcie->mem) == 0) {
|
||||
@@ -986,6 +977,9 @@ static int mvebu_pcie_parse_request_resources(struct mvebu_pcie *pcie)
|
||||
|
||||
pcie->mem.name = "PCI MEM";
|
||||
pci_add_resource(&bridge->windows, &pcie->mem);
|
||||
ret = devm_request_resource(dev, &iomem_resource, &pcie->mem);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Get the PCIe IO aperture */
|
||||
mvebu_mbus_get_pcie_io_aperture(&pcie->io);
|
||||
@@ -999,9 +993,12 @@ static int mvebu_pcie_parse_request_resources(struct mvebu_pcie *pcie)
|
||||
pcie->realio.name = "PCI I/O";
|
||||
|
||||
pci_add_resource(&bridge->windows, &pcie->realio);
|
||||
ret = devm_request_resource(dev, &ioport_resource, &pcie->realio);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return devm_request_pci_bus_resources(dev, &bridge->windows);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+7
-2
@@ -3516,8 +3516,13 @@ void pci_acs_init(struct pci_dev *dev)
|
||||
{
|
||||
dev->acs_cap = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS);
|
||||
|
||||
if (dev->acs_cap)
|
||||
pci_enable_acs(dev);
|
||||
/*
|
||||
* Attempt to enable ACS regardless of capability because some Root
|
||||
* Ports (e.g. those quirked with *_intel_pch_acs_*) do not have
|
||||
* the standard ACS capability but still support ACS via those
|
||||
* quirks.
|
||||
*/
|
||||
pci_enable_acs(dev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -620,7 +620,7 @@ static u64 rapl_unit_xlate(struct rapl_domain *rd, enum unit_type type,
|
||||
case ARBITRARY_UNIT:
|
||||
default:
|
||||
return value;
|
||||
};
|
||||
}
|
||||
|
||||
if (to_raw)
|
||||
return div64_u64(value, units) * scale;
|
||||
|
||||
@@ -4165,6 +4165,8 @@ int regulator_get_voltage_rdev(struct regulator_dev *rdev)
|
||||
ret = rdev->desc->fixed_uV;
|
||||
} else if (rdev->supply) {
|
||||
ret = regulator_get_voltage_rdev(rdev->supply->rdev);
|
||||
} else if (rdev->supply_name) {
|
||||
return -EPROBE_DEFER;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1259,18 +1259,6 @@ static int bcm2835_spi_setup(struct spi_device *spi)
|
||||
if (!chip)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Retrieve the corresponding GPIO line used for CS.
|
||||
* The inversion semantics will be handled by the GPIO core
|
||||
* code, so we pass GPIOD_OUT_LOW for "unasserted" and
|
||||
* the correct flag for inversion semantics. The SPI_CS_HIGH
|
||||
* on spi->mode cannot be checked for polarity in this case
|
||||
* as the flag use_gpio_descriptors enforces SPI_CS_HIGH.
|
||||
*/
|
||||
if (of_property_read_bool(spi->dev.of_node, "spi-cs-high"))
|
||||
lflags = GPIO_ACTIVE_HIGH;
|
||||
else
|
||||
lflags = GPIO_ACTIVE_LOW;
|
||||
spi->cs_gpiod = gpiochip_request_own_desc(chip, 8 - spi->chip_select,
|
||||
DRV_NAME,
|
||||
lflags,
|
||||
|
||||
@@ -1080,12 +1080,11 @@ MODULE_DEVICE_TABLE(of, fsl_dspi_dt_ids);
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int dspi_suspend(struct device *dev)
|
||||
{
|
||||
struct spi_controller *ctlr = dev_get_drvdata(dev);
|
||||
struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr);
|
||||
struct fsl_dspi *dspi = dev_get_drvdata(dev);
|
||||
|
||||
if (dspi->irq)
|
||||
disable_irq(dspi->irq);
|
||||
spi_controller_suspend(ctlr);
|
||||
spi_controller_suspend(dspi->ctlr);
|
||||
clk_disable_unprepare(dspi->clk);
|
||||
|
||||
pinctrl_pm_select_sleep_state(dev);
|
||||
@@ -1095,8 +1094,7 @@ static int dspi_suspend(struct device *dev)
|
||||
|
||||
static int dspi_resume(struct device *dev)
|
||||
{
|
||||
struct spi_controller *ctlr = dev_get_drvdata(dev);
|
||||
struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr);
|
||||
struct fsl_dspi *dspi = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
pinctrl_pm_select_default_state(dev);
|
||||
@@ -1104,7 +1102,7 @@ static int dspi_resume(struct device *dev)
|
||||
ret = clk_prepare_enable(dspi->clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
spi_controller_resume(ctlr);
|
||||
spi_controller_resume(dspi->ctlr);
|
||||
if (dspi->irq)
|
||||
enable_irq(dspi->irq);
|
||||
|
||||
|
||||
+15
-8
@@ -1676,15 +1676,18 @@ static int spi_imx_probe(struct platform_device *pdev)
|
||||
goto out_master_put;
|
||||
}
|
||||
|
||||
pm_runtime_enable(spi_imx->dev);
|
||||
ret = clk_prepare_enable(spi_imx->clk_per);
|
||||
if (ret)
|
||||
goto out_master_put;
|
||||
|
||||
ret = clk_prepare_enable(spi_imx->clk_ipg);
|
||||
if (ret)
|
||||
goto out_put_per;
|
||||
|
||||
pm_runtime_set_autosuspend_delay(spi_imx->dev, MXC_RPM_TIMEOUT);
|
||||
pm_runtime_use_autosuspend(spi_imx->dev);
|
||||
|
||||
ret = pm_runtime_get_sync(spi_imx->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(spi_imx->dev, "failed to enable clock\n");
|
||||
goto out_runtime_pm_put;
|
||||
}
|
||||
pm_runtime_set_active(spi_imx->dev);
|
||||
pm_runtime_enable(spi_imx->dev);
|
||||
|
||||
spi_imx->spi_clk = clk_get_rate(spi_imx->clk_per);
|
||||
/*
|
||||
@@ -1722,8 +1725,12 @@ out_bitbang_start:
|
||||
spi_imx_sdma_exit(spi_imx);
|
||||
out_runtime_pm_put:
|
||||
pm_runtime_dont_use_autosuspend(spi_imx->dev);
|
||||
pm_runtime_put_sync(spi_imx->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
pm_runtime_disable(spi_imx->dev);
|
||||
|
||||
clk_disable_unprepare(spi_imx->clk_ipg);
|
||||
out_put_per:
|
||||
clk_disable_unprepare(spi_imx->clk_per);
|
||||
out_master_put:
|
||||
spi_master_put(master);
|
||||
|
||||
|
||||
+2
-1
@@ -1078,7 +1078,8 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
|
||||
out_free:
|
||||
kfree(gl->gl_lksb.sb_lvbptr);
|
||||
kmem_cache_free(cachep, gl);
|
||||
atomic_dec(&sdp->sd_glock_disposal);
|
||||
if (atomic_dec_and_test(&sdp->sd_glock_disposal))
|
||||
wake_up(&sdp->sd_glock_wait);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
||||
+45
-11
@@ -164,6 +164,31 @@ void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync)
|
||||
GFS2_LFC_AIL_FLUSH);
|
||||
}
|
||||
|
||||
/**
|
||||
* gfs2_rgrp_metasync - sync out the metadata of a resource group
|
||||
* @gl: the glock protecting the resource group
|
||||
*
|
||||
*/
|
||||
|
||||
static int gfs2_rgrp_metasync(struct gfs2_glock *gl)
|
||||
{
|
||||
struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
|
||||
struct address_space *metamapping = &sdp->sd_aspace;
|
||||
struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(gl);
|
||||
const unsigned bsize = sdp->sd_sb.sb_bsize;
|
||||
loff_t start = (rgd->rd_addr * bsize) & PAGE_MASK;
|
||||
loff_t end = PAGE_ALIGN((rgd->rd_addr + rgd->rd_length) * bsize) - 1;
|
||||
int error;
|
||||
|
||||
filemap_fdatawrite_range(metamapping, start, end);
|
||||
error = filemap_fdatawait_range(metamapping, start, end);
|
||||
WARN_ON_ONCE(error && !gfs2_withdrawn(sdp));
|
||||
mapping_set_error(metamapping, error);
|
||||
if (error)
|
||||
gfs2_io_error(sdp);
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* rgrp_go_sync - sync out the metadata for this glock
|
||||
* @gl: the glock
|
||||
@@ -176,11 +201,7 @@ void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync)
|
||||
static int rgrp_go_sync(struct gfs2_glock *gl)
|
||||
{
|
||||
struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
|
||||
struct address_space *mapping = &sdp->sd_aspace;
|
||||
struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(gl);
|
||||
const unsigned bsize = sdp->sd_sb.sb_bsize;
|
||||
loff_t start = (rgd->rd_addr * bsize) & PAGE_MASK;
|
||||
loff_t end = PAGE_ALIGN((rgd->rd_addr + rgd->rd_length) * bsize) - 1;
|
||||
int error;
|
||||
|
||||
if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags))
|
||||
@@ -189,10 +210,7 @@ static int rgrp_go_sync(struct gfs2_glock *gl)
|
||||
|
||||
gfs2_log_flush(sdp, gl, GFS2_LOG_HEAD_FLUSH_NORMAL |
|
||||
GFS2_LFC_RGRP_GO_SYNC);
|
||||
filemap_fdatawrite_range(mapping, start, end);
|
||||
error = filemap_fdatawait_range(mapping, start, end);
|
||||
WARN_ON_ONCE(error && !gfs2_withdrawn(sdp));
|
||||
mapping_set_error(mapping, error);
|
||||
error = gfs2_rgrp_metasync(gl);
|
||||
if (!error)
|
||||
error = gfs2_ail_empty_gl(gl);
|
||||
gfs2_free_clones(rgd);
|
||||
@@ -266,7 +284,24 @@ static void gfs2_clear_glop_pending(struct gfs2_inode *ip)
|
||||
}
|
||||
|
||||
/**
|
||||
* inode_go_sync - Sync the dirty data and/or metadata for an inode glock
|
||||
* gfs2_inode_metasync - sync out the metadata of an inode
|
||||
* @gl: the glock protecting the inode
|
||||
*
|
||||
*/
|
||||
int gfs2_inode_metasync(struct gfs2_glock *gl)
|
||||
{
|
||||
struct address_space *metamapping = gfs2_glock2aspace(gl);
|
||||
int error;
|
||||
|
||||
filemap_fdatawrite(metamapping);
|
||||
error = filemap_fdatawait(metamapping);
|
||||
if (error)
|
||||
gfs2_io_error(gl->gl_name.ln_sbd);
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* inode_go_sync - Sync the dirty metadata of an inode
|
||||
* @gl: the glock protecting the inode
|
||||
*
|
||||
*/
|
||||
@@ -297,8 +332,7 @@ static int inode_go_sync(struct gfs2_glock *gl)
|
||||
error = filemap_fdatawait(mapping);
|
||||
mapping_set_error(mapping, error);
|
||||
}
|
||||
ret = filemap_fdatawait(metamapping);
|
||||
mapping_set_error(metamapping, ret);
|
||||
ret = gfs2_inode_metasync(gl);
|
||||
if (!error)
|
||||
error = ret;
|
||||
gfs2_ail_empty_gl(gl);
|
||||
|
||||
@@ -22,6 +22,7 @@ extern const struct gfs2_glock_operations gfs2_quota_glops;
|
||||
extern const struct gfs2_glock_operations gfs2_journal_glops;
|
||||
extern const struct gfs2_glock_operations *gfs2_glops_list[];
|
||||
|
||||
extern int gfs2_inode_metasync(struct gfs2_glock *gl);
|
||||
extern void gfs2_ail_flush(struct gfs2_glock *gl, bool fsync);
|
||||
|
||||
#endif /* __GLOPS_DOT_H__ */
|
||||
|
||||
+2
-1
@@ -180,7 +180,8 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
|
||||
error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);
|
||||
if (unlikely(error))
|
||||
goto fail;
|
||||
gfs2_cancel_delete_work(ip->i_iopen_gh.gh_gl);
|
||||
if (blktype != GFS2_BLKST_UNLINKED)
|
||||
gfs2_cancel_delete_work(ip->i_iopen_gh.gh_gl);
|
||||
glock_set_object(ip->i_iopen_gh.gh_gl, ip);
|
||||
gfs2_glock_put(io_gl);
|
||||
io_gl = NULL;
|
||||
|
||||
+5
-26
@@ -22,6 +22,7 @@
|
||||
#include "incore.h"
|
||||
#include "inode.h"
|
||||
#include "glock.h"
|
||||
#include "glops.h"
|
||||
#include "log.h"
|
||||
#include "lops.h"
|
||||
#include "meta_io.h"
|
||||
@@ -817,41 +818,19 @@ static int buf_lo_scan_elements(struct gfs2_jdesc *jd, u32 start,
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* gfs2_meta_sync - Sync all buffers associated with a glock
|
||||
* @gl: The glock
|
||||
*
|
||||
*/
|
||||
|
||||
void gfs2_meta_sync(struct gfs2_glock *gl)
|
||||
{
|
||||
struct address_space *mapping = gfs2_glock2aspace(gl);
|
||||
struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
|
||||
int error;
|
||||
|
||||
if (mapping == NULL)
|
||||
mapping = &sdp->sd_aspace;
|
||||
|
||||
filemap_fdatawrite(mapping);
|
||||
error = filemap_fdatawait(mapping);
|
||||
|
||||
if (error)
|
||||
gfs2_io_error(gl->gl_name.ln_sbd);
|
||||
}
|
||||
|
||||
static void buf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
|
||||
{
|
||||
struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
|
||||
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
|
||||
|
||||
if (error) {
|
||||
gfs2_meta_sync(ip->i_gl);
|
||||
gfs2_inode_metasync(ip->i_gl);
|
||||
return;
|
||||
}
|
||||
if (pass != 1)
|
||||
return;
|
||||
|
||||
gfs2_meta_sync(ip->i_gl);
|
||||
gfs2_inode_metasync(ip->i_gl);
|
||||
|
||||
fs_info(sdp, "jid=%u: Replayed %u of %u blocks\n",
|
||||
jd->jd_jid, jd->jd_replayed_blocks, jd->jd_found_blocks);
|
||||
@@ -1060,14 +1039,14 @@ static void databuf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
|
||||
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
|
||||
|
||||
if (error) {
|
||||
gfs2_meta_sync(ip->i_gl);
|
||||
gfs2_inode_metasync(ip->i_gl);
|
||||
return;
|
||||
}
|
||||
if (pass != 1)
|
||||
return;
|
||||
|
||||
/* data sync? */
|
||||
gfs2_meta_sync(ip->i_gl);
|
||||
gfs2_inode_metasync(ip->i_gl);
|
||||
|
||||
fs_info(sdp, "jid=%u: Replayed %u of %u data blocks\n",
|
||||
jd->jd_jid, jd->jd_replayed_blocks, jd->jd_found_blocks);
|
||||
|
||||
@@ -27,8 +27,6 @@ extern void gfs2_log_submit_bio(struct bio **biop, int opf);
|
||||
extern void gfs2_pin(struct gfs2_sbd *sdp, struct buffer_head *bh);
|
||||
extern int gfs2_find_jhead(struct gfs2_jdesc *jd,
|
||||
struct gfs2_log_header_host *head, bool keep_cache);
|
||||
extern void gfs2_meta_sync(struct gfs2_glock *gl);
|
||||
|
||||
static inline unsigned int buf_limit(struct gfs2_sbd *sdp)
|
||||
{
|
||||
unsigned int limit;
|
||||
|
||||
@@ -633,8 +633,10 @@ static int init_statfs(struct gfs2_sbd *sdp)
|
||||
if (IS_ERR(sdp->sd_statfs_inode)) {
|
||||
error = PTR_ERR(sdp->sd_statfs_inode);
|
||||
fs_err(sdp, "can't read in statfs inode: %d\n", error);
|
||||
goto fail;
|
||||
goto out;
|
||||
}
|
||||
if (sdp->sd_args.ar_spectator)
|
||||
goto out;
|
||||
|
||||
pn = gfs2_lookup_simple(master, "per_node");
|
||||
if (IS_ERR(pn)) {
|
||||
@@ -682,15 +684,17 @@ free_local:
|
||||
iput(pn);
|
||||
put_statfs:
|
||||
iput(sdp->sd_statfs_inode);
|
||||
fail:
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
/* Uninitialize and free up memory used by the list of statfs inodes */
|
||||
static void uninit_statfs(struct gfs2_sbd *sdp)
|
||||
{
|
||||
gfs2_glock_dq_uninit(&sdp->sd_sc_gh);
|
||||
free_local_statfs_inodes(sdp);
|
||||
if (!sdp->sd_args.ar_spectator) {
|
||||
gfs2_glock_dq_uninit(&sdp->sd_sc_gh);
|
||||
free_local_statfs_inodes(sdp);
|
||||
}
|
||||
iput(sdp->sd_statfs_inode);
|
||||
}
|
||||
|
||||
@@ -704,7 +708,7 @@ static int init_journal(struct gfs2_sbd *sdp, int undo)
|
||||
|
||||
if (undo) {
|
||||
jindex = 0;
|
||||
goto fail_jinode_gh;
|
||||
goto fail_statfs;
|
||||
}
|
||||
|
||||
sdp->sd_jindex = gfs2_lookup_simple(master, "jindex");
|
||||
|
||||
+1
-1
@@ -349,7 +349,7 @@ static int update_statfs_inode(struct gfs2_jdesc *jd,
|
||||
|
||||
mark_buffer_dirty(bh);
|
||||
brelse(bh);
|
||||
gfs2_meta_sync(ip->i_gl);
|
||||
gfs2_inode_metasync(ip->i_gl);
|
||||
|
||||
out:
|
||||
return error;
|
||||
|
||||
+4
-1
@@ -719,9 +719,9 @@ void gfs2_clear_rgrpd(struct gfs2_sbd *sdp)
|
||||
}
|
||||
|
||||
gfs2_free_clones(rgd);
|
||||
return_all_reservations(rgd);
|
||||
kfree(rgd->rd_bits);
|
||||
rgd->rd_bits = NULL;
|
||||
return_all_reservations(rgd);
|
||||
kmem_cache_free(gfs2_rgrpd_cachep, rgd);
|
||||
}
|
||||
}
|
||||
@@ -1370,6 +1370,9 @@ int gfs2_fitrim(struct file *filp, void __user *argp)
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))
|
||||
return -EROFS;
|
||||
|
||||
if (!blk_queue_discard(q))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
|
||||
@@ -738,6 +738,7 @@ restart:
|
||||
gfs2_jindex_free(sdp);
|
||||
/* Take apart glock structures and buffer lists */
|
||||
gfs2_gl_hash_clear(sdp);
|
||||
truncate_inode_pages_final(&sdp->sd_aspace);
|
||||
gfs2_delete_debugfs_file(sdp);
|
||||
/* Unmount the locking protocol */
|
||||
gfs2_lm_unmount(sdp);
|
||||
|
||||
@@ -252,13 +252,14 @@ static inline int kunit_run_all_tests(void)
|
||||
}
|
||||
#endif /* IS_BUILTIN(CONFIG_KUNIT) */
|
||||
|
||||
#ifdef MODULE
|
||||
/**
|
||||
* kunit_test_suites() - used to register one or more &struct kunit_suite
|
||||
* with KUnit.
|
||||
* kunit_test_suites_for_module() - used to register one or more
|
||||
* &struct kunit_suite with KUnit.
|
||||
*
|
||||
* @suites_list...: a statically allocated list of &struct kunit_suite.
|
||||
* @__suites: a statically allocated list of &struct kunit_suite.
|
||||
*
|
||||
* Registers @suites_list with the test framework. See &struct kunit_suite for
|
||||
* Registers @__suites with the test framework. See &struct kunit_suite for
|
||||
* more information.
|
||||
*
|
||||
* If a test suite is built-in, module_init() gets translated into
|
||||
@@ -267,7 +268,6 @@ static inline int kunit_run_all_tests(void)
|
||||
* module_{init|exit} functions for the builtin case when registering
|
||||
* suites via kunit_test_suites() below.
|
||||
*/
|
||||
#ifdef MODULE
|
||||
#define kunit_test_suites_for_module(__suites) \
|
||||
static int __init kunit_test_suites_init(void) \
|
||||
{ \
|
||||
@@ -294,7 +294,7 @@ static inline int kunit_run_all_tests(void)
|
||||
* kunit_test_suites() - used to register one or more &struct kunit_suite
|
||||
* with KUnit.
|
||||
*
|
||||
* @suites: a statically allocated list of &struct kunit_suite.
|
||||
* @__suites: a statically allocated list of &struct kunit_suite.
|
||||
*
|
||||
* Registers @suites with the test framework. See &struct kunit_suite for
|
||||
* more information.
|
||||
@@ -308,10 +308,10 @@ static inline int kunit_run_all_tests(void)
|
||||
* module.
|
||||
*
|
||||
*/
|
||||
#define kunit_test_suites(...) \
|
||||
#define kunit_test_suites(__suites...) \
|
||||
__kunit_test_suites(__UNIQUE_ID(array), \
|
||||
__UNIQUE_ID(suites), \
|
||||
__VA_ARGS__)
|
||||
##__suites)
|
||||
|
||||
#define kunit_test_suite(suite) kunit_test_suites(&suite)
|
||||
|
||||
|
||||
@@ -54,11 +54,10 @@ extern u64 pm_runtime_autosuspend_expiration(struct device *dev);
|
||||
extern void pm_runtime_update_max_time_suspended(struct device *dev,
|
||||
s64 delta_ns);
|
||||
extern void pm_runtime_set_memalloc_noio(struct device *dev, bool enable);
|
||||
extern void pm_runtime_clean_up_links(struct device *dev);
|
||||
extern void pm_runtime_get_suppliers(struct device *dev);
|
||||
extern void pm_runtime_put_suppliers(struct device *dev);
|
||||
extern void pm_runtime_new_link(struct device *dev);
|
||||
extern void pm_runtime_drop_link(struct device *dev);
|
||||
extern void pm_runtime_drop_link(struct device_link *link);
|
||||
|
||||
/**
|
||||
* pm_runtime_get_if_in_use - Conditionally bump up runtime PM usage counter.
|
||||
@@ -276,11 +275,10 @@ static inline u64 pm_runtime_autosuspend_expiration(
|
||||
struct device *dev) { return 0; }
|
||||
static inline void pm_runtime_set_memalloc_noio(struct device *dev,
|
||||
bool enable){}
|
||||
static inline void pm_runtime_clean_up_links(struct device *dev) {}
|
||||
static inline void pm_runtime_get_suppliers(struct device *dev) {}
|
||||
static inline void pm_runtime_put_suppliers(struct device *dev) {}
|
||||
static inline void pm_runtime_new_link(struct device *dev) {}
|
||||
static inline void pm_runtime_drop_link(struct device *dev) {}
|
||||
static inline void pm_runtime_drop_link(struct device_link *link) {}
|
||||
|
||||
#endif /* !CONFIG_PM */
|
||||
|
||||
|
||||
+21
-4
@@ -1249,7 +1249,13 @@ __acquires(hlist_lock)
|
||||
|
||||
*head = &kretprobe_inst_table[hash];
|
||||
hlist_lock = kretprobe_table_lock_ptr(hash);
|
||||
raw_spin_lock_irqsave(hlist_lock, *flags);
|
||||
/*
|
||||
* Nested is a workaround that will soon not be needed.
|
||||
* There's other protections that make sure the same lock
|
||||
* is not taken on the same CPU that lockdep is unaware of.
|
||||
* Differentiate when it is taken in NMI context.
|
||||
*/
|
||||
raw_spin_lock_irqsave_nested(hlist_lock, *flags, !!in_nmi());
|
||||
}
|
||||
NOKPROBE_SYMBOL(kretprobe_hash_lock);
|
||||
|
||||
@@ -1258,7 +1264,13 @@ static void kretprobe_table_lock(unsigned long hash,
|
||||
__acquires(hlist_lock)
|
||||
{
|
||||
raw_spinlock_t *hlist_lock = kretprobe_table_lock_ptr(hash);
|
||||
raw_spin_lock_irqsave(hlist_lock, *flags);
|
||||
/*
|
||||
* Nested is a workaround that will soon not be needed.
|
||||
* There's other protections that make sure the same lock
|
||||
* is not taken on the same CPU that lockdep is unaware of.
|
||||
* Differentiate when it is taken in NMI context.
|
||||
*/
|
||||
raw_spin_lock_irqsave_nested(hlist_lock, *flags, !!in_nmi());
|
||||
}
|
||||
NOKPROBE_SYMBOL(kretprobe_table_lock);
|
||||
|
||||
@@ -2028,7 +2040,12 @@ static int pre_handler_kretprobe(struct kprobe *p, struct pt_regs *regs)
|
||||
|
||||
/* TODO: consider to only swap the RA after the last pre_handler fired */
|
||||
hash = hash_ptr(current, KPROBE_HASH_BITS);
|
||||
raw_spin_lock_irqsave(&rp->lock, flags);
|
||||
/*
|
||||
* Nested is a workaround that will soon not be needed.
|
||||
* There's other protections that make sure the same lock
|
||||
* is not taken on the same CPU that lockdep is unaware of.
|
||||
*/
|
||||
raw_spin_lock_irqsave_nested(&rp->lock, flags, 1);
|
||||
if (!hlist_empty(&rp->free_instances)) {
|
||||
ri = hlist_entry(rp->free_instances.first,
|
||||
struct kretprobe_instance, hlist);
|
||||
@@ -2039,7 +2056,7 @@ static int pre_handler_kretprobe(struct kprobe *p, struct pt_regs *regs)
|
||||
ri->task = current;
|
||||
|
||||
if (rp->entry_handler && rp->entry_handler(ri, regs)) {
|
||||
raw_spin_lock_irqsave(&rp->lock, flags);
|
||||
raw_spin_lock_irqsave_nested(&rp->lock, flags, 1);
|
||||
hlist_add_head(&ri->hlist, &rp->free_instances);
|
||||
raw_spin_unlock_irqrestore(&rp->lock, flags);
|
||||
return 0;
|
||||
|
||||
@@ -102,9 +102,12 @@ static bool sugov_should_update_freq(struct sugov_policy *sg_policy, u64 time)
|
||||
static bool sugov_update_next_freq(struct sugov_policy *sg_policy, u64 time,
|
||||
unsigned int next_freq)
|
||||
{
|
||||
if (sg_policy->next_freq == next_freq &&
|
||||
!cpufreq_driver_test_flags(CPUFREQ_NEED_UPDATE_LIMITS))
|
||||
return false;
|
||||
if (!sg_policy->need_freq_update) {
|
||||
if (sg_policy->next_freq == next_freq)
|
||||
return false;
|
||||
} else {
|
||||
sg_policy->need_freq_update = cpufreq_driver_test_flags(CPUFREQ_NEED_UPDATE_LIMITS);
|
||||
}
|
||||
|
||||
sg_policy->next_freq = next_freq;
|
||||
sg_policy->last_freq_update_time = time;
|
||||
@@ -162,11 +165,9 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy,
|
||||
|
||||
freq = map_util_freq(util, freq, max);
|
||||
|
||||
if (freq == sg_policy->cached_raw_freq && !sg_policy->need_freq_update &&
|
||||
!cpufreq_driver_test_flags(CPUFREQ_NEED_UPDATE_LIMITS))
|
||||
if (freq == sg_policy->cached_raw_freq && !sg_policy->need_freq_update)
|
||||
return sg_policy->next_freq;
|
||||
|
||||
sg_policy->need_freq_update = false;
|
||||
sg_policy->cached_raw_freq = freq;
|
||||
return cpufreq_driver_resolve_freq(policy, freq);
|
||||
}
|
||||
@@ -442,7 +443,6 @@ static void sugov_update_single(struct update_util_data *hook, u64 time,
|
||||
struct sugov_policy *sg_policy = sg_cpu->sg_policy;
|
||||
unsigned long util, max;
|
||||
unsigned int next_f;
|
||||
bool busy;
|
||||
unsigned int cached_freq = sg_policy->cached_raw_freq;
|
||||
|
||||
sugov_iowait_boost(sg_cpu, time, flags);
|
||||
@@ -453,9 +453,6 @@ static void sugov_update_single(struct update_util_data *hook, u64 time,
|
||||
if (!sugov_should_update_freq(sg_policy, time))
|
||||
return;
|
||||
|
||||
/* Limits may have changed, don't skip frequency update */
|
||||
busy = !sg_policy->need_freq_update && sugov_cpu_is_busy(sg_cpu);
|
||||
|
||||
util = sugov_get_util(sg_cpu);
|
||||
max = sg_cpu->max;
|
||||
util = sugov_iowait_apply(sg_cpu, time, util, max);
|
||||
@@ -464,7 +461,7 @@ static void sugov_update_single(struct update_util_data *hook, u64 time,
|
||||
* Do not reduce the frequency if the CPU has not been idle
|
||||
* recently, as the reduction is likely to be premature then.
|
||||
*/
|
||||
if (busy && next_f < sg_policy->next_freq) {
|
||||
if (sugov_cpu_is_busy(sg_cpu) && next_f < sg_policy->next_freq) {
|
||||
next_f = sg_policy->next_freq;
|
||||
|
||||
/* Restore cached freq as next_freq has changed */
|
||||
@@ -829,9 +826,10 @@ static int sugov_start(struct cpufreq_policy *policy)
|
||||
sg_policy->next_freq = 0;
|
||||
sg_policy->work_in_progress = false;
|
||||
sg_policy->limits_changed = false;
|
||||
sg_policy->need_freq_update = false;
|
||||
sg_policy->cached_raw_freq = 0;
|
||||
|
||||
sg_policy->need_freq_update = cpufreq_driver_test_flags(CPUFREQ_NEED_UPDATE_LIMITS);
|
||||
|
||||
for_each_cpu(cpu, policy->cpus) {
|
||||
struct sugov_cpu *sg_cpu = &per_cpu(sugov_cpu, cpu);
|
||||
|
||||
|
||||
+46
-12
@@ -438,14 +438,16 @@ enum {
|
||||
};
|
||||
/*
|
||||
* Used for which event context the event is in.
|
||||
* NMI = 0
|
||||
* IRQ = 1
|
||||
* SOFTIRQ = 2
|
||||
* NORMAL = 3
|
||||
* TRANSITION = 0
|
||||
* NMI = 1
|
||||
* IRQ = 2
|
||||
* SOFTIRQ = 3
|
||||
* NORMAL = 4
|
||||
*
|
||||
* See trace_recursive_lock() comment below for more details.
|
||||
*/
|
||||
enum {
|
||||
RB_CTX_TRANSITION,
|
||||
RB_CTX_NMI,
|
||||
RB_CTX_IRQ,
|
||||
RB_CTX_SOFTIRQ,
|
||||
@@ -3014,10 +3016,10 @@ rb_wakeups(struct trace_buffer *buffer, struct ring_buffer_per_cpu *cpu_buffer)
|
||||
* a bit of overhead in something as critical as function tracing,
|
||||
* we use a bitmask trick.
|
||||
*
|
||||
* bit 0 = NMI context
|
||||
* bit 1 = IRQ context
|
||||
* bit 2 = SoftIRQ context
|
||||
* bit 3 = normal context.
|
||||
* bit 1 = NMI context
|
||||
* bit 2 = IRQ context
|
||||
* bit 3 = SoftIRQ context
|
||||
* bit 4 = normal context.
|
||||
*
|
||||
* This works because this is the order of contexts that can
|
||||
* preempt other contexts. A SoftIRQ never preempts an IRQ
|
||||
@@ -3040,6 +3042,30 @@ rb_wakeups(struct trace_buffer *buffer, struct ring_buffer_per_cpu *cpu_buffer)
|
||||
* The least significant bit can be cleared this way, and it
|
||||
* just so happens that it is the same bit corresponding to
|
||||
* the current context.
|
||||
*
|
||||
* Now the TRANSITION bit breaks the above slightly. The TRANSITION bit
|
||||
* is set when a recursion is detected at the current context, and if
|
||||
* the TRANSITION bit is already set, it will fail the recursion.
|
||||
* This is needed because there's a lag between the changing of
|
||||
* interrupt context and updating the preempt count. In this case,
|
||||
* a false positive will be found. To handle this, one extra recursion
|
||||
* is allowed, and this is done by the TRANSITION bit. If the TRANSITION
|
||||
* bit is already set, then it is considered a recursion and the function
|
||||
* ends. Otherwise, the TRANSITION bit is set, and that bit is returned.
|
||||
*
|
||||
* On the trace_recursive_unlock(), the TRANSITION bit will be the first
|
||||
* to be cleared. Even if it wasn't the context that set it. That is,
|
||||
* if an interrupt comes in while NORMAL bit is set and the ring buffer
|
||||
* is called before preempt_count() is updated, since the check will
|
||||
* be on the NORMAL bit, the TRANSITION bit will then be set. If an
|
||||
* NMI then comes in, it will set the NMI bit, but when the NMI code
|
||||
* does the trace_recursive_unlock() it will clear the TRANSTION bit
|
||||
* and leave the NMI bit set. But this is fine, because the interrupt
|
||||
* code that set the TRANSITION bit will then clear the NMI bit when it
|
||||
* calls trace_recursive_unlock(). If another NMI comes in, it will
|
||||
* set the TRANSITION bit and continue.
|
||||
*
|
||||
* Note: The TRANSITION bit only handles a single transition between context.
|
||||
*/
|
||||
|
||||
static __always_inline int
|
||||
@@ -3055,8 +3081,16 @@ trace_recursive_lock(struct ring_buffer_per_cpu *cpu_buffer)
|
||||
bit = pc & NMI_MASK ? RB_CTX_NMI :
|
||||
pc & HARDIRQ_MASK ? RB_CTX_IRQ : RB_CTX_SOFTIRQ;
|
||||
|
||||
if (unlikely(val & (1 << (bit + cpu_buffer->nest))))
|
||||
return 1;
|
||||
if (unlikely(val & (1 << (bit + cpu_buffer->nest)))) {
|
||||
/*
|
||||
* It is possible that this was called by transitioning
|
||||
* between interrupt context, and preempt_count() has not
|
||||
* been updated yet. In this case, use the TRANSITION bit.
|
||||
*/
|
||||
bit = RB_CTX_TRANSITION;
|
||||
if (val & (1 << (bit + cpu_buffer->nest)))
|
||||
return 1;
|
||||
}
|
||||
|
||||
val |= (1 << (bit + cpu_buffer->nest));
|
||||
cpu_buffer->current_context = val;
|
||||
@@ -3071,8 +3105,8 @@ trace_recursive_unlock(struct ring_buffer_per_cpu *cpu_buffer)
|
||||
cpu_buffer->current_context - (1 << cpu_buffer->nest);
|
||||
}
|
||||
|
||||
/* The recursive locking above uses 4 bits */
|
||||
#define NESTED_BITS 4
|
||||
/* The recursive locking above uses 5 bits */
|
||||
#define NESTED_BITS 5
|
||||
|
||||
/**
|
||||
* ring_buffer_nest_start - Allow to trace while nested
|
||||
|
||||
@@ -2750,7 +2750,7 @@ trace_event_buffer_lock_reserve(struct trace_buffer **current_rb,
|
||||
/*
|
||||
* If tracing is off, but we have triggers enabled
|
||||
* we still need to look at the event data. Use the temp_buffer
|
||||
* to store the trace event for the tigger to use. It's recusive
|
||||
* to store the trace event for the trigger to use. It's recursive
|
||||
* safe and will not be recorded anywhere.
|
||||
*/
|
||||
if (!entry && trace_file->flags & EVENT_FILE_FL_TRIGGER_COND) {
|
||||
@@ -2952,7 +2952,7 @@ static void __ftrace_trace_stack(struct trace_buffer *buffer,
|
||||
stackidx = __this_cpu_inc_return(ftrace_stack_reserve) - 1;
|
||||
|
||||
/* This should never happen. If it does, yell once and skip */
|
||||
if (WARN_ON_ONCE(stackidx > FTRACE_KSTACK_NESTING))
|
||||
if (WARN_ON_ONCE(stackidx >= FTRACE_KSTACK_NESTING))
|
||||
goto out;
|
||||
|
||||
/*
|
||||
@@ -3132,7 +3132,7 @@ static char *get_trace_buf(void)
|
||||
|
||||
/* Interrupts must see nesting incremented before we use the buffer */
|
||||
barrier();
|
||||
return &buffer->buffer[buffer->nesting][0];
|
||||
return &buffer->buffer[buffer->nesting - 1][0];
|
||||
}
|
||||
|
||||
static void put_trace_buf(void)
|
||||
|
||||
+23
-3
@@ -637,6 +637,12 @@ enum {
|
||||
* function is called to clear it.
|
||||
*/
|
||||
TRACE_GRAPH_NOTRACE_BIT,
|
||||
|
||||
/*
|
||||
* When transitioning between context, the preempt_count() may
|
||||
* not be correct. Allow for a single recursion to cover this case.
|
||||
*/
|
||||
TRACE_TRANSITION_BIT,
|
||||
};
|
||||
|
||||
#define trace_recursion_set(bit) do { (current)->trace_recursion |= (1<<(bit)); } while (0)
|
||||
@@ -691,14 +697,27 @@ static __always_inline int trace_test_and_set_recursion(int start, int max)
|
||||
return 0;
|
||||
|
||||
bit = trace_get_context_bit() + start;
|
||||
if (unlikely(val & (1 << bit)))
|
||||
return -1;
|
||||
if (unlikely(val & (1 << bit))) {
|
||||
/*
|
||||
* It could be that preempt_count has not been updated during
|
||||
* a switch between contexts. Allow for a single recursion.
|
||||
*/
|
||||
bit = TRACE_TRANSITION_BIT;
|
||||
if (trace_recursion_test(bit))
|
||||
return -1;
|
||||
trace_recursion_set(bit);
|
||||
barrier();
|
||||
return bit + 1;
|
||||
}
|
||||
|
||||
/* Normal check passed, clear the transition to allow it again */
|
||||
trace_recursion_clear(TRACE_TRANSITION_BIT);
|
||||
|
||||
val |= 1 << bit;
|
||||
current->trace_recursion = val;
|
||||
barrier();
|
||||
|
||||
return bit;
|
||||
return bit + 1;
|
||||
}
|
||||
|
||||
static __always_inline void trace_clear_recursion(int bit)
|
||||
@@ -708,6 +727,7 @@ static __always_inline void trace_clear_recursion(int bit)
|
||||
if (!bit)
|
||||
return;
|
||||
|
||||
bit--;
|
||||
bit = 1 << bit;
|
||||
val &= ~bit;
|
||||
|
||||
|
||||
@@ -584,7 +584,7 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
||||
{
|
||||
struct synth_field *field;
|
||||
const char *prefix = NULL, *field_type = argv[0], *field_name, *array;
|
||||
int len, ret = 0;
|
||||
int len, ret = -ENOMEM;
|
||||
struct seq_buf s;
|
||||
ssize_t size;
|
||||
|
||||
@@ -617,10 +617,9 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
||||
len--;
|
||||
|
||||
field->name = kmemdup_nul(field_name, len, GFP_KERNEL);
|
||||
if (!field->name) {
|
||||
ret = -ENOMEM;
|
||||
if (!field->name)
|
||||
goto free;
|
||||
}
|
||||
|
||||
if (!is_good_name(field->name)) {
|
||||
synth_err(SYNTH_ERR_BAD_NAME, errpos(field_name));
|
||||
ret = -EINVAL;
|
||||
@@ -638,10 +637,9 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
||||
len += strlen(prefix);
|
||||
|
||||
field->type = kzalloc(len, GFP_KERNEL);
|
||||
if (!field->type) {
|
||||
ret = -ENOMEM;
|
||||
if (!field->type)
|
||||
goto free;
|
||||
}
|
||||
|
||||
seq_buf_init(&s, field->type, len);
|
||||
if (prefix)
|
||||
seq_buf_puts(&s, prefix);
|
||||
@@ -653,6 +651,7 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
||||
}
|
||||
if (WARN_ON_ONCE(!seq_buf_buffer_left(&s)))
|
||||
goto free;
|
||||
|
||||
s.buffer[s.len] = '\0';
|
||||
|
||||
size = synth_field_size(field->type);
|
||||
@@ -666,10 +665,8 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,
|
||||
|
||||
len = sizeof("__data_loc ") + strlen(field->type) + 1;
|
||||
type = kzalloc(len, GFP_KERNEL);
|
||||
if (!type) {
|
||||
ret = -ENOMEM;
|
||||
if (!type)
|
||||
goto free;
|
||||
}
|
||||
|
||||
seq_buf_init(&s, type, len);
|
||||
seq_buf_puts(&s, "__data_loc ");
|
||||
|
||||
@@ -492,8 +492,13 @@ trace_selftest_function_recursion(void)
|
||||
unregister_ftrace_function(&test_rec_probe);
|
||||
|
||||
ret = -1;
|
||||
if (trace_selftest_recursion_cnt != 1) {
|
||||
pr_cont("*callback not called once (%d)* ",
|
||||
/*
|
||||
* Recursion allows for transitions between context,
|
||||
* and may call the callback twice.
|
||||
*/
|
||||
if (trace_selftest_recursion_cnt != 1 &&
|
||||
trace_selftest_recursion_cnt != 2) {
|
||||
pr_cont("*callback not called once (or twice) (%d)* ",
|
||||
trace_selftest_recursion_cnt);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -66,7 +66,6 @@ def isolate_kunit_output(kernel_output):
|
||||
def raw_output(kernel_output):
|
||||
for line in kernel_output:
|
||||
print(line)
|
||||
yield line
|
||||
|
||||
DIVIDER = '=' * 60
|
||||
|
||||
@@ -242,7 +241,7 @@ def parse_test_suite(lines: List[str], expected_suite_index: int) -> TestSuite:
|
||||
return None
|
||||
test_suite.name = name
|
||||
expected_test_case_num = parse_subtest_plan(lines)
|
||||
if not expected_test_case_num:
|
||||
if expected_test_case_num is None:
|
||||
return None
|
||||
while expected_test_case_num > 0:
|
||||
test_case = parse_test_case(lines)
|
||||
|
||||
@@ -179,7 +179,7 @@ class KUnitParserTest(unittest.TestCase):
|
||||
print_mock = mock.patch('builtins.print').start()
|
||||
result = kunit_parser.parse_run_tests(
|
||||
kunit_parser.isolate_kunit_output(file.readlines()))
|
||||
print_mock.assert_any_call(StrContains("no kunit output detected"))
|
||||
print_mock.assert_any_call(StrContains('no tests run!'))
|
||||
print_mock.stop()
|
||||
file.close()
|
||||
|
||||
@@ -198,39 +198,57 @@ class KUnitParserTest(unittest.TestCase):
|
||||
'test_data/test_config_printk_time.log')
|
||||
with open(prefix_log) as file:
|
||||
result = kunit_parser.parse_run_tests(file.readlines())
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
self.assertEqual(
|
||||
kunit_parser.TestStatus.SUCCESS,
|
||||
result.status)
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
|
||||
def test_ignores_multiple_prefixes(self):
|
||||
prefix_log = get_absolute_path(
|
||||
'test_data/test_multiple_prefixes.log')
|
||||
with open(prefix_log) as file:
|
||||
result = kunit_parser.parse_run_tests(file.readlines())
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
self.assertEqual(
|
||||
kunit_parser.TestStatus.SUCCESS,
|
||||
result.status)
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
|
||||
def test_prefix_mixed_kernel_output(self):
|
||||
mixed_prefix_log = get_absolute_path(
|
||||
'test_data/test_interrupted_tap_output.log')
|
||||
with open(mixed_prefix_log) as file:
|
||||
result = kunit_parser.parse_run_tests(file.readlines())
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
self.assertEqual(
|
||||
kunit_parser.TestStatus.SUCCESS,
|
||||
result.status)
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
|
||||
def test_prefix_poundsign(self):
|
||||
pound_log = get_absolute_path('test_data/test_pound_sign.log')
|
||||
with open(pound_log) as file:
|
||||
result = kunit_parser.parse_run_tests(file.readlines())
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
self.assertEqual(
|
||||
kunit_parser.TestStatus.SUCCESS,
|
||||
result.status)
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
|
||||
def test_kernel_panic_end(self):
|
||||
panic_log = get_absolute_path('test_data/test_kernel_panic_interrupt.log')
|
||||
with open(panic_log) as file:
|
||||
result = kunit_parser.parse_run_tests(file.readlines())
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
self.assertEqual(
|
||||
kunit_parser.TestStatus.TEST_CRASHED,
|
||||
result.status)
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
|
||||
def test_pound_no_prefix(self):
|
||||
pound_log = get_absolute_path('test_data/test_pound_no_prefix.log')
|
||||
with open(pound_log) as file:
|
||||
result = kunit_parser.parse_run_tests(file.readlines())
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
self.assertEqual(
|
||||
kunit_parser.TestStatus.SUCCESS,
|
||||
result.status)
|
||||
self.assertEqual('kunit-resource-test', result.suites[0].name)
|
||||
|
||||
class KUnitJsonTest(unittest.TestCase):
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
[ 0.060000] printk: console [mc-1] enabled
|
||||
[ 0.060000] random: get_random_bytes called from init_oops_id+0x35/0x40 with crng_init=0
|
||||
[ 0.060000] TAP version 14
|
||||
[ 0.060000] 1..3
|
||||
[ 0.060000] # Subtest: kunit-resource-test
|
||||
[ 0.060000] 1..5
|
||||
[ 0.060000] ok 1 - kunit_resource_test_init_resources
|
||||
@@ -28,4 +29,4 @@
|
||||
[ 0.060000] Stack:
|
||||
[ 0.060000] 602086f8 601bc260 705c0000 705c0000
|
||||
[ 0.060000] 602086f8 6005fcec 705c0000 6002c6ab
|
||||
[ 0.060000] 6005fcec 601bc260 705c0000 3000000010
|
||||
[ 0.060000] 6005fcec 601bc260 705c0000 3000000010
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
[ 0.060000] printk: console [mc-1] enabled
|
||||
[ 0.060000] random: get_random_bytes called from init_oops_id+0x35/0x40 with crng_init=0
|
||||
[ 0.060000] TAP version 14
|
||||
[ 0.060000] 1..3
|
||||
[ 0.060000] # Subtest: kunit-resource-test
|
||||
[ 0.060000] 1..5
|
||||
[ 0.060000] ok 1 - kunit_resource_test_init_resources
|
||||
@@ -34,4 +35,4 @@
|
||||
[ 0.060000] Stack:
|
||||
[ 0.060000] 602086f8 601bc260 705c0000 705c0000
|
||||
[ 0.060000] 602086f8 6005fcec 705c0000 6002c6ab
|
||||
[ 0.060000] 6005fcec 601bc260 705c0000 3000000010
|
||||
[ 0.060000] 6005fcec 601bc260 705c0000 3000000010
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
[ 0.060000] printk: console [mc-1] enabled
|
||||
[ 0.060000] random: get_random_bytes called from init_oops_id+0x35/0x40 with crng_init=0
|
||||
[ 0.060000] TAP version 14
|
||||
[ 0.060000] 1..3
|
||||
[ 0.060000] # Subtest: kunit-resource-test
|
||||
[ 0.060000] 1..5
|
||||
[ 0.060000] ok 1 - kunit_resource_test_init_resources
|
||||
@@ -22,4 +23,4 @@
|
||||
[ 0.060000] Stack:
|
||||
[ 0.060000] 602086f8 601bc260 705c0000 705c0000
|
||||
[ 0.060000] 602086f8 6005fcec 705c0000 6002c6ab
|
||||
[ 0.060000] 6005fcec 601bc260 705c0000 3000000010
|
||||
[ 0.060000] 6005fcec 601bc260 705c0000 3000000010
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
[ 0.060000][ T1] printk: console [mc-1] enabled
|
||||
[ 0.060000][ T1] random: get_random_bytes called from init_oops_id+0x35/0x40 with crng_init=0
|
||||
[ 0.060000][ T1] TAP version 14
|
||||
[ 0.060000][ T1] 1..3
|
||||
[ 0.060000][ T1] # Subtest: kunit-resource-test
|
||||
[ 0.060000][ T1] 1..5
|
||||
[ 0.060000][ T1] ok 1 - kunit_resource_test_init_resources
|
||||
@@ -28,4 +29,4 @@
|
||||
[ 0.060000][ T1] Stack:
|
||||
[ 0.060000][ T1] 602086f8 601bc260 705c0000 705c0000
|
||||
[ 0.060000][ T1] 602086f8 6005fcec 705c0000 6002c6ab
|
||||
[ 0.060000][ T1] 6005fcec 601bc260 705c0000 3000000010
|
||||
[ 0.060000][ T1] 6005fcec 601bc260 705c0000 3000000010
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
printk: console [mc-1] enabled
|
||||
random: get_random_bytes called from init_oops_id+0x35/0x40 with crng_init=0
|
||||
TAP version 14
|
||||
1..3
|
||||
# Subtest: kunit-resource-test
|
||||
1..5
|
||||
ok 1 - kunit_resource_test_init_resources
|
||||
@@ -30,4 +31,4 @@
|
||||
Stack:
|
||||
602086f8 601bc260 705c0000 705c0000
|
||||
602086f8 6005fcec 705c0000 6002c6ab
|
||||
6005fcec 601bc260 705c0000 3000000010
|
||||
6005fcec 601bc260 705c0000 3000000010
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
[ 0.060000] printk: console [mc-1] enabled
|
||||
[ 0.060000] random: get_random_bytes called from init_oops_id+0x35/0x40 with crng_init=0
|
||||
[ 0.060000] TAP version 14
|
||||
[ 0.060000] 1..3
|
||||
[ 0.060000] # Subtest: kunit-resource-test
|
||||
[ 0.060000] 1..5
|
||||
[ 0.060000] ok 1 - kunit_resource_test_init_resources
|
||||
|
||||
Reference in New Issue
Block a user