Merge d2d0b95ca1 ("block: Remove special-casing of compound pages") into android-mainline
Steps on the way to 4.19.307 Change-Id: Ia57840d96d36c5c4a67be2f7c69807e449728406 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -127,10 +127,10 @@ static unsigned long f_extend(unsigned long address)
|
|||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
if(unlikely(parisc_narrow_firmware)) {
|
if(unlikely(parisc_narrow_firmware)) {
|
||||||
if((address & 0xff000000) == 0xf0000000)
|
if((address & 0xff000000) == 0xf0000000)
|
||||||
return 0xf0f0f0f000000000UL | (u32)address;
|
return (0xfffffff0UL << 32) | (u32)address;
|
||||||
|
|
||||||
if((address & 0xf0000000) == 0xf0000000)
|
if((address & 0xf0000000) == 0xf0000000)
|
||||||
return 0xffffffff00000000UL | (u32)address;
|
return (0xffffffffUL << 32) | (u32)address;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return address;
|
return address;
|
||||||
|
|||||||
@@ -1596,8 +1596,7 @@ void bio_set_pages_dirty(struct bio *bio)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
bio_for_each_segment_all(bvec, bio, i) {
|
bio_for_each_segment_all(bvec, bio, i) {
|
||||||
if (!PageCompound(bvec->bv_page))
|
set_page_dirty_lock(bvec->bv_page);
|
||||||
set_page_dirty_lock(bvec->bv_page);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(bio_set_pages_dirty);
|
EXPORT_SYMBOL_GPL(bio_set_pages_dirty);
|
||||||
@@ -1656,7 +1655,7 @@ void bio_check_pages_dirty(struct bio *bio)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
bio_for_each_segment_all(bvec, bio, i) {
|
bio_for_each_segment_all(bvec, bio, i) {
|
||||||
if (!PageDirty(bvec->bv_page) && !PageCompound(bvec->bv_page))
|
if (!PageDirty(bvec->bv_page))
|
||||||
goto defer;
|
goto defer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -231,6 +231,7 @@ static struct crypto_larval *__crypto_register_alg(struct crypto_alg *alg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!strcmp(q->cra_driver_name, alg->cra_name) ||
|
if (!strcmp(q->cra_driver_name, alg->cra_name) ||
|
||||||
|
!strcmp(q->cra_driver_name, alg->cra_driver_name) ||
|
||||||
!strcmp(q->cra_name, alg->cra_driver_name))
|
!strcmp(q->cra_name, alg->cra_driver_name))
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3779,6 +3779,48 @@ define_dev_printk_level(_dev_info, KERN_INFO);
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dev_err_probe - probe error check and log helper
|
||||||
|
* @dev: the pointer to the struct device
|
||||||
|
* @err: error value to test
|
||||||
|
* @fmt: printf-style format string
|
||||||
|
* @...: arguments as specified in the format string
|
||||||
|
*
|
||||||
|
* This helper implements common pattern present in probe functions for error
|
||||||
|
* checking: print debug or error message depending if the error value is
|
||||||
|
* -EPROBE_DEFER and propagate error upwards.
|
||||||
|
* It replaces code sequence:
|
||||||
|
* if (err != -EPROBE_DEFER)
|
||||||
|
* dev_err(dev, ...);
|
||||||
|
* else
|
||||||
|
* dev_dbg(dev, ...);
|
||||||
|
* return err;
|
||||||
|
* with
|
||||||
|
* return dev_err_probe(dev, err, ...);
|
||||||
|
*
|
||||||
|
* Returns @err.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int dev_err_probe(const struct device *dev, int err, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
struct va_format vaf;
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
va_start(args, fmt);
|
||||||
|
vaf.fmt = fmt;
|
||||||
|
vaf.va = &args;
|
||||||
|
|
||||||
|
if (err != -EPROBE_DEFER)
|
||||||
|
dev_err(dev, "error %d: %pV", err, &vaf);
|
||||||
|
else
|
||||||
|
dev_dbg(dev, "error %d: %pV", err, &vaf);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dev_err_probe);
|
||||||
|
|
||||||
static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)
|
static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)
|
||||||
{
|
{
|
||||||
return fwnode && !IS_ERR(fwnode->secondary);
|
return fwnode && !IS_ERR(fwnode->secondary);
|
||||||
|
|||||||
@@ -24,10 +24,13 @@
|
|||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/string.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
#define RNG_MODULE_NAME "hw_random"
|
#define RNG_MODULE_NAME "hw_random"
|
||||||
|
|
||||||
|
#define RNG_BUFFER_SIZE (SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES)
|
||||||
|
|
||||||
static struct hwrng *current_rng;
|
static struct hwrng *current_rng;
|
||||||
/* the current rng has been explicitly chosen by user via sysfs */
|
/* the current rng has been explicitly chosen by user via sysfs */
|
||||||
static int cur_rng_set_by_user;
|
static int cur_rng_set_by_user;
|
||||||
@@ -59,7 +62,7 @@ static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
|
|||||||
|
|
||||||
static size_t rng_buffer_size(void)
|
static size_t rng_buffer_size(void)
|
||||||
{
|
{
|
||||||
return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES;
|
return RNG_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_early_randomness(struct hwrng *rng)
|
static void add_early_randomness(struct hwrng *rng)
|
||||||
@@ -202,6 +205,7 @@ static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
|
|||||||
static ssize_t rng_dev_read(struct file *filp, char __user *buf,
|
static ssize_t rng_dev_read(struct file *filp, char __user *buf,
|
||||||
size_t size, loff_t *offp)
|
size_t size, loff_t *offp)
|
||||||
{
|
{
|
||||||
|
u8 buffer[RNG_BUFFER_SIZE];
|
||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
int bytes_read, len;
|
int bytes_read, len;
|
||||||
@@ -229,34 +233,37 @@ static ssize_t rng_dev_read(struct file *filp, char __user *buf,
|
|||||||
if (bytes_read < 0) {
|
if (bytes_read < 0) {
|
||||||
err = bytes_read;
|
err = bytes_read;
|
||||||
goto out_unlock_reading;
|
goto out_unlock_reading;
|
||||||
}
|
} else if (bytes_read == 0 &&
|
||||||
data_avail = bytes_read;
|
(filp->f_flags & O_NONBLOCK)) {
|
||||||
}
|
|
||||||
|
|
||||||
if (!data_avail) {
|
|
||||||
if (filp->f_flags & O_NONBLOCK) {
|
|
||||||
err = -EAGAIN;
|
err = -EAGAIN;
|
||||||
goto out_unlock_reading;
|
goto out_unlock_reading;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
len = data_avail;
|
data_avail = bytes_read;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = data_avail;
|
||||||
|
if (len) {
|
||||||
if (len > size)
|
if (len > size)
|
||||||
len = size;
|
len = size;
|
||||||
|
|
||||||
data_avail -= len;
|
data_avail -= len;
|
||||||
|
|
||||||
if (copy_to_user(buf + ret, rng_buffer + data_avail,
|
memcpy(buffer, rng_buffer + data_avail, len);
|
||||||
len)) {
|
}
|
||||||
|
mutex_unlock(&reading_mutex);
|
||||||
|
put_rng(rng);
|
||||||
|
|
||||||
|
if (len) {
|
||||||
|
if (copy_to_user(buf + ret, buffer, len)) {
|
||||||
err = -EFAULT;
|
err = -EFAULT;
|
||||||
goto out_unlock_reading;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
size -= len;
|
size -= len;
|
||||||
ret += len;
|
ret += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&reading_mutex);
|
|
||||||
put_rng(rng);
|
|
||||||
|
|
||||||
if (need_resched())
|
if (need_resched())
|
||||||
schedule_timeout_interruptible(1);
|
schedule_timeout_interruptible(1);
|
||||||
@@ -267,6 +274,7 @@ static ssize_t rng_dev_read(struct file *filp, char __user *buf,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
memzero_explicit(buffer, sizeof(buffer));
|
||||||
return ret ? : err;
|
return ret ? : err;
|
||||||
|
|
||||||
out_unlock_reading:
|
out_unlock_reading:
|
||||||
|
|||||||
@@ -107,6 +107,9 @@ nouveau_vma_new(struct nouveau_bo *nvbo, struct nouveau_vmm *vmm,
|
|||||||
} else {
|
} else {
|
||||||
ret = nvif_vmm_get(&vmm->vmm, PTES, false, mem->mem.page, 0,
|
ret = nvif_vmm_get(&vmm->vmm, PTES, false, mem->mem.page, 0,
|
||||||
mem->mem.size, &tmp);
|
mem->mem.size, &tmp);
|
||||||
|
if (ret)
|
||||||
|
goto done;
|
||||||
|
|
||||||
vma->addr = tmp.addr;
|
vma->addr = tmp.addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -605,14 +605,20 @@ static void mtk_pcie_intr_handler(struct irq_desc *desc)
|
|||||||
if (status & MSI_STATUS){
|
if (status & MSI_STATUS){
|
||||||
unsigned long imsi_status;
|
unsigned long imsi_status;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The interrupt status can be cleared even if the
|
||||||
|
* MSI status remains pending. As such, given the
|
||||||
|
* edge-triggered interrupt type, its status should
|
||||||
|
* be cleared before being dispatched to the
|
||||||
|
* handler of the underlying device.
|
||||||
|
*/
|
||||||
|
writel(MSI_STATUS, port->base + PCIE_INT_STATUS);
|
||||||
while ((imsi_status = readl(port->base + PCIE_IMSI_STATUS))) {
|
while ((imsi_status = readl(port->base + PCIE_IMSI_STATUS))) {
|
||||||
for_each_set_bit(bit, &imsi_status, MTK_MSI_IRQS_NUM) {
|
for_each_set_bit(bit, &imsi_status, MTK_MSI_IRQS_NUM) {
|
||||||
virq = irq_find_mapping(port->inner_domain, bit);
|
virq = irq_find_mapping(port->inner_domain, bit);
|
||||||
generic_handle_irq(virq);
|
generic_handle_irq(virq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Clear MSI interrupt status */
|
|
||||||
writel(MSI_STATUS, port->base + PCIE_INT_STATUS);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -381,6 +381,7 @@ static void virtio_rpmsg_release_device(struct device *dev)
|
|||||||
struct rpmsg_device *rpdev = to_rpmsg_device(dev);
|
struct rpmsg_device *rpdev = to_rpmsg_device(dev);
|
||||||
struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev);
|
struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev);
|
||||||
|
|
||||||
|
kfree(rpdev->driver_override);
|
||||||
kfree(vch);
|
kfree(vch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include <linux/tty_flip.h>
|
#include <linux/tty_flip.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/units.h>
|
||||||
#include <uapi/linux/sched/types.h>
|
#include <uapi/linux/sched/types.h>
|
||||||
|
|
||||||
#define SC16IS7XX_NAME "sc16is7xx"
|
#define SC16IS7XX_NAME "sc16is7xx"
|
||||||
@@ -1406,9 +1407,12 @@ static int sc16is7xx_spi_probe(struct spi_device *spi)
|
|||||||
|
|
||||||
/* Setup SPI bus */
|
/* Setup SPI bus */
|
||||||
spi->bits_per_word = 8;
|
spi->bits_per_word = 8;
|
||||||
/* only supports mode 0 on SC16IS762 */
|
/* For all variants, only mode 0 is supported */
|
||||||
|
if ((spi->mode & SPI_MODE_X_MASK) != SPI_MODE_0)
|
||||||
|
return dev_err_probe(&spi->dev, -EINVAL, "Unsupported SPI mode\n");
|
||||||
|
|
||||||
spi->mode = spi->mode ? : SPI_MODE_0;
|
spi->mode = spi->mode ? : SPI_MODE_0;
|
||||||
spi->max_speed_hz = spi->max_speed_hz ? : 15000000;
|
spi->max_speed_hz = spi->max_speed_hz ? : 4 * HZ_PER_MHZ;
|
||||||
ret = spi_setup(spi);
|
ret = spi_setup(spi);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -5192,11 +5192,16 @@ __acquires(bitlock)
|
|||||||
static ext4_grpblk_t ext4_last_grp_cluster(struct super_block *sb,
|
static ext4_grpblk_t ext4_last_grp_cluster(struct super_block *sb,
|
||||||
ext4_group_t grp)
|
ext4_group_t grp)
|
||||||
{
|
{
|
||||||
if (grp < ext4_get_groups_count(sb))
|
unsigned long nr_clusters_in_group;
|
||||||
return EXT4_CLUSTERS_PER_GROUP(sb) - 1;
|
|
||||||
return (ext4_blocks_count(EXT4_SB(sb)->s_es) -
|
if (grp < (ext4_get_groups_count(sb) - 1))
|
||||||
ext4_group_first_block_no(sb, grp) - 1) >>
|
nr_clusters_in_group = EXT4_CLUSTERS_PER_GROUP(sb);
|
||||||
EXT4_CLUSTER_BITS(sb);
|
else
|
||||||
|
nr_clusters_in_group = (ext4_blocks_count(EXT4_SB(sb)->s_es) -
|
||||||
|
ext4_group_first_block_no(sb, grp))
|
||||||
|
>> EXT4_CLUSTER_BITS(sb);
|
||||||
|
|
||||||
|
return nr_clusters_in_group - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ext4_trim_interrupted(void)
|
static bool ext4_trim_interrupted(void)
|
||||||
|
|||||||
@@ -1674,6 +1674,9 @@ do { \
|
|||||||
WARN_ONCE(condition, "%s %s: " format, \
|
WARN_ONCE(condition, "%s %s: " format, \
|
||||||
dev_driver_string(dev), dev_name(dev), ## arg)
|
dev_driver_string(dev), dev_name(dev), ## arg)
|
||||||
|
|
||||||
|
extern __printf(3, 4)
|
||||||
|
int dev_err_probe(const struct device *dev, int err, const char *fmt, ...);
|
||||||
|
|
||||||
/* Create alias, so I can be autoloaded. */
|
/* Create alias, so I can be autoloaded. */
|
||||||
#define MODULE_ALIAS_CHARDEV(major,minor) \
|
#define MODULE_ALIAS_CHARDEV(major,minor) \
|
||||||
MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor))
|
MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor))
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ struct spi_device {
|
|||||||
#define SPI_MODE_1 (0|SPI_CPHA)
|
#define SPI_MODE_1 (0|SPI_CPHA)
|
||||||
#define SPI_MODE_2 (SPI_CPOL|0)
|
#define SPI_MODE_2 (SPI_CPOL|0)
|
||||||
#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
|
#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
|
||||||
|
#define SPI_MODE_X_MASK (SPI_CPOL|SPI_CPHA)
|
||||||
#define SPI_CS_HIGH 0x04 /* chipselect active high? */
|
#define SPI_CS_HIGH 0x04 /* chipselect active high? */
|
||||||
#define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */
|
#define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */
|
||||||
#define SPI_3WIRE 0x10 /* SI/SO signals shared */
|
#define SPI_3WIRE 0x10 /* SI/SO signals shared */
|
||||||
|
|||||||
92
include/linux/units.h
Normal file
92
include/linux/units.h
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef _LINUX_UNITS_H
|
||||||
|
#define _LINUX_UNITS_H
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
|
||||||
|
#define HZ_PER_KHZ 1000UL
|
||||||
|
#define KHZ_PER_MHZ 1000UL
|
||||||
|
#define HZ_PER_MHZ 1000000UL
|
||||||
|
|
||||||
|
#define MILLIWATT_PER_WATT 1000UL
|
||||||
|
#define MICROWATT_PER_MILLIWATT 1000UL
|
||||||
|
#define MICROWATT_PER_WATT 1000000UL
|
||||||
|
|
||||||
|
#define ABSOLUTE_ZERO_MILLICELSIUS -273150
|
||||||
|
|
||||||
|
static inline long milli_kelvin_to_millicelsius(long t)
|
||||||
|
{
|
||||||
|
return t + ABSOLUTE_ZERO_MILLICELSIUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long millicelsius_to_milli_kelvin(long t)
|
||||||
|
{
|
||||||
|
return t - ABSOLUTE_ZERO_MILLICELSIUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MILLIDEGREE_PER_DEGREE 1000
|
||||||
|
#define MILLIDEGREE_PER_DECIDEGREE 100
|
||||||
|
|
||||||
|
static inline long kelvin_to_millicelsius(long t)
|
||||||
|
{
|
||||||
|
return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DEGREE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long millicelsius_to_kelvin(long t)
|
||||||
|
{
|
||||||
|
t = millicelsius_to_milli_kelvin(t);
|
||||||
|
|
||||||
|
return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long deci_kelvin_to_celsius(long t)
|
||||||
|
{
|
||||||
|
t = milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE);
|
||||||
|
|
||||||
|
return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long celsius_to_deci_kelvin(long t)
|
||||||
|
{
|
||||||
|
t = millicelsius_to_milli_kelvin(t * MILLIDEGREE_PER_DEGREE);
|
||||||
|
|
||||||
|
return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* deci_kelvin_to_millicelsius_with_offset - convert Kelvin to Celsius
|
||||||
|
* @t: temperature value in decidegrees Kelvin
|
||||||
|
* @offset: difference between Kelvin and Celsius in millidegrees
|
||||||
|
*
|
||||||
|
* Return: temperature value in millidegrees Celsius
|
||||||
|
*/
|
||||||
|
static inline long deci_kelvin_to_millicelsius_with_offset(long t, long offset)
|
||||||
|
{
|
||||||
|
return t * MILLIDEGREE_PER_DECIDEGREE - offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long deci_kelvin_to_millicelsius(long t)
|
||||||
|
{
|
||||||
|
return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long millicelsius_to_deci_kelvin(long t)
|
||||||
|
{
|
||||||
|
t = millicelsius_to_milli_kelvin(t);
|
||||||
|
|
||||||
|
return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long kelvin_to_celsius(long t)
|
||||||
|
{
|
||||||
|
return t + DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS,
|
||||||
|
MILLIDEGREE_PER_DEGREE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long celsius_to_kelvin(long t)
|
||||||
|
{
|
||||||
|
return t - DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS,
|
||||||
|
MILLIDEGREE_PER_DEGREE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _LINUX_UNITS_H */
|
||||||
@@ -596,11 +596,11 @@ static int crc32_threadfn(void *data)
|
|||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
wait_event(d->go, atomic_read(&d->ready) ||
|
wait_event(d->go, atomic_read_acquire(&d->ready) ||
|
||||||
kthread_should_stop());
|
kthread_should_stop());
|
||||||
if (kthread_should_stop()) {
|
if (kthread_should_stop()) {
|
||||||
d->thr = NULL;
|
d->thr = NULL;
|
||||||
atomic_set(&d->stop, 1);
|
atomic_set_release(&d->stop, 1);
|
||||||
wake_up(&d->done);
|
wake_up(&d->done);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -609,7 +609,7 @@ static int crc32_threadfn(void *data)
|
|||||||
for (i = 0; i < d->run_threads; i++)
|
for (i = 0; i < d->run_threads; i++)
|
||||||
*d->crc32 = crc32_le(*d->crc32,
|
*d->crc32 = crc32_le(*d->crc32,
|
||||||
d->unc[i], *d->unc_len[i]);
|
d->unc[i], *d->unc_len[i]);
|
||||||
atomic_set(&d->stop, 1);
|
atomic_set_release(&d->stop, 1);
|
||||||
wake_up(&d->done);
|
wake_up(&d->done);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -639,12 +639,12 @@ static int lzo_compress_threadfn(void *data)
|
|||||||
struct cmp_data *d = data;
|
struct cmp_data *d = data;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
wait_event(d->go, atomic_read(&d->ready) ||
|
wait_event(d->go, atomic_read_acquire(&d->ready) ||
|
||||||
kthread_should_stop());
|
kthread_should_stop());
|
||||||
if (kthread_should_stop()) {
|
if (kthread_should_stop()) {
|
||||||
d->thr = NULL;
|
d->thr = NULL;
|
||||||
d->ret = -1;
|
d->ret = -1;
|
||||||
atomic_set(&d->stop, 1);
|
atomic_set_release(&d->stop, 1);
|
||||||
wake_up(&d->done);
|
wake_up(&d->done);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -653,7 +653,7 @@ static int lzo_compress_threadfn(void *data)
|
|||||||
d->ret = lzo1x_1_compress(d->unc, d->unc_len,
|
d->ret = lzo1x_1_compress(d->unc, d->unc_len,
|
||||||
d->cmp + LZO_HEADER, &d->cmp_len,
|
d->cmp + LZO_HEADER, &d->cmp_len,
|
||||||
d->wrk);
|
d->wrk);
|
||||||
atomic_set(&d->stop, 1);
|
atomic_set_release(&d->stop, 1);
|
||||||
wake_up(&d->done);
|
wake_up(&d->done);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -791,7 +791,7 @@ static int save_image_lzo(struct swap_map_handle *handle,
|
|||||||
|
|
||||||
data[thr].unc_len = off;
|
data[thr].unc_len = off;
|
||||||
|
|
||||||
atomic_set(&data[thr].ready, 1);
|
atomic_set_release(&data[thr].ready, 1);
|
||||||
wake_up(&data[thr].go);
|
wake_up(&data[thr].go);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -799,12 +799,12 @@ static int save_image_lzo(struct swap_map_handle *handle,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
crc->run_threads = thr;
|
crc->run_threads = thr;
|
||||||
atomic_set(&crc->ready, 1);
|
atomic_set_release(&crc->ready, 1);
|
||||||
wake_up(&crc->go);
|
wake_up(&crc->go);
|
||||||
|
|
||||||
for (run_threads = thr, thr = 0; thr < run_threads; thr++) {
|
for (run_threads = thr, thr = 0; thr < run_threads; thr++) {
|
||||||
wait_event(data[thr].done,
|
wait_event(data[thr].done,
|
||||||
atomic_read(&data[thr].stop));
|
atomic_read_acquire(&data[thr].stop));
|
||||||
atomic_set(&data[thr].stop, 0);
|
atomic_set(&data[thr].stop, 0);
|
||||||
|
|
||||||
ret = data[thr].ret;
|
ret = data[thr].ret;
|
||||||
@@ -843,7 +843,7 @@ static int save_image_lzo(struct swap_map_handle *handle,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wait_event(crc->done, atomic_read(&crc->stop));
|
wait_event(crc->done, atomic_read_acquire(&crc->stop));
|
||||||
atomic_set(&crc->stop, 0);
|
atomic_set(&crc->stop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1124,12 +1124,12 @@ static int lzo_decompress_threadfn(void *data)
|
|||||||
struct dec_data *d = data;
|
struct dec_data *d = data;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
wait_event(d->go, atomic_read(&d->ready) ||
|
wait_event(d->go, atomic_read_acquire(&d->ready) ||
|
||||||
kthread_should_stop());
|
kthread_should_stop());
|
||||||
if (kthread_should_stop()) {
|
if (kthread_should_stop()) {
|
||||||
d->thr = NULL;
|
d->thr = NULL;
|
||||||
d->ret = -1;
|
d->ret = -1;
|
||||||
atomic_set(&d->stop, 1);
|
atomic_set_release(&d->stop, 1);
|
||||||
wake_up(&d->done);
|
wake_up(&d->done);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1142,7 +1142,7 @@ static int lzo_decompress_threadfn(void *data)
|
|||||||
flush_icache_range((unsigned long)d->unc,
|
flush_icache_range((unsigned long)d->unc,
|
||||||
(unsigned long)d->unc + d->unc_len);
|
(unsigned long)d->unc + d->unc_len);
|
||||||
|
|
||||||
atomic_set(&d->stop, 1);
|
atomic_set_release(&d->stop, 1);
|
||||||
wake_up(&d->done);
|
wake_up(&d->done);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1330,7 +1330,7 @@ static int load_image_lzo(struct swap_map_handle *handle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (crc->run_threads) {
|
if (crc->run_threads) {
|
||||||
wait_event(crc->done, atomic_read(&crc->stop));
|
wait_event(crc->done, atomic_read_acquire(&crc->stop));
|
||||||
atomic_set(&crc->stop, 0);
|
atomic_set(&crc->stop, 0);
|
||||||
crc->run_threads = 0;
|
crc->run_threads = 0;
|
||||||
}
|
}
|
||||||
@@ -1366,7 +1366,7 @@ static int load_image_lzo(struct swap_map_handle *handle,
|
|||||||
pg = 0;
|
pg = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_set(&data[thr].ready, 1);
|
atomic_set_release(&data[thr].ready, 1);
|
||||||
wake_up(&data[thr].go);
|
wake_up(&data[thr].go);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1385,7 +1385,7 @@ static int load_image_lzo(struct swap_map_handle *handle,
|
|||||||
|
|
||||||
for (run_threads = thr, thr = 0; thr < run_threads; thr++) {
|
for (run_threads = thr, thr = 0; thr < run_threads; thr++) {
|
||||||
wait_event(data[thr].done,
|
wait_event(data[thr].done,
|
||||||
atomic_read(&data[thr].stop));
|
atomic_read_acquire(&data[thr].stop));
|
||||||
atomic_set(&data[thr].stop, 0);
|
atomic_set(&data[thr].stop, 0);
|
||||||
|
|
||||||
ret = data[thr].ret;
|
ret = data[thr].ret;
|
||||||
@@ -1416,7 +1416,7 @@ static int load_image_lzo(struct swap_map_handle *handle,
|
|||||||
ret = snapshot_write_next(snapshot);
|
ret = snapshot_write_next(snapshot);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
crc->run_threads = thr + 1;
|
crc->run_threads = thr + 1;
|
||||||
atomic_set(&crc->ready, 1);
|
atomic_set_release(&crc->ready, 1);
|
||||||
wake_up(&crc->go);
|
wake_up(&crc->go);
|
||||||
goto out_finish;
|
goto out_finish;
|
||||||
}
|
}
|
||||||
@@ -1424,13 +1424,13 @@ static int load_image_lzo(struct swap_map_handle *handle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
crc->run_threads = thr;
|
crc->run_threads = thr;
|
||||||
atomic_set(&crc->ready, 1);
|
atomic_set_release(&crc->ready, 1);
|
||||||
wake_up(&crc->go);
|
wake_up(&crc->go);
|
||||||
}
|
}
|
||||||
|
|
||||||
out_finish:
|
out_finish:
|
||||||
if (crc->run_threads) {
|
if (crc->run_threads) {
|
||||||
wait_event(crc->done, atomic_read(&crc->stop));
|
wait_event(crc->done, atomic_read_acquire(&crc->stop));
|
||||||
atomic_set(&crc->stop, 0);
|
atomic_set(&crc->stop, 0);
|
||||||
}
|
}
|
||||||
stop = ktime_get();
|
stop = ktime_get();
|
||||||
|
|||||||
Reference in New Issue
Block a user