Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 3e049b6

Browse files
committed
Merge tag 'drm-misc-fixes-2024-05-23' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
Short summary of fixes pull: buddy: - stop using PAGE_SIZE shmem-helper: - avoid kernel panic in mmap() tests: - buddy: fix PAGE_SIZE dependency Signed-off-by: Dave Airlie <airlied@redhat.com> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/20240523184745.GA11363@localhost.localdomain
2 parents 1613e60 + 39bc27b commit 3e049b6

File tree

4 files changed

+28
-25
lines changed

4 files changed

+28
-25
lines changed

drivers/gpu/drm/drm_buddy.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)
239239
if (size < chunk_size)
240240
return -EINVAL;
241241

242-
if (chunk_size < PAGE_SIZE)
242+
if (chunk_size < SZ_4K)
243243
return -EINVAL;
244244

245245
if (!is_power_of_2(chunk_size))

drivers/gpu/drm/drm_gem_shmem_helper.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,9 @@ int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct
611611
return ret;
612612
}
613613

614+
if (is_cow_mapping(vma->vm_flags))
615+
return -EINVAL;
616+
614617
dma_resv_lock(shmem->base.resv, NULL);
615618
ret = drm_gem_shmem_get_pages(shmem);
616619
dma_resv_unlock(shmem->base.resv);

drivers/gpu/drm/tests/drm_buddy_test.c

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -505,8 +505,8 @@ static void drm_test_buddy_alloc_pathological(struct kunit *test)
505505
* Eventually we will have a fully 50% fragmented mm.
506506
*/
507507

508-
mm_size = PAGE_SIZE << max_order;
509-
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_init(&mm, mm_size, PAGE_SIZE),
508+
mm_size = SZ_4K << max_order;
509+
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_init(&mm, mm_size, SZ_4K),
510510
"buddy_init failed\n");
511511

512512
KUNIT_EXPECT_EQ(test, mm.max_order, max_order);
@@ -520,7 +520,7 @@ static void drm_test_buddy_alloc_pathological(struct kunit *test)
520520
}
521521

522522
for (order = top; order--;) {
523-
size = get_size(order, PAGE_SIZE);
523+
size = get_size(order, mm.chunk_size);
524524
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, start,
525525
mm_size, size, size,
526526
&tmp, flags),
@@ -534,7 +534,7 @@ static void drm_test_buddy_alloc_pathological(struct kunit *test)
534534
}
535535

536536
/* There should be one final page for this sub-allocation */
537-
size = get_size(0, PAGE_SIZE);
537+
size = get_size(0, mm.chunk_size);
538538
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
539539
size, size, &tmp, flags),
540540
"buddy_alloc hit -ENOMEM for hole\n");
@@ -544,7 +544,7 @@ static void drm_test_buddy_alloc_pathological(struct kunit *test)
544544

545545
list_move_tail(&block->link, &holes);
546546

547-
size = get_size(top, PAGE_SIZE);
547+
size = get_size(top, mm.chunk_size);
548548
KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
549549
size, size, &tmp, flags),
550550
"buddy_alloc unexpectedly succeeded at top-order %d/%d, it should be full!",
@@ -555,7 +555,7 @@ static void drm_test_buddy_alloc_pathological(struct kunit *test)
555555

556556
/* Nothing larger than blocks of chunk_size now available */
557557
for (order = 1; order <= max_order; order++) {
558-
size = get_size(order, PAGE_SIZE);
558+
size = get_size(order, mm.chunk_size);
559559
KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
560560
size, size, &tmp, flags),
561561
"buddy_alloc unexpectedly succeeded at order %d, it should be full!",
@@ -584,14 +584,14 @@ static void drm_test_buddy_alloc_pessimistic(struct kunit *test)
584584
* page left.
585585
*/
586586

587-
mm_size = PAGE_SIZE << max_order;
588-
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_init(&mm, mm_size, PAGE_SIZE),
587+
mm_size = SZ_4K << max_order;
588+
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_init(&mm, mm_size, SZ_4K),
589589
"buddy_init failed\n");
590590

591591
KUNIT_EXPECT_EQ(test, mm.max_order, max_order);
592592

593593
for (order = 0; order < max_order; order++) {
594-
size = get_size(order, PAGE_SIZE);
594+
size = get_size(order, mm.chunk_size);
595595
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
596596
size, size, &tmp, flags),
597597
"buddy_alloc hit -ENOMEM with order=%d\n",
@@ -604,7 +604,7 @@ static void drm_test_buddy_alloc_pessimistic(struct kunit *test)
604604
}
605605

606606
/* And now the last remaining block available */
607-
size = get_size(0, PAGE_SIZE);
607+
size = get_size(0, mm.chunk_size);
608608
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
609609
size, size, &tmp, flags),
610610
"buddy_alloc hit -ENOMEM on final alloc\n");
@@ -616,7 +616,7 @@ static void drm_test_buddy_alloc_pessimistic(struct kunit *test)
616616

617617
/* Should be completely full! */
618618
for (order = max_order; order--;) {
619-
size = get_size(order, PAGE_SIZE);
619+
size = get_size(order, mm.chunk_size);
620620
KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
621621
size, size, &tmp, flags),
622622
"buddy_alloc unexpectedly succeeded, it should be full!");
@@ -632,7 +632,7 @@ static void drm_test_buddy_alloc_pessimistic(struct kunit *test)
632632
list_del(&block->link);
633633
drm_buddy_free_block(&mm, block);
634634

635-
size = get_size(order, PAGE_SIZE);
635+
size = get_size(order, mm.chunk_size);
636636
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
637637
size, size, &tmp, flags),
638638
"buddy_alloc hit -ENOMEM with order=%d\n",
@@ -647,7 +647,7 @@ static void drm_test_buddy_alloc_pessimistic(struct kunit *test)
647647
}
648648

649649
/* To confirm, now the whole mm should be available */
650-
size = get_size(max_order, PAGE_SIZE);
650+
size = get_size(max_order, mm.chunk_size);
651651
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
652652
size, size, &tmp, flags),
653653
"buddy_alloc (realloc) hit -ENOMEM with order=%d\n",
@@ -678,15 +678,15 @@ static void drm_test_buddy_alloc_optimistic(struct kunit *test)
678678
* try to allocate them all.
679679
*/
680680

681-
mm_size = PAGE_SIZE * ((1 << (max_order + 1)) - 1);
681+
mm_size = SZ_4K * ((1 << (max_order + 1)) - 1);
682682

683-
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_init(&mm, mm_size, PAGE_SIZE),
683+
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_init(&mm, mm_size, SZ_4K),
684684
"buddy_init failed\n");
685685

686686
KUNIT_EXPECT_EQ(test, mm.max_order, max_order);
687687

688688
for (order = 0; order <= max_order; order++) {
689-
size = get_size(order, PAGE_SIZE);
689+
size = get_size(order, mm.chunk_size);
690690
KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
691691
size, size, &tmp, flags),
692692
"buddy_alloc hit -ENOMEM with order=%d\n",
@@ -699,7 +699,7 @@ static void drm_test_buddy_alloc_optimistic(struct kunit *test)
699699
}
700700

701701
/* Should be completely full! */
702-
size = get_size(0, PAGE_SIZE);
702+
size = get_size(0, mm.chunk_size);
703703
KUNIT_ASSERT_TRUE_MSG(test, drm_buddy_alloc_blocks(&mm, start, mm_size,
704704
size, size, &tmp, flags),
705705
"buddy_alloc unexpectedly succeeded, it should be full!");
@@ -716,15 +716,15 @@ static void drm_test_buddy_alloc_limit(struct kunit *test)
716716
LIST_HEAD(allocated);
717717
struct drm_buddy mm;
718718

719-
KUNIT_EXPECT_FALSE(test, drm_buddy_init(&mm, size, PAGE_SIZE));
719+
KUNIT_EXPECT_FALSE(test, drm_buddy_init(&mm, size, SZ_4K));
720720

721721
KUNIT_EXPECT_EQ_MSG(test, mm.max_order, DRM_BUDDY_MAX_ORDER,
722722
"mm.max_order(%d) != %d\n", mm.max_order,
723723
DRM_BUDDY_MAX_ORDER);
724724

725725
size = mm.chunk_size << mm.max_order;
726726
KUNIT_EXPECT_FALSE(test, drm_buddy_alloc_blocks(&mm, start, size, size,
727-
PAGE_SIZE, &allocated, flags));
727+
mm.chunk_size, &allocated, flags));
728728

729729
block = list_first_entry_or_null(&allocated, struct drm_buddy_block, link);
730730
KUNIT_EXPECT_TRUE(test, block);
@@ -734,10 +734,10 @@ static void drm_test_buddy_alloc_limit(struct kunit *test)
734734
drm_buddy_block_order(block), mm.max_order);
735735

736736
KUNIT_EXPECT_EQ_MSG(test, drm_buddy_block_size(&mm, block),
737-
BIT_ULL(mm.max_order) * PAGE_SIZE,
737+
BIT_ULL(mm.max_order) * mm.chunk_size,
738738
"block size(%llu) != %llu\n",
739739
drm_buddy_block_size(&mm, block),
740-
BIT_ULL(mm.max_order) * PAGE_SIZE);
740+
BIT_ULL(mm.max_order) * mm.chunk_size);
741741

742742
drm_buddy_free_list(&mm, &allocated, 0);
743743
drm_buddy_fini(&mm);

include/drm/drm_buddy.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ struct drm_buddy_block {
5656
struct list_head tmp_link;
5757
};
5858

59-
/* Order-zero must be at least PAGE_SIZE */
60-
#define DRM_BUDDY_MAX_ORDER (63 - PAGE_SHIFT)
59+
/* Order-zero must be at least SZ_4K */
60+
#define DRM_BUDDY_MAX_ORDER (63 - 12)
6161

6262
/*
6363
* Binary Buddy System.
@@ -85,7 +85,7 @@ struct drm_buddy {
8585
unsigned int n_roots;
8686
unsigned int max_order;
8787

88-
/* Must be at least PAGE_SIZE */
88+
/* Must be at least SZ_4K */
8989
u64 chunk_size;
9090
u64 size;
9191
u64 avail;

0 commit comments

Comments
 (0)