Commit 527eff22 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'mm-nonmm-stable-2024-07-21-15-07' of...

Merge tag 'mm-nonmm-stable-2024-07-21-15-07' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

Pull non-MM updates from Andrew Morton:

 - In the series "treewide: Refactor heap related implementation",
   Kuan-Wei Chiu has significantly reworked the min_heap library code
   and has taught bcachefs to use the new more generic implementation.

 - Yury Norov's series "Cleanup cpumask.h inclusion in core headers"
   reworks the cpumask and nodemask headers to make things generally
   more rational.

 - Kuan-Wei Chiu has sent along some maintenance work against our
   sorting library code in the series "lib/sort: Optimizations and
   cleanups".

 - More library maintainance work from Christophe Jaillet in the series
   "Remove usage of the deprecated ida_simple_xx() API".

 - Ryusuke Konishi continues with the nilfs2 fixes and clanups in the
   series "nilfs2: eliminate the call to inode_attach_wb()".

 - Kuan-Ying Lee has some fixes to the gdb scripts in the series "Fix
   GDB command error".

 - Plus the usual shower of singleton patches all over the place. Please
   see the relevant changelogs for details.

* tag 'mm-nonmm-stable-2024-07-21-15-07' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (98 commits)
  ia64: scrub ia64 from poison.h
  watchdog/perf: properly initialize the turbo mode timestamp and rearm counter
  tsacct: replace strncpy() with strscpy()
  lib/bch.c: use swap() to improve code
  test_bpf: convert comma to semicolon
  init/modpost: conditionally check section mismatch to __meminit*
  init: remove unused __MEMINIT* macros
  nilfs2: Constify struct kobj_type
  nilfs2: avoid undefined behavior in nilfs_cnt32_ge macro
  math: rational: add missing MODULE_DESCRIPTION() macro
  lib/zlib: add missing MODULE_DESCRIPTION() macro
  fs: ufs: add MODULE_DESCRIPTION()
  lib/rbtree.c: fix the example typo
  ocfs2: add bounds checking to ocfs2_check_dir_entry()
  fs: add kernel-doc comments to ocfs2_prepare_orphan_dir()
  coredump: simplify zap_process()
  selftests/fpu: add missing MODULE_DESCRIPTION() macro
  compiler.h: simplify data_race() macro
  build-id: require program headers to be right after ELF header
  resource: add missing MODULE_DESCRIPTION()
  ...
parents fbc90c04 67856f44
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3801,8 +3801,10 @@ F: include/linux/bitmap-str.h
F:	include/linux/bitmap.h
F:	include/linux/bits.h
F:	include/linux/cpumask.h
F:	include/linux/cpumask_types.h
F:	include/linux/find.h
F:	include/linux/nodemask.h
F:	include/linux/nodemask_types.h
F:	include/vdso/bits.h
F:	lib/bitmap-str.c
F:	lib/bitmap.c
+0 −2
Original line number Diff line number Diff line
@@ -123,8 +123,6 @@ SECTIONS
		 */
		*(.sfpr);
		*(.text.asan.* .text.tsan.*)
		MEM_KEEP(init.text)
		MEM_KEEP(exit.text)
	} :text

	. = ALIGN(PAGE_SIZE);
+8 −9
Original line number Diff line number Diff line
@@ -656,17 +656,16 @@ static int occ_probe(struct platform_device *pdev)
		rc = of_property_read_u32(dev->of_node, "reg", &reg);
		if (!rc) {
			/* make sure we don't have a duplicate from dts */
			occ->idx = ida_simple_get(&occ_ida, reg, reg + 1,
			occ->idx = ida_alloc_range(&occ_ida, reg, reg,
						   GFP_KERNEL);
			if (occ->idx < 0)
				occ->idx = ida_simple_get(&occ_ida, 1, INT_MAX,
				occ->idx = ida_alloc_min(&occ_ida, 1,
							 GFP_KERNEL);
		} else {
			occ->idx = ida_simple_get(&occ_ida, 1, INT_MAX,
						  GFP_KERNEL);
			occ->idx = ida_alloc_min(&occ_ida, 1, GFP_KERNEL);
		}
	} else {
		occ->idx = ida_simple_get(&occ_ida, 1, INT_MAX, GFP_KERNEL);
		occ->idx = ida_alloc_min(&occ_ida, 1, GFP_KERNEL);
	}

	platform_set_drvdata(pdev, occ);
@@ -680,7 +679,7 @@ static int occ_probe(struct platform_device *pdev)
	rc = misc_register(&occ->mdev);
	if (rc) {
		dev_err(dev, "failed to register miscdevice: %d\n", rc);
		ida_simple_remove(&occ_ida, occ->idx);
		ida_free(&occ_ida, occ->idx);
		kvfree(occ->buffer);
		return rc;
	}
@@ -719,7 +718,7 @@ static int occ_remove(struct platform_device *pdev)
	else
		device_for_each_child(&pdev->dev, NULL, occ_unregister_of_child);

	ida_simple_remove(&occ_ida, occ->idx);
	ida_free(&occ_ida, occ->idx);

	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -340,7 +340,7 @@ static int eb_create(struct i915_execbuffer *eb)
		 * Without a 1:1 association between relocation handles and
		 * the execobject[] index, we instead create a hashtable.
		 * We size it dynamically based on available memory, starting
		 * first with 1:1 assocative hash and scaling back until
		 * first with 1:1 associative hash and scaling back until
		 * the allocation succeeds.
		 *
		 * Later on we use a positive lut_size to indicate we are
+47 −17
Original line number Diff line number Diff line
@@ -164,40 +164,68 @@ static void bch_invalidate_one_bucket(struct cache *ca, struct bucket *b)
 * prio is worth 1/8th of what INITIAL_PRIO is worth.
 */

#define bucket_prio(b)							\
({									\
	unsigned int min_prio = (INITIAL_PRIO - ca->set->min_prio) / 8;	\
									\
	(b->prio - ca->set->min_prio + min_prio) * GC_SECTORS_USED(b);	\
})
static inline unsigned int new_bucket_prio(struct cache *ca, struct bucket *b)
{
	unsigned int min_prio = (INITIAL_PRIO - ca->set->min_prio) / 8;

#define bucket_max_cmp(l, r)	(bucket_prio(l) < bucket_prio(r))
#define bucket_min_cmp(l, r)	(bucket_prio(l) > bucket_prio(r))
	return (b->prio - ca->set->min_prio + min_prio) * GC_SECTORS_USED(b);
}

static inline bool new_bucket_max_cmp(const void *l, const void *r, void *args)
{
	struct bucket **lhs = (struct bucket **)l;
	struct bucket **rhs = (struct bucket **)r;
	struct cache *ca = args;

	return new_bucket_prio(ca, *lhs) > new_bucket_prio(ca, *rhs);
}

static inline bool new_bucket_min_cmp(const void *l, const void *r, void *args)
{
	struct bucket **lhs = (struct bucket **)l;
	struct bucket **rhs = (struct bucket **)r;
	struct cache *ca = args;

	return new_bucket_prio(ca, *lhs) < new_bucket_prio(ca, *rhs);
}

static inline void new_bucket_swap(void *l, void *r, void __always_unused *args)
{
	struct bucket **lhs = l, **rhs = r;

	swap(*lhs, *rhs);
}

static void invalidate_buckets_lru(struct cache *ca)
{
	struct bucket *b;
	ssize_t i;
	const struct min_heap_callbacks bucket_max_cmp_callback = {
		.less = new_bucket_max_cmp,
		.swp = new_bucket_swap,
	};
	const struct min_heap_callbacks bucket_min_cmp_callback = {
		.less = new_bucket_min_cmp,
		.swp = new_bucket_swap,
	};

	ca->heap.used = 0;
	ca->heap.nr = 0;

	for_each_bucket(b, ca) {
		if (!bch_can_invalidate_bucket(ca, b))
			continue;

		if (!heap_full(&ca->heap))
			heap_add(&ca->heap, b, bucket_max_cmp);
		else if (bucket_max_cmp(b, heap_peek(&ca->heap))) {
		if (!min_heap_full(&ca->heap))
			min_heap_push(&ca->heap, &b, &bucket_max_cmp_callback, ca);
		else if (!new_bucket_max_cmp(&b, min_heap_peek(&ca->heap), ca)) {
			ca->heap.data[0] = b;
			heap_sift(&ca->heap, 0, bucket_max_cmp);
			min_heap_sift_down(&ca->heap, 0, &bucket_max_cmp_callback, ca);
		}
	}

	for (i = ca->heap.used / 2 - 1; i >= 0; --i)
		heap_sift(&ca->heap, i, bucket_min_cmp);
	min_heapify_all(&ca->heap, &bucket_min_cmp_callback, ca);

	while (!fifo_full(&ca->free_inc)) {
		if (!heap_pop(&ca->heap, b, bucket_min_cmp)) {
		if (!ca->heap.nr) {
			/*
			 * We don't want to be calling invalidate_buckets()
			 * multiple times when it can't do anything
@@ -206,6 +234,8 @@ static void invalidate_buckets_lru(struct cache *ca)
			wake_up_gc(ca->set);
			return;
		}
		b = min_heap_peek(&ca->heap)[0];
		min_heap_pop(&ca->heap, &bucket_min_cmp_callback, ca);

		bch_invalidate_one_bucket(ca, b);
	}
Loading