mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 15:39:42 -04:00
Merge 6.3-rc5 into driver-core-next
We need the fixes in here for testing, as well as the driver core changes for documentation updates to build on. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -31,6 +31,7 @@ MODULE_PARM_DESC(iterations,
|
||||
|
||||
static void dhry_benchmark(void)
|
||||
{
|
||||
unsigned int cpu = get_cpu();
|
||||
int i, n;
|
||||
|
||||
if (iterations > 0) {
|
||||
@@ -45,9 +46,10 @@ static void dhry_benchmark(void)
|
||||
}
|
||||
|
||||
report:
|
||||
put_cpu();
|
||||
if (n >= 0)
|
||||
pr_info("CPU%u: Dhrystones per Second: %d (%d DMIPS)\n",
|
||||
smp_processor_id(), n, n / DHRY_VAX);
|
||||
pr_info("CPU%u: Dhrystones per Second: %d (%d DMIPS)\n", cpu,
|
||||
n, n / DHRY_VAX);
|
||||
else if (n == -EAGAIN)
|
||||
pr_err("Please increase the number of iterations\n");
|
||||
else
|
||||
|
||||
@@ -182,6 +182,15 @@ unsigned long _find_next_andnot_bit(const unsigned long *addr1, const unsigned l
|
||||
EXPORT_SYMBOL(_find_next_andnot_bit);
|
||||
#endif
|
||||
|
||||
#ifndef find_next_or_bit
|
||||
unsigned long _find_next_or_bit(const unsigned long *addr1, const unsigned long *addr2,
|
||||
unsigned long nbits, unsigned long start)
|
||||
{
|
||||
return FIND_NEXT_BIT(addr1[idx] | addr2[idx], /* nop */, nbits, start);
|
||||
}
|
||||
EXPORT_SYMBOL(_find_next_or_bit);
|
||||
#endif
|
||||
|
||||
#ifndef find_next_zero_bit
|
||||
unsigned long _find_next_zero_bit(const unsigned long *addr, unsigned long nbits,
|
||||
unsigned long start)
|
||||
|
||||
@@ -5099,35 +5099,21 @@ static inline bool mas_rewind_node(struct ma_state *mas)
|
||||
*/
|
||||
static inline bool mas_skip_node(struct ma_state *mas)
|
||||
{
|
||||
unsigned char slot, slot_count;
|
||||
unsigned long *pivots;
|
||||
enum maple_type mt;
|
||||
if (mas_is_err(mas))
|
||||
return false;
|
||||
|
||||
mt = mte_node_type(mas->node);
|
||||
slot_count = mt_slots[mt] - 1;
|
||||
do {
|
||||
if (mte_is_root(mas->node)) {
|
||||
slot = mas->offset;
|
||||
if (slot > slot_count) {
|
||||
if (mas->offset >= mas_data_end(mas)) {
|
||||
mas_set_err(mas, -EBUSY);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
mas_ascend(mas);
|
||||
slot = mas->offset;
|
||||
mt = mte_node_type(mas->node);
|
||||
slot_count = mt_slots[mt] - 1;
|
||||
}
|
||||
} while (slot > slot_count);
|
||||
|
||||
mas->offset = ++slot;
|
||||
pivots = ma_pivots(mas_mn(mas), mt);
|
||||
if (slot > 0)
|
||||
mas->min = pivots[slot - 1] + 1;
|
||||
|
||||
if (slot <= slot_count)
|
||||
mas->max = pivots[slot];
|
||||
} while (mas->offset >= mas_data_end(mas));
|
||||
|
||||
mas->offset++;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -122,8 +122,19 @@ void percpu_counter_sync(struct percpu_counter *fbc)
|
||||
}
|
||||
EXPORT_SYMBOL(percpu_counter_sync);
|
||||
|
||||
static s64 __percpu_counter_sum_mask(struct percpu_counter *fbc,
|
||||
const struct cpumask *cpu_mask)
|
||||
/*
|
||||
* Add up all the per-cpu counts, return the result. This is a more accurate
|
||||
* but much slower version of percpu_counter_read_positive().
|
||||
*
|
||||
* We use the cpu mask of (cpu_online_mask | cpu_dying_mask) to capture sums
|
||||
* from CPUs that are in the process of being taken offline. Dying cpus have
|
||||
* been removed from the online mask, but may not have had the hotplug dead
|
||||
* notifier called to fold the percpu count back into the global counter sum.
|
||||
* By including dying CPUs in the iteration mask, we avoid this race condition
|
||||
* so __percpu_counter_sum() just does the right thing when CPUs are being taken
|
||||
* offline.
|
||||
*/
|
||||
s64 __percpu_counter_sum(struct percpu_counter *fbc)
|
||||
{
|
||||
s64 ret;
|
||||
int cpu;
|
||||
@@ -131,35 +142,15 @@ static s64 __percpu_counter_sum_mask(struct percpu_counter *fbc,
|
||||
|
||||
raw_spin_lock_irqsave(&fbc->lock, flags);
|
||||
ret = fbc->count;
|
||||
for_each_cpu(cpu, cpu_mask) {
|
||||
for_each_cpu_or(cpu, cpu_online_mask, cpu_dying_mask) {
|
||||
s32 *pcount = per_cpu_ptr(fbc->counters, cpu);
|
||||
ret += *pcount;
|
||||
}
|
||||
raw_spin_unlock_irqrestore(&fbc->lock, flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add up all the per-cpu counts, return the result. This is a more accurate
|
||||
* but much slower version of percpu_counter_read_positive()
|
||||
*/
|
||||
s64 __percpu_counter_sum(struct percpu_counter *fbc)
|
||||
{
|
||||
return __percpu_counter_sum_mask(fbc, cpu_online_mask);
|
||||
}
|
||||
EXPORT_SYMBOL(__percpu_counter_sum);
|
||||
|
||||
/*
|
||||
* This is slower version of percpu_counter_sum as it traverses all possible
|
||||
* cpus. Use this only in the cases where accurate data is needed in the
|
||||
* presense of CPUs getting offlined.
|
||||
*/
|
||||
s64 percpu_counter_sum_all(struct percpu_counter *fbc)
|
||||
{
|
||||
return __percpu_counter_sum_mask(fbc, cpu_possible_mask);
|
||||
}
|
||||
EXPORT_SYMBOL(percpu_counter_sum_all);
|
||||
|
||||
int __percpu_counter_init(struct percpu_counter *fbc, s64 amount, gfp_t gfp,
|
||||
struct lock_class_key *key)
|
||||
{
|
||||
|
||||
@@ -2670,6 +2670,49 @@ static noinline void check_empty_area_window(struct maple_tree *mt)
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static noinline void check_empty_area_fill(struct maple_tree *mt)
|
||||
{
|
||||
const unsigned long max = 0x25D78000;
|
||||
unsigned long size;
|
||||
int loop, shift;
|
||||
MA_STATE(mas, mt, 0, 0);
|
||||
|
||||
mt_set_non_kernel(99999);
|
||||
for (shift = 12; shift <= 16; shift++) {
|
||||
loop = 5000;
|
||||
size = 1 << shift;
|
||||
while (loop--) {
|
||||
mas_set(&mas, 0);
|
||||
mas_lock(&mas);
|
||||
MT_BUG_ON(mt, mas_empty_area(&mas, 0, max, size) != 0);
|
||||
MT_BUG_ON(mt, mas.last != mas.index + size - 1);
|
||||
mas_store_gfp(&mas, (void *)size, GFP_KERNEL);
|
||||
mas_unlock(&mas);
|
||||
mas_reset(&mas);
|
||||
}
|
||||
}
|
||||
|
||||
/* No space left. */
|
||||
size = 0x1000;
|
||||
rcu_read_lock();
|
||||
MT_BUG_ON(mt, mas_empty_area(&mas, 0, max, size) != -EBUSY);
|
||||
rcu_read_unlock();
|
||||
|
||||
/* Fill a depth 3 node to the maximum */
|
||||
for (unsigned long i = 629440511; i <= 629440800; i += 6)
|
||||
mtree_store_range(mt, i, i + 5, (void *)i, GFP_KERNEL);
|
||||
/* Make space in the second-last depth 4 node */
|
||||
mtree_erase(mt, 631668735);
|
||||
/* Make space in the last depth 4 node */
|
||||
mtree_erase(mt, 629506047);
|
||||
mas_reset(&mas);
|
||||
/* Search from just after the gap in the second-last depth 4 */
|
||||
rcu_read_lock();
|
||||
MT_BUG_ON(mt, mas_empty_area(&mas, 629506048, 690000000, 0x5000) != 0);
|
||||
rcu_read_unlock();
|
||||
mt_set_non_kernel(0);
|
||||
}
|
||||
|
||||
static DEFINE_MTREE(tree);
|
||||
static int maple_tree_seed(void)
|
||||
{
|
||||
@@ -2926,6 +2969,11 @@ static int maple_tree_seed(void)
|
||||
check_empty_area_window(&tree);
|
||||
mtree_destroy(&tree);
|
||||
|
||||
mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
|
||||
check_empty_area_fill(&tree);
|
||||
mtree_destroy(&tree);
|
||||
|
||||
|
||||
#if defined(BENCH)
|
||||
skip:
|
||||
#endif
|
||||
|
||||
@@ -84,7 +84,7 @@ static uint64_t ZSTD_div64(uint64_t dividend, uint32_t divisor) {
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#define assert(x) WARN_ON((x))
|
||||
#define assert(x) WARN_ON(!(x))
|
||||
|
||||
#endif /* ZSTD_DEPS_ASSERT */
|
||||
#endif /* ZSTD_DEPS_NEED_ASSERT */
|
||||
|
||||
@@ -985,7 +985,7 @@ static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 targetLog, const U32
|
||||
|
||||
static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog,
|
||||
const sortedSymbol_t* sortedList,
|
||||
const U32* rankStart, rankVal_t rankValOrigin, const U32 maxWeight,
|
||||
const U32* rankStart, rankValCol_t *rankValOrigin, const U32 maxWeight,
|
||||
const U32 nbBitsBaseline)
|
||||
{
|
||||
U32* const rankVal = rankValOrigin[0];
|
||||
|
||||
@@ -798,7 +798,7 @@ static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity,
|
||||
if (srcSize == 0) return 0;
|
||||
RETURN_ERROR(dstBuffer_null, "");
|
||||
}
|
||||
ZSTD_memcpy(dst, src, srcSize);
|
||||
ZSTD_memmove(dst, src, srcSize);
|
||||
return srcSize;
|
||||
}
|
||||
|
||||
@@ -858,6 +858,7 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
||||
|
||||
/* Loop on each block */
|
||||
while (1) {
|
||||
BYTE* oBlockEnd = oend;
|
||||
size_t decodedSize;
|
||||
blockProperties_t blockProperties;
|
||||
size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSrcSize, &blockProperties);
|
||||
@@ -867,16 +868,34 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
||||
remainingSrcSize -= ZSTD_blockHeaderSize;
|
||||
RETURN_ERROR_IF(cBlockSize > remainingSrcSize, srcSize_wrong, "");
|
||||
|
||||
if (ip >= op && ip < oBlockEnd) {
|
||||
/* We are decompressing in-place. Limit the output pointer so that we
|
||||
* don't overwrite the block that we are currently reading. This will
|
||||
* fail decompression if the input & output pointers aren't spaced
|
||||
* far enough apart.
|
||||
*
|
||||
* This is important to set, even when the pointers are far enough
|
||||
* apart, because ZSTD_decompressBlock_internal() can decide to store
|
||||
* literals in the output buffer, after the block it is decompressing.
|
||||
* Since we don't want anything to overwrite our input, we have to tell
|
||||
* ZSTD_decompressBlock_internal to never write past ip.
|
||||
*
|
||||
* See ZSTD_allocateLiteralsBuffer() for reference.
|
||||
*/
|
||||
oBlockEnd = op + (ip - op);
|
||||
}
|
||||
|
||||
switch(blockProperties.blockType)
|
||||
{
|
||||
case bt_compressed:
|
||||
decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oend-op), ip, cBlockSize, /* frame */ 1, not_streaming);
|
||||
decodedSize = ZSTD_decompressBlock_internal(dctx, op, (size_t)(oBlockEnd-op), ip, cBlockSize, /* frame */ 1, not_streaming);
|
||||
break;
|
||||
case bt_raw :
|
||||
/* Use oend instead of oBlockEnd because this function is safe to overlap. It uses memmove. */
|
||||
decodedSize = ZSTD_copyRawBlock(op, (size_t)(oend-op), ip, cBlockSize);
|
||||
break;
|
||||
case bt_rle :
|
||||
decodedSize = ZSTD_setRleBlock(op, (size_t)(oend-op), *ip, blockProperties.origSize);
|
||||
decodedSize = ZSTD_setRleBlock(op, (size_t)(oBlockEnd-op), *ip, blockProperties.origSize);
|
||||
break;
|
||||
case bt_reserved :
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user