From: Mika Penttilä <mpenttil@redhat.com>
Do the preparations in hmm_range_fault() and pagewalk callbacks to
do the "collecting" part of migration, needed for migration
on fault.
These steps include locking for pmd/pte if migrating, capturing
the vma for further migrate actions, and calling the
still dummy hmm_vma_handle_migrate_prepare_pmd() and
hmm_vma_handle_migrate_prepare() functions in the pagewalk.
Cc: David Hildenbrand <david@kernel.org>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Leon Romanovsky <leonro@nvidia.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Balbir Singh <balbirs@nvidia.com>
Cc: Zi Yan <ziy@nvidia.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Suggested-by: Alistair Popple <apopple@nvidia.com>
Signed-off-by: Mika Penttilä <mpenttil@redhat.com>
---
include/linux/migrate.h | 17 +-
lib/test_hmm.c | 2 +-
mm/hmm.c | 423 +++++++++++++++++++++++++++++++++++-----
3 files changed, 387 insertions(+), 55 deletions(-)
diff --git a/include/linux/migrate.h b/include/linux/migrate.h
index 425ab5242da0..037e7430edb9 100644
--- a/include/linux/migrate.h
+++ b/include/linux/migrate.h
@@ -104,6 +104,15 @@ static inline void softleaf_entry_wait_on_locked(softleaf_t entry, spinlock_t *p
WARN_ON_ONCE(1);
spin_unlock(ptl);
+
+enum migrate_vma_info {
+ MIGRATE_VMA_SELECT_NONE = 0,
+ MIGRATE_VMA_SELECT_COMPOUND = MIGRATE_VMA_SELECT_NONE,
+};
+
+static inline enum migrate_vma_info hmm_select_migrate(struct hmm_range *range)
+{
+ return MIGRATE_VMA_SELECT_NONE;
}
#endif /* CONFIG_MIGRATION */
@@ -149,7 +158,7 @@ static inline unsigned long migrate_pfn(unsigned long pfn)
return (pfn << MIGRATE_PFN_SHIFT) | MIGRATE_PFN_VALID;
}
-enum migrate_vma_direction {
+enum migrate_vma_info {
MIGRATE_VMA_SELECT_SYSTEM = 1 << 0,
MIGRATE_VMA_SELECT_DEVICE_PRIVATE = 1 << 1,
MIGRATE_VMA_SELECT_DEVICE_COHERENT = 1 << 2,
@@ -191,6 +200,12 @@ struct migrate_vma {
struct page *fault_page;
};
+// TODO: enable migration
+static inline enum migrate_vma_info hmm_select_migrate(struct hmm_range *range)
+{
+ return 0;
+}
+
int migrate_vma_setup(struct migrate_vma *args);
void migrate_vma_pages(struct migrate_vma *migrate);
void migrate_vma_finalize(struct migrate_vma *migrate);
diff --git a/lib/test_hmm.c b/lib/test_hmm.c
index 0964d53365e6..01aa0b60df2f 100644
--- a/lib/test_hmm.c
+++ b/lib/test_hmm.c
@@ -145,7 +145,7 @@ static bool dmirror_is_private_zone(struct dmirror_device *mdevice)
HMM_DMIRROR_MEMORY_DEVICE_PRIVATE);
}
-static enum migrate_vma_direction
+static enum migrate_vma_info
dmirror_select_device(struct dmirror *dmirror)
{
return (dmirror->mdevice->zone_device_type ==
diff --git a/mm/hmm.c b/mm/hmm.c
index 5955f2f0c83d..642593c3505f 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -20,6 +20,7 @@
#include <linux/pagemap.h>
#include <linux/leafops.h>
#include <linux/hugetlb.h>
+#include <linux/migrate.h>
#include <linux/memremap.h>
#include <linux/sched/mm.h>
#include <linux/jump_label.h>
@@ -27,14 +28,44 @@
#include <linux/pci-p2pdma.h>
#include <linux/mmu_notifier.h>
#include <linux/memory_hotplug.h>
+#include <asm/tlbflush.h>
#include "internal.h"
struct hmm_vma_walk {
- struct hmm_range *range;
- unsigned long last;
+ struct mmu_notifier_range mmu_range;
+ struct vm_area_struct *vma;
+ struct hmm_range *range;
+ unsigned long start;
+ unsigned long end;
+ unsigned long last;
+ /*
+ * For migration we need pte/pmd
+ * locked for the handle_* and
+ * prepare_* regions. While faulting
+ * we have to drop the locks and
+ * start again.
+ * ptelocked and pmdlocked
+ * hold the state and tells if need
+ * to drop locks before faulting.
+ * ptl is the lock held for pte or pmd.
+ *
+ */
+ bool ptelocked;
+ bool pmdlocked;
+ spinlock_t *ptl;
};
+#define HMM_ASSERT_PTE_LOCKED(hmm_vma_walk, locked) \
+ WARN_ON_ONCE(hmm_vma_walk->ptelocked != locked)
+
+#define HMM_ASSERT_PMD_LOCKED(hmm_vma_walk, locked) \
+ WARN_ON_ONCE(hmm_vma_walk->pmdlocked != locked)
+
+#define HMM_ASSERT_UNLOCKED(hmm_vma_walk) \
+ WARN_ON_ONCE(hmm_vma_walk->ptelocked || \
+ hmm_vma_walk->pmdlocked)
+
enum {
HMM_NEED_FAULT = 1 << 0,
HMM_NEED_WRITE_FAULT = 1 << 1,
@@ -48,14 +79,37 @@ enum {
};
static int hmm_pfns_fill(unsigned long addr, unsigned long end,
- struct hmm_range *range, unsigned long cpu_flags)
+ struct hmm_vma_walk *hmm_vma_walk, unsigned long cpu_flags)
{
+ struct hmm_range *range = hmm_vma_walk->range;
unsigned long i = (addr - range->start) >> PAGE_SHIFT;
+ enum migrate_vma_info minfo;
+ bool migrate = false;
+
+ minfo = hmm_select_migrate(range);
+ if (cpu_flags != HMM_PFN_ERROR) {
+ if (minfo && (vma_is_anonymous(hmm_vma_walk->vma))) {
+ cpu_flags |= HMM_PFN_MIGRATE;
+ migrate = true;
+ }
+ }
+
+ if (migrate && thp_migration_supported() &&
+ (minfo & MIGRATE_VMA_SELECT_COMPOUND) &&
+ IS_ALIGNED(addr, HPAGE_PMD_SIZE) &&
+ IS_ALIGNED(end, HPAGE_PMD_SIZE)) {
+ range->hmm_pfns[i] &= HMM_PFN_INOUT_FLAGS;
+ range->hmm_pfns[i] |= cpu_flags | HMM_PFN_COMPOUND;
+ addr += PAGE_SIZE;
+ i++;
+ cpu_flags = 0;
+ }
for (; addr < end; addr += PAGE_SIZE, i++) {
range->hmm_pfns[i] &= HMM_PFN_INOUT_FLAGS;
range->hmm_pfns[i] |= cpu_flags;
}
+
return 0;
}
@@ -78,6 +132,7 @@ static int hmm_vma_fault(unsigned long addr, unsigned long end,
unsigned int fault_flags = FAULT_FLAG_REMOTE;
WARN_ON_ONCE(!required_fault);
+ HMM_ASSERT_UNLOCKED(hmm_vma_walk);
hmm_vma_walk->last = addr;
if (required_fault & HMM_NEED_WRITE_FAULT) {
@@ -171,11 +226,11 @@ static int hmm_vma_walk_hole(unsigned long addr, unsigned long end,
if (!walk->vma) {
if (required_fault)
return -EFAULT;
- return hmm_pfns_fill(addr, end, range, HMM_PFN_ERROR);
+ return hmm_pfns_fill(addr, end, hmm_vma_walk, HMM_PFN_ERROR);
}
if (required_fault)
return hmm_vma_fault(addr, end, required_fault, walk);
- return hmm_pfns_fill(addr, end, range, 0);
+ return hmm_pfns_fill(addr, end, hmm_vma_walk, 0);
}
static inline unsigned long hmm_pfn_flags_order(unsigned long order)
@@ -208,8 +263,13 @@ static int hmm_vma_handle_pmd(struct mm_walk *walk, unsigned long addr,
cpu_flags = pmd_to_hmm_pfn_flags(range, pmd);
required_fault =
hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, cpu_flags);
- if (required_fault)
+ if (required_fault) {
+ if (hmm_vma_walk->pmdlocked) {
+ spin_unlock(hmm_vma_walk->ptl);
+ hmm_vma_walk->pmdlocked = false;
+ }
return hmm_vma_fault(addr, end, required_fault, walk);
+ }
pfn = pmd_pfn(pmd) + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
for (i = 0; addr < end; addr += PAGE_SIZE, i++, pfn++) {
@@ -289,14 +349,23 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
goto fault;
if (softleaf_is_migration(entry)) {
- pte_unmap(ptep);
- hmm_vma_walk->last = addr;
- migration_entry_wait(walk->mm, pmdp, addr);
- return -EBUSY;
+ if (!hmm_select_migrate(range)) {
+ HMM_ASSERT_UNLOCKED(hmm_vma_walk);
+ hmm_vma_walk->last = addr;
+ migration_entry_wait(walk->mm, pmdp, addr);
+ return -EBUSY;
+ } else
+ goto out;
}
/* Report error for everything else */
- pte_unmap(ptep);
+
+ if (hmm_vma_walk->ptelocked) {
+ pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
+ hmm_vma_walk->ptelocked = false;
+ } else
+ pte_unmap(ptep);
+
return -EFAULT;
}
@@ -313,7 +382,12 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
if (!vm_normal_page(walk->vma, addr, pte) &&
!is_zero_pfn(pte_pfn(pte))) {
if (hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, 0)) {
- pte_unmap(ptep);
+ if (hmm_vma_walk->ptelocked) {
+ pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
+ hmm_vma_walk->ptelocked = false;
+ } else
+ pte_unmap(ptep);
+
return -EFAULT;
}
new_pfn_flags = HMM_PFN_ERROR;
@@ -326,7 +400,11 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr,
return 0;
fault:
- pte_unmap(ptep);
+ if (hmm_vma_walk->ptelocked) {
+ pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
+ hmm_vma_walk->ptelocked = false;
+ } else
+ pte_unmap(ptep);
/* Fault any virtual address we were asked to fault */
return hmm_vma_fault(addr, end, required_fault, walk);
}
@@ -370,13 +448,18 @@ static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
required_fault = hmm_range_need_fault(hmm_vma_walk, hmm_pfns,
npages, 0);
if (required_fault) {
- if (softleaf_is_device_private(entry))
+ if (softleaf_is_device_private(entry)) {
+ if (hmm_vma_walk->pmdlocked) {
+ spin_unlock(hmm_vma_walk->ptl);
+ hmm_vma_walk->pmdlocked = false;
+ }
return hmm_vma_fault(addr, end, required_fault, walk);
+ }
else
return -EFAULT;
}
- return hmm_pfns_fill(start, end, range, HMM_PFN_ERROR);
+ return hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
}
#else
static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
@@ -384,15 +467,100 @@ static int hmm_vma_handle_absent_pmd(struct mm_walk *walk, unsigned long start,
pmd_t pmd)
{
struct hmm_vma_walk *hmm_vma_walk = walk->private;
- struct hmm_range *range = hmm_vma_walk->range;
unsigned long npages = (end - start) >> PAGE_SHIFT;
if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0))
return -EFAULT;
- return hmm_pfns_fill(start, end, range, HMM_PFN_ERROR);
+ return hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
}
#endif /* CONFIG_ARCH_ENABLE_THP_MIGRATION */
+#ifdef CONFIG_DEVICE_MIGRATION
+static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
+ pmd_t *pmdp,
+ unsigned long start,
+ unsigned long end,
+ unsigned long *hmm_pfn)
+{
+ // TODO: implement migration entry insertion
+ return 0;
+}
+
+static int hmm_vma_handle_migrate_prepare(const struct mm_walk *walk,
+ pmd_t *pmdp,
+ pte_t *pte,
+ unsigned long addr,
+ unsigned long *hmm_pfn)
+{
+ // TODO: implement migration entry insertion
+ return 0;
+}
+
+static int hmm_vma_walk_split(pmd_t *pmdp,
+ unsigned long addr,
+ struct mm_walk *walk)
+{
+ // TODO : implement split
+ return 0;
+}
+
+#else
+static int hmm_vma_handle_migrate_prepare_pmd(const struct mm_walk *walk,
+ pmd_t *pmdp,
+ unsigned long start,
+ unsigned long end,
+ unsigned long *hmm_pfn)
+{
+ return 0;
+}
+
+static int hmm_vma_handle_migrate_prepare(const struct mm_walk *walk,
+ pmd_t *pmdp,
+ pte_t *pte,
+ unsigned long addr,
+ unsigned long *hmm_pfn)
+{
+ return 0;
+}
+
+static int hmm_vma_walk_split(pmd_t *pmdp,
+ unsigned long addr,
+ struct mm_walk *walk)
+{
+ return 0;
+}
+#endif
+
+static int hmm_vma_capture_migrate_range(unsigned long start,
+ unsigned long end,
+ struct mm_walk *walk)
+{
+ struct hmm_vma_walk *hmm_vma_walk = walk->private;
+ struct hmm_range *range = hmm_vma_walk->range;
+
+ if (!hmm_select_migrate(range))
+ return 0;
+
+ if (hmm_vma_walk->vma && (hmm_vma_walk->vma != walk->vma))
+ return -ERANGE;
+
+ hmm_vma_walk->vma = walk->vma;
+ hmm_vma_walk->start = start;
+ hmm_vma_walk->end = end;
+
+ if (end - start > range->end - range->start)
+ return -ERANGE;
+
+ if (!hmm_vma_walk->mmu_range.owner) {
+ mmu_notifier_range_init_owner(&hmm_vma_walk->mmu_range, MMU_NOTIFY_MIGRATE, 0,
+ walk->vma->vm_mm, start, end,
+ range->dev_private_owner);
+ mmu_notifier_invalidate_range_start(&hmm_vma_walk->mmu_range);
+ }
+
+ return 0;
+}
+
static int hmm_vma_walk_pmd(pmd_t *pmdp,
unsigned long start,
unsigned long end,
@@ -400,46 +568,130 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
{
struct hmm_vma_walk *hmm_vma_walk = walk->private;
struct hmm_range *range = hmm_vma_walk->range;
- unsigned long *hmm_pfns =
- &range->hmm_pfns[(start - range->start) >> PAGE_SHIFT];
unsigned long npages = (end - start) >> PAGE_SHIFT;
+ struct mm_struct *mm = walk->vma->vm_mm;
+ enum migrate_vma_info minfo;
unsigned long addr = start;
+ unsigned long *hmm_pfns;
+ unsigned long i;
pte_t *ptep;
pmd_t pmd;
+ int r = 0;
+
+ minfo = hmm_select_migrate(range);
again:
- pmd = pmdp_get_lockless(pmdp);
- if (pmd_none(pmd))
- return hmm_vma_walk_hole(start, end, -1, walk);
+ hmm_pfns = &range->hmm_pfns[(addr - range->start) >> PAGE_SHIFT];
+ hmm_vma_walk->ptelocked = false;
+ hmm_vma_walk->pmdlocked = false;
+
+ if (minfo) {
+ hmm_vma_walk->ptl = pmd_lock(mm, pmdp);
+ hmm_vma_walk->pmdlocked = true;
+ pmd = pmdp_get(pmdp);
+ } else
+ pmd = pmdp_get_lockless(pmdp);
+
+ if (pmd_none(pmd)) {
+ r = hmm_vma_walk_hole(start, end, -1, walk);
+
+ if (hmm_vma_walk->pmdlocked) {
+ spin_unlock(hmm_vma_walk->ptl);
+ hmm_vma_walk->pmdlocked = false;
+ }
+ return r;
+ }
if (thp_migration_supported() && pmd_is_migration_entry(pmd)) {
- if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0)) {
+ if (!minfo) {
+ if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0)) {
+ hmm_vma_walk->last = addr;
+ pmd_migration_entry_wait(walk->mm, pmdp);
+ return -EBUSY;
+ }
+ }
+ for (i = 0; addr < end; addr += PAGE_SIZE, i++)
+ hmm_pfns[i] &= HMM_PFN_INOUT_FLAGS;
+
+ if (hmm_vma_walk->pmdlocked) {
+ spin_unlock(hmm_vma_walk->ptl);
+ hmm_vma_walk->pmdlocked = false;
+ }
+
+ return 0;
+ }
+
+ if (pmd_trans_huge(pmd) || !pmd_present(pmd)) {
+
+ if (!pmd_present(pmd)) {
+ r = hmm_vma_handle_absent_pmd(walk, start, end, hmm_pfns,
+ pmd);
+ // If not migrating we are done
+ if (r || !minfo) {
+ if (hmm_vma_walk->pmdlocked) {
+ spin_unlock(hmm_vma_walk->ptl);
+ hmm_vma_walk->pmdlocked = false;
+ }
+ return r;
+ }
+ }
+
+ if (pmd_trans_huge(pmd)) {
+
+ /*
+ * No need to take pmd_lock here if not migrating,
+ * even if some other thread is splitting the huge
+ * pmd we will get that event through mmu_notifier callback.
+ *
+ * So just read pmd value and check again it's a transparent
+ * huge or device mapping one and compute corresponding pfn
+ * values.
+ */
+
+ if (!minfo) {
+ pmd = pmdp_get_lockless(pmdp);
+ if (!pmd_trans_huge(pmd))
+ goto again;
+ }
+
+ r = hmm_vma_handle_pmd(walk, addr, end, hmm_pfns, pmd);
+
+ // If not migrating we are done
+ if (r || !minfo) {
+ if (hmm_vma_walk->pmdlocked) {
+ spin_unlock(hmm_vma_walk->ptl);
+ hmm_vma_walk->pmdlocked = false;
+ }
+ return r;
+ }
+ }
+
+ r = hmm_vma_handle_migrate_prepare_pmd(walk, pmdp, start, end, hmm_pfns);
+
+ if (hmm_vma_walk->pmdlocked) {
+ spin_unlock(hmm_vma_walk->ptl);
+ hmm_vma_walk->pmdlocked = false;
+ }
+
+ if (r == -ENOENT) {
+ r = hmm_vma_walk_split(pmdp, addr, walk);
+ if (r) {
+ /* Split not successful, skip */
+ return hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
+ }
+
+ /* Split successful, reloop */
hmm_vma_walk->last = addr;
- pmd_migration_entry_wait(walk->mm, pmdp);
return -EBUSY;
}
- return hmm_pfns_fill(start, end, range, 0);
- }
- if (!pmd_present(pmd))
- return hmm_vma_handle_absent_pmd(walk, start, end, hmm_pfns,
- pmd);
+ return r;
- if (pmd_trans_huge(pmd)) {
- /*
- * No need to take pmd_lock here, even if some other thread
- * is splitting the huge pmd we will get that event through
- * mmu_notifier callback.
- *
- * So just read pmd value and check again it's a transparent
- * huge or device mapping one and compute corresponding pfn
- * values.
- */
- pmd = pmdp_get_lockless(pmdp);
- if (!pmd_trans_huge(pmd))
- goto again;
+ }
- return hmm_vma_handle_pmd(walk, addr, end, hmm_pfns, pmd);
+ if (hmm_vma_walk->pmdlocked) {
+ spin_unlock(hmm_vma_walk->ptl);
+ hmm_vma_walk->pmdlocked = false;
}
/*
@@ -451,22 +703,43 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
if (pmd_bad(pmd)) {
if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0))
return -EFAULT;
- return hmm_pfns_fill(start, end, range, HMM_PFN_ERROR);
+ return hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
}
- ptep = pte_offset_map(pmdp, addr);
+ if (minfo) {
+ ptep = pte_offset_map_lock(mm, pmdp, addr, &hmm_vma_walk->ptl);
+ if (ptep)
+ hmm_vma_walk->ptelocked = true;
+ } else
+ ptep = pte_offset_map(pmdp, addr);
if (!ptep)
goto again;
+
for (; addr < end; addr += PAGE_SIZE, ptep++, hmm_pfns++) {
- int r;
r = hmm_vma_handle_pte(walk, addr, end, pmdp, ptep, hmm_pfns);
if (r) {
- /* hmm_vma_handle_pte() did pte_unmap() */
+ /* hmm_vma_handle_pte() did pte_unmap() / pte_unmap_unlock */
return r;
}
+
+ r = hmm_vma_handle_migrate_prepare(walk, pmdp, ptep, addr, hmm_pfns);
+ if (r == -EAGAIN) {
+ HMM_ASSERT_UNLOCKED(hmm_vma_walk);
+ goto again;
+ }
+ if (r) {
+ hmm_pfns_fill(addr, end, hmm_vma_walk, HMM_PFN_ERROR);
+ break;
+ }
}
- pte_unmap(ptep - 1);
+
+ if (hmm_vma_walk->ptelocked) {
+ pte_unmap_unlock(ptep - 1, hmm_vma_walk->ptl);
+ hmm_vma_walk->ptelocked = false;
+ } else
+ pte_unmap(ptep - 1);
+
return 0;
}
@@ -600,6 +873,11 @@ static int hmm_vma_walk_test(unsigned long start, unsigned long end,
struct hmm_vma_walk *hmm_vma_walk = walk->private;
struct hmm_range *range = hmm_vma_walk->range;
struct vm_area_struct *vma = walk->vma;
+ int r;
+
+ r = hmm_vma_capture_migrate_range(start, end, walk);
+ if (r)
+ return r;
if (!(vma->vm_flags & (VM_IO | VM_PFNMAP)) &&
vma->vm_flags & VM_READ)
@@ -622,7 +900,7 @@ static int hmm_vma_walk_test(unsigned long start, unsigned long end,
(end - start) >> PAGE_SHIFT, 0))
return -EFAULT;
- hmm_pfns_fill(start, end, range, HMM_PFN_ERROR);
+ hmm_pfns_fill(start, end, hmm_vma_walk, HMM_PFN_ERROR);
/* Skip this vma and continue processing the next vma. */
return 1;
@@ -652,9 +930,17 @@ static const struct mm_walk_ops hmm_walk_ops = {
* the invalidation to finish.
* -EFAULT: A page was requested to be valid and could not be made valid
* ie it has no backing VMA or it is illegal to access
+ * -ERANGE: The range crosses multiple VMAs, or space for hmm_pfns array
+ * is too low.
*
* This is similar to get_user_pages(), except that it can read the page tables
* without mutating them (ie causing faults).
+ *
+ * If want to do migrate after faulting, call hmm_range_fault() with
+ * HMM_PFN_REQ_MIGRATE and initialize range.migrate field.
+ * After hmm_range_fault() call migrate_hmm_range_setup() instead of
+ * migrate_vma_setup() and after that follow normal migrate calls path.
+ *
*/
int hmm_range_fault(struct hmm_range *range)
{
@@ -662,16 +948,34 @@ int hmm_range_fault(struct hmm_range *range)
.range = range,
.last = range->start,
};
- struct mm_struct *mm = range->notifier->mm;
+ struct mm_struct *mm;
+ bool is_fault_path;
int ret;
+ /*
+ *
+ * Could be serving a device fault or come from migrate
+ * entry point. For the former we have not resolved the vma
+ * yet, and the latter we don't have a notifier (but have a vma).
+ *
+ */
+#ifdef CONFIG_DEVICE_MIGRATION
+ is_fault_path = !!range->notifier;
+ mm = is_fault_path ? range->notifier->mm : range->migrate->vma->vm_mm;
+#else
+ is_fault_path = true;
+ mm = range->notifier->mm;
+#endif
mmap_assert_locked(mm);
do {
/* If range is no longer valid force retry. */
- if (mmu_interval_check_retry(range->notifier,
- range->notifier_seq))
- return -EBUSY;
+ if (is_fault_path && mmu_interval_check_retry(range->notifier,
+ range->notifier_seq)) {
+ ret = -EBUSY;
+ break;
+ }
+
ret = walk_page_range(mm, hmm_vma_walk.last, range->end,
&hmm_walk_ops, &hmm_vma_walk);
/*
@@ -681,6 +985,19 @@ int hmm_range_fault(struct hmm_range *range)
* output, and all >= are still at their input values.
*/
} while (ret == -EBUSY);
+
+#ifdef CONFIG_DEVICE_MIGRATION
+ if (hmm_select_migrate(range) && range->migrate &&
+ hmm_vma_walk.mmu_range.owner) {
+ // The migrate_vma path has the following initialized
+ if (is_fault_path) {
+ range->migrate->vma = hmm_vma_walk.vma;
+ range->migrate->start = range->start;
+ range->migrate->end = hmm_vma_walk.end;
+ }
+ mmu_notifier_invalidate_range_end(&hmm_vma_walk.mmu_range);
+ }
+#endif
return ret;
}
EXPORT_SYMBOL(hmm_range_fault);
--
2.50.0
Hi,
kernel test robot noticed the following build errors:
[auto build test ERROR on 7aaa8047eafd0bd628065b15757d9b48c5f9c07d]
url: https://github.com/intel-lab-lkp/linux/commits/mpenttil-redhat-com/mm-Kconfig-changes-for-migrate-on-fault-for-device-pages/20260330-124915
base: 7aaa8047eafd0bd628065b15757d9b48c5f9c07d
patch link: https://lore.kernel.org/r/20260330043017.251808-4-mpenttil%40redhat.com
patch subject: [PATCH v7 3/6] mm/hmm: do the plumbing for HMM to participate in migration
config: hexagon-allnoconfig (https://download.01.org/0day-ci/archive/20260330/202603301832.rpYcya7E-lkp@intel.com/config)
compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project 2cd67b8b69f78e3f95918204320c3075a74ba16c)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260330/202603301832.rpYcya7E-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603301832.rpYcya7E-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from fs/aio.c:40:
>> include/linux/migrate.h:114:1: error: function definition is not allowed here
114 | {
| ^
include/linux/migrate.h:127:1: error: function definition is not allowed here
127 | {
| ^
include/linux/migrate.h:131:1: error: function definition is not allowed here
131 | {
| ^
In file included from fs/aio.c:41:
In file included from include/linux/ramfs.h:5:
In file included from include/linux/fs_parser.h:11:
>> include/linux/fs_context.h:141:1: error: function definition is not allowed here
141 | {
| ^
In file included from fs/aio.c:41:
In file included from include/linux/ramfs.h:5:
>> include/linux/fs_parser.h:75:1: error: function definition is not allowed here
75 | {
| ^
include/linux/fs_parser.h:95:1: error: function definition is not allowed here
95 | { return true; }
| ^
In file included from fs/aio.c:41:
>> include/linux/ramfs.h:15:1: error: function definition is not allowed here
15 | {
| ^
In file included from fs/aio.c:49:
>> fs/internal.h:113:1: error: function definition is not allowed here
113 | {
| ^
fs/internal.h:121:1: error: function definition is not allowed here
121 | {
| ^
fs/internal.h:150:1: error: function definition is not allowed here
150 | {
| ^
fs/internal.h:170:1: error: function definition is not allowed here
170 | {
| ^
>> fs/internal.h:214:6: error: conflicting types for 'in_group_or_capable'
214 | bool in_group_or_capable(struct mnt_idmap *idmap,
| ^
include/linux/fs.h:1842:6: note: previous declaration is here
1842 | bool in_group_or_capable(struct mnt_idmap *idmap,
| ^
In file included from fs/aio.c:49:
fs/internal.h:313:1: error: function definition is not allowed here
313 | {
| ^
fs/internal.h:319:1: error: function definition is not allowed here
319 | {
| ^
>> fs/internal.h:330:19: error: conflicting types for 'mnt_idmap_get'
330 | struct mnt_idmap *mnt_idmap_get(struct mnt_idmap *idmap);
| ^
include/linux/mnt_idmapping.h:124:19: note: previous declaration is here
124 | struct mnt_idmap *mnt_idmap_get(struct mnt_idmap *idmap);
| ^
In file included from fs/aio.c:49:
>> fs/internal.h:331:6: error: conflicting types for 'mnt_idmap_put'
331 | void mnt_idmap_put(struct mnt_idmap *idmap);
| ^
include/linux/mnt_idmapping.h:125:6: note: previous declaration is here
125 | void mnt_idmap_put(struct mnt_idmap *idmap);
| ^
In file included from fs/aio.c:49:
fs/internal.h:352:1: error: function definition is not allowed here
352 | {
| ^
>> fs/aio.c:245:1: error: function definition is not allowed here
245 | {
| ^
>> fs/aio.c:257:37: error: variable has incomplete type 'const struct file_operations'
257 | static const struct file_operations aio_ring_fops;
| ^
include/linux/fs_context.h:19:8: note: forward declaration of 'struct file_operations'
19 | struct file_operations;
| ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
--
In file included from mm/filemap.c:45:
>> include/linux/migrate.h:114:1: error: function definition is not allowed here
114 | {
| ^
include/linux/migrate.h:127:1: error: function definition is not allowed here
127 | {
| ^
include/linux/migrate.h:131:1: error: function definition is not allowed here
131 | {
| ^
In file included from mm/filemap.c:46:
>> include/linux/pipe_fs_i.h:162:1: error: function definition is not allowed here
162 | {
| ^
include/linux/pipe_fs_i.h:176:1: error: function definition is not allowed here
176 | {
| ^
include/linux/pipe_fs_i.h:186:1: error: function definition is not allowed here
186 | {
| ^
include/linux/pipe_fs_i.h:198:1: error: function definition is not allowed here
198 | {
| ^
include/linux/pipe_fs_i.h:207:1: error: function definition is not allowed here
207 | {
| ^
include/linux/pipe_fs_i.h:216:1: error: function definition is not allowed here
216 | {
| ^
include/linux/pipe_fs_i.h:225:1: error: function definition is not allowed here
225 | {
| ^
include/linux/pipe_fs_i.h:236:1: error: function definition is not allowed here
236 | {
| ^
include/linux/pipe_fs_i.h:245:1: error: function definition is not allowed here
245 | {
| ^
include/linux/pipe_fs_i.h:258:1: error: function definition is not allowed here
258 | {
| ^
include/linux/pipe_fs_i.h:269:1: error: function definition is not allowed here
269 | {
| ^
include/linux/pipe_fs_i.h:283:1: error: function definition is not allowed here
283 | {
| ^
include/linux/pipe_fs_i.h:296:1: error: function definition is not allowed here
296 | {
| ^
In file included from mm/filemap.c:47:
>> include/linux/splice.h:94:1: error: function definition is not allowed here
94 | {
| ^
In file included from mm/filemap.c:48:
>> include/linux/rcupdate_wait.h:63:1: error: function definition is not allowed here
63 | {
| ^
include/linux/rcupdate_wait.h:74:1: error: function definition is not allowed here
74 | {
| ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
--
In file included from mm/folio-compat.c:8:
>> include/linux/migrate.h:114:1: error: function definition is not allowed here
114 | {
| ^
include/linux/migrate.h:127:1: error: function definition is not allowed here
127 | {
| ^
include/linux/migrate.h:131:1: error: function definition is not allowed here
131 | {
| ^
In file included from mm/folio-compat.c:10:
In file included from include/linux/rmap.h:12:
In file included from include/linux/memcontrol.h:18:
>> include/linux/page_counter.h:58:1: error: function definition is not allowed here
58 | {
| ^
include/linux/page_counter.h:67:1: error: function definition is not allowed here
67 | {
| ^
include/linux/page_counter.h:82:1: error: function definition is not allowed here
82 | {
| ^
include/linux/page_counter.h:91:1: error: function definition is not allowed here
91 | {
| ^
include/linux/page_counter.h:109:39: error: function definition is not allowed here
109 | bool recursive_protection) {}
| ^
In file included from mm/folio-compat.c:10:
In file included from include/linux/rmap.h:12:
In file included from include/linux/memcontrol.h:19:
In file included from include/linux/vmpressure.h:11:
>> include/linux/eventfd.h:44:1: error: function definition is not allowed here
44 | {
| ^
include/linux/eventfd.h:88:1: error: function definition is not allowed here
88 | {
| ^
In file included from mm/folio-compat.c:10:
In file included from include/linux/rmap.h:12:
In file included from include/linux/memcontrol.h:19:
>> include/linux/vmpressure.h:48:58: error: function definition is not allowed here
48 | unsigned long scanned, unsigned long reclaimed) {}
| ^
include/linux/vmpressure.h:50:18: error: function definition is not allowed here
50 | int prio) {}
| ^
In file included from mm/folio-compat.c:10:
In file included from include/linux/rmap.h:12:
In file included from include/linux/memcontrol.h:23:
In file included from include/linux/writeback.h:11:
>> include/linux/flex_proportions.h:64:1: error: function definition is not allowed here
64 | {
| ^
In file included from mm/folio-compat.c:10:
In file included from include/linux/rmap.h:12:
In file included from include/linux/memcontrol.h:23:
In file included from include/linux/writeback.h:12:
>> include/linux/backing-dev-defs.h:281:1: error: function definition is not allowed here
281 | {
| ^
include/linux/backing-dev-defs.h:286:1: error: function definition is not allowed here
286 | {
| ^
include/linux/backing-dev-defs.h:290:1: error: function definition is not allowed here
290 | {
| ^
include/linux/backing-dev-defs.h:294:1: error: function definition is not allowed here
294 | {
| ^
include/linux/backing-dev-defs.h:298:1: error: function definition is not allowed here
298 | {
| ^
In file included from mm/folio-compat.c:10:
In file included from include/linux/rmap.h:12:
In file included from include/linux/memcontrol.h:23:
In file included from include/linux/writeback.h:13:
In file included from include/linux/blk_types.h:10:
>> include/linux/bvec.h:43:1: error: function definition is not allowed here
43 | {
| ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
--
In file included from mm/vmscan.c:42:
>> include/linux/migrate.h:114:1: error: function definition is not allowed here
114 | {
| ^
include/linux/migrate.h:127:1: error: function definition is not allowed here
127 | {
| ^
include/linux/migrate.h:131:1: error: function definition is not allowed here
131 | {
| ^
In file included from mm/vmscan.c:43:
>> include/linux/delayacct.h:255:1: error: function definition is not allowed here
255 | {}
| ^
include/linux/delayacct.h:257:1: error: function definition is not allowed here
257 | {}
| ^
include/linux/delayacct.h:259:1: error: function definition is not allowed here
259 | {}
| ^
include/linux/delayacct.h:261:1: error: function definition is not allowed here
261 | {}
| ^
include/linux/delayacct.h:263:1: error: function definition is not allowed here
263 | {}
| ^
include/linux/delayacct.h:266:1: error: function definition is not allowed here
266 | { return 0; }
| ^
include/linux/delayacct.h:268:1: error: function definition is not allowed here
268 | { return 0; }
| ^
include/linux/delayacct.h:270:1: error: function definition is not allowed here
270 | { return 0; }
| ^
include/linux/delayacct.h:272:1: error: function definition is not allowed here
272 | {}
| ^
include/linux/delayacct.h:274:1: error: function definition is not allowed here
274 | {}
| ^
include/linux/delayacct.h:276:1: error: function definition is not allowed here
276 | {}
| ^
include/linux/delayacct.h:278:1: error: function definition is not allowed here
278 | {}
| ^
include/linux/delayacct.h:280:1: error: function definition is not allowed here
280 | {}
| ^
include/linux/delayacct.h:282:1: error: function definition is not allowed here
282 | {}
| ^
include/linux/delayacct.h:284:1: error: function definition is not allowed here
284 | {}
| ^
include/linux/delayacct.h:286:1: error: function definition is not allowed here
286 | {}
| ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
--
In file included from mm/shmem.c:73:
>> include/linux/migrate.h:114:1: error: function definition is not allowed here
114 | {
| ^
include/linux/migrate.h:127:1: error: function definition is not allowed here
127 | {
| ^
include/linux/migrate.h:131:1: error: function definition is not allowed here
131 | {
| ^
In file included from mm/shmem.c:77:
In file included from include/linux/syscalls.h:89:
>> include/linux/sem.h:18:1: error: function definition is not allowed here
18 | {
| ^
include/linux/sem.h:23:1: error: function definition is not allowed here
23 | {
| ^
In file included from mm/shmem.c:77:
In file included from include/linux/syscalls.h:95:
In file included from include/trace/syscall.h:5:
>> include/linux/tracepoint.h:49:1: error: function definition is not allowed here
49 | {
| ^
include/linux/tracepoint.h:75:1: error: function definition is not allowed here
75 | {
| ^
include/linux/tracepoint.h:80:1: error: function definition is not allowed here
80 | {
| ^
include/linux/tracepoint.h:85:1: error: function definition is not allowed here
85 | {
| ^
include/linux/tracepoint.h:92:1: error: function definition is not allowed here
92 | {
| ^
include/linux/tracepoint.h:99:1: error: function definition is not allowed here
99 | {
| ^
include/linux/tracepoint.h:127:1: error: function definition is not allowed here
127 | { }
| ^
include/linux/tracepoint.h:129:1: error: function definition is not allowed here
129 | {
| ^
include/linux/tracepoint.h:159:1: error: function definition is not allowed here
159 | {
| ^
In file included from mm/shmem.c:77:
In file included from include/linux/syscalls.h:95:
In file included from include/trace/syscall.h:7:
In file included from include/linux/trace_events.h:6:
In file included from include/linux/ring_buffer.h:7:
>> include/linux/poll.h:43:1: error: function definition is not allowed here
43 | {
| ^
include/linux/poll.h:63:1: error: function definition is not allowed here
63 | {
| ^
include/linux/poll.h:68:1: error: function definition is not allowed here
68 | {
| ^
include/linux/poll.h:74:1: error: function definition is not allowed here
74 | {
| ^
include/linux/poll.h:79:1: error: function definition is not allowed here
79 | {
| ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
..
vim +114 include/linux/migrate.h
112
113 static inline enum migrate_vma_info hmm_select_migrate(struct hmm_range *range)
> 114 {
115 return MIGRATE_VMA_SELECT_NONE;
116 }
117
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi,
kernel test robot noticed the following build errors:
[auto build test ERROR on 7aaa8047eafd0bd628065b15757d9b48c5f9c07d]
url: https://github.com/intel-lab-lkp/linux/commits/mpenttil-redhat-com/mm-Kconfig-changes-for-migrate-on-fault-for-device-pages/20260330-124915
base: 7aaa8047eafd0bd628065b15757d9b48c5f9c07d
patch link: https://lore.kernel.org/r/20260330043017.251808-4-mpenttil%40redhat.com
patch subject: [PATCH v7 3/6] mm/hmm: do the plumbing for HMM to participate in migration
config: powerpc-allnoconfig (https://download.01.org/0day-ci/archive/20260330/202603301844.FdEMshbo-lkp@intel.com/config)
compiler: powerpc-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260330/202603301844.FdEMshbo-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603301844.FdEMshbo-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
fs/aio.c:702:21: error: assignment to 'struct kioctx_table *' from incompatible pointer type 'struct kioctx_table *' [-Wincompatible-pointer-types]
702 | old = rcu_dereference_raw(mm->ioctx_table);
| ^
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
fs/aio.c:719:13: error: invalid storage class for function 'aio_nr_sub'
719 | static void aio_nr_sub(unsigned nr)
| ^~~~~~~~~~
fs/aio.c:732:23: error: invalid storage class for function 'ioctx_alloc'
732 | static struct kioctx *ioctx_alloc(unsigned nr_events)
| ^~~~~~~~~~~
fs/aio.c:847:12: error: invalid storage class for function 'kill_ioctx'
847 | static int kill_ioctx(struct mm_struct *mm, struct kioctx *ctx,
| ^~~~~~~~~~
fs/aio.c: In function 'kill_ioctx':
fs/aio.c:858:15: error: assignment to 'struct kioctx_table *' from incompatible pointer type 'struct kioctx_table *' [-Wincompatible-pointer-types]
858 | table = rcu_dereference_raw(mm->ioctx_table);
| ^
fs/aio.c:859:21: warning: comparison of distinct pointer types lacks a cast [-Wcompare-distinct-pointer-types]
859 | WARN_ON(ctx != rcu_access_pointer(table->table[ctx->id]));
| ^~
include/asm-generic/bug.h:110:32: note: in definition of macro 'WARN_ON'
110 | int __ret_warn_on = !!(condition); \
| ^~~~~~~~~
In file included from include/linux/rbtree.h:24,
from include/linux/mm_types.h:11,
from include/linux/mmzone.h:22,
from include/linux/gfp.h:7,
from include/linux/xarray.h:16,
from include/linux/list_lru.h:14,
from include/linux/fs/super_types.h:7,
from include/linux/fs/super.h:5,
from include/linux/fs.h:5:
fs/aio.c: In function 'exit_aio':
include/linux/rcupdate.h:526:1: error: initialization of 'struct kioctx_table *' from incompatible pointer type 'struct kioctx_table *' [-Wincompatible-pointer-types]
526 | ({ \
| ^
include/linux/rcupdate.h:531:32: note: in expansion of macro '__rcu_dereference_raw'
531 | #define rcu_dereference_raw(p) __rcu_dereference_raw(p, __UNIQUE_ID(rcu))
| ^~~~~~~~~~~~~~~~~~~~~
fs/aio.c:893:38: note: in expansion of macro 'rcu_dereference_raw'
893 | struct kioctx_table *table = rcu_dereference_raw(mm->ioctx_table);
| ^~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:520:1: error: initialization of 'struct kioctx *' from incompatible pointer type 'struct kioctx *' [-Wincompatible-pointer-types]
520 | ({ \
| ^
include/linux/rcupdate.h:743:9: note: in expansion of macro '__rcu_dereference_protected'
743 | __rcu_dereference_protected((p), __UNIQUE_ID(rcu), (c), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/aio.c:906:25: note: in expansion of macro 'rcu_dereference_protected'
906 | rcu_dereference_protected(table->table[i], true);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
fs/aio.c:933:13: error: invalid storage class for function 'put_reqs_available'
933 | static void put_reqs_available(struct kioctx *ctx, unsigned nr)
| ^~~~~~~~~~~~~~~~~~
fs/aio.c:950:13: error: invalid storage class for function '__get_reqs_available'
950 | static bool __get_reqs_available(struct kioctx *ctx)
| ^~~~~~~~~~~~~~~~~~~~
fs/aio.c:984:13: error: invalid storage class for function 'refill_reqs_available'
984 | static void refill_reqs_available(struct kioctx *ctx, unsigned head,
| ^~~~~~~~~~~~~~~~~~~~~
fs/aio.c:1013:13: error: invalid storage class for function 'user_refill_reqs_available'
1013 | static void user_refill_reqs_available(struct kioctx *ctx)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
fs/aio.c:1038:13: error: invalid storage class for function 'get_reqs_available'
1038 | static bool get_reqs_available(struct kioctx *ctx)
| ^~~~~~~~~~~~~~~~~~
fs/aio.c:1053:33: error: invalid storage class for function 'aio_get_req'
1053 | static inline struct aio_kiocb *aio_get_req(struct kioctx *ctx)
| ^~~~~~~~~~~
fs/aio.c:1074:23: error: invalid storage class for function 'lookup_ioctx'
1074 | static struct kioctx *lookup_ioctx(unsigned long ctx_id)
| ^~~~~~~~~~~~
fs/aio.c: In function 'lookup_ioctx':
fs/aio.c:1086:15: error: assignment to 'struct kioctx_table *' from incompatible pointer type 'struct kioctx_table *' [-Wincompatible-pointer-types]
1086 | table = rcu_dereference(mm->ioctx_table);
| ^
fs/aio.c:1092:13: error: assignment to 'struct kioctx *' from incompatible pointer type 'struct kioctx *' [-Wincompatible-pointer-types]
1092 | ctx = rcu_dereference(table->table[id]);
| ^
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
fs/aio.c:1102:20: error: invalid storage class for function 'iocb_destroy'
1102 | static inline void iocb_destroy(struct aio_kiocb *iocb)
| ^~~~~~~~~~~~
fs/aio.c:1120:13: error: invalid storage class for function 'aio_complete'
1120 | static void aio_complete(struct aio_kiocb *iocb)
| ^~~~~~~~~~~~
fs/aio.c:1205:20: error: invalid storage class for function 'iocb_put'
1205 | static inline void iocb_put(struct aio_kiocb *iocb)
| ^~~~~~~~
fs/aio.c:1217:13: error: invalid storage class for function 'aio_read_events_ring'
1217 | static long aio_read_events_ring(struct kioctx *ctx,
| ^~~~~~~~~~~~~~~~~~~~
fs/aio.c:1294:13: error: invalid storage class for function 'aio_read_events'
1294 | static bool aio_read_events(struct kioctx *ctx, long min_nr, long nr,
| ^~~~~~~~~~~~~~~
fs/aio.c:1311:13: error: invalid storage class for function 'read_events'
1311 | static long read_events(struct kioctx *ctx, long min_nr, long nr,
| ^~~~~~~~~~~
In file included from include/linux/syscalls.h:105:
>> arch/powerpc/include/asm/syscall_wrapper.h:21:21: error: invalid storage class for function '__se_sys_io_setup'
21 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:226:36: note: in expansion of macro 'SYSCALL_DEFINEx'
226 | #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1381:1: note: in expansion of macro 'SYSCALL_DEFINE2'
1381 | SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:22:28: error: invalid storage class for function '__do_sys_io_setup'
22 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:226:36: note: in expansion of macro 'SYSCALL_DEFINEx'
226 | #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1381:1: note: in expansion of macro 'SYSCALL_DEFINE2'
1381 | SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:23:14: error: static declaration of 'sys_io_setup' follows non-static declaration
23 | long sys##name(const struct pt_regs *regs) \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:226:36: note: in expansion of macro 'SYSCALL_DEFINEx'
226 | #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1381:1: note: in expansion of macro 'SYSCALL_DEFINE2'
1381 | SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
| ^~~~~~~~~~~~~~~
arch/powerpc/include/asm/syscall_wrapper.h:19:14: note: previous declaration of 'sys_io_setup' with type 'long int(const struct pt_regs *)'
19 | long sys##name(const struct pt_regs *regs); \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:226:36: note: in expansion of macro 'SYSCALL_DEFINEx'
226 | #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1381:1: note: in expansion of macro 'SYSCALL_DEFINE2'
1381 | SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'sys_io_setup':
>> arch/powerpc/include/asm/syscall_wrapper.h:25:24: error: implicit declaration of function '__se_sys_io_setup'; did you mean 'sys_io_setup'? [-Wimplicit-function-declaration]
25 | return __se_sys##name(SC_POWERPC_REGS_TO_ARGS(x,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:226:36: note: in expansion of macro 'SYSCALL_DEFINEx'
226 | #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1381:1: note: in expansion of macro 'SYSCALL_DEFINE2'
1381 | SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
arch/powerpc/include/asm/syscall_wrapper.h:27:21: error: invalid storage class for function '__se_sys_io_setup'
27 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:226:36: note: in expansion of macro 'SYSCALL_DEFINEx'
226 | #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1381:1: note: in expansion of macro 'SYSCALL_DEFINE2'
1381 | SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
| ^~~~~~~~~~~~~~~
fs/aio.c: In function '__se_sys_io_setup':
>> arch/powerpc/include/asm/syscall_wrapper.h:29:28: error: implicit declaration of function '__do_sys_io_setup'; did you mean '__se_sys_io_setup'? [-Wimplicit-function-declaration]
29 | long ret = __do_sys##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:226:36: note: in expansion of macro 'SYSCALL_DEFINEx'
226 | #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1381:1: note: in expansion of macro 'SYSCALL_DEFINE2'
1381 | SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
arch/powerpc/include/asm/syscall_wrapper.h:34:28: error: invalid storage class for function '__do_sys_io_setup'
34 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:226:36: note: in expansion of macro 'SYSCALL_DEFINEx'
226 | #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1381:1: note: in expansion of macro 'SYSCALL_DEFINE2'
1381 | SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:21:21: error: invalid storage class for function '__se_sys_io_destroy'
21 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:225:36: note: in expansion of macro 'SYSCALL_DEFINEx'
225 | #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1450:1: note: in expansion of macro 'SYSCALL_DEFINE1'
1450 | SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:22:28: error: invalid storage class for function '__do_sys_io_destroy'
22 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:225:36: note: in expansion of macro 'SYSCALL_DEFINEx'
225 | #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1450:1: note: in expansion of macro 'SYSCALL_DEFINE1'
1450 | SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:23:14: error: static declaration of 'sys_io_destroy' follows non-static declaration
23 | long sys##name(const struct pt_regs *regs) \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:225:36: note: in expansion of macro 'SYSCALL_DEFINEx'
225 | #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1450:1: note: in expansion of macro 'SYSCALL_DEFINE1'
1450 | SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
| ^~~~~~~~~~~~~~~
arch/powerpc/include/asm/syscall_wrapper.h:19:14: note: previous declaration of 'sys_io_destroy' with type 'long int(const struct pt_regs *)'
19 | long sys##name(const struct pt_regs *regs); \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:225:36: note: in expansion of macro 'SYSCALL_DEFINEx'
225 | #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1450:1: note: in expansion of macro 'SYSCALL_DEFINE1'
1450 | SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'sys_io_destroy':
>> arch/powerpc/include/asm/syscall_wrapper.h:25:24: error: implicit declaration of function '__se_sys_io_destroy'; did you mean 'sys_io_destroy'? [-Wimplicit-function-declaration]
25 | return __se_sys##name(SC_POWERPC_REGS_TO_ARGS(x,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:225:36: note: in expansion of macro 'SYSCALL_DEFINEx'
225 | #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1450:1: note: in expansion of macro 'SYSCALL_DEFINE1'
1450 | SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
arch/powerpc/include/asm/syscall_wrapper.h:27:21: error: invalid storage class for function '__se_sys_io_destroy'
27 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:225:36: note: in expansion of macro 'SYSCALL_DEFINEx'
225 | #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1450:1: note: in expansion of macro 'SYSCALL_DEFINE1'
1450 | SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
| ^~~~~~~~~~~~~~~
fs/aio.c: In function '__se_sys_io_destroy':
>> arch/powerpc/include/asm/syscall_wrapper.h:29:28: error: implicit declaration of function '__do_sys_io_destroy'; did you mean '__se_sys_io_destroy'? [-Wimplicit-function-declaration]
29 | long ret = __do_sys##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:225:36: note: in expansion of macro 'SYSCALL_DEFINEx'
225 | #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1450:1: note: in expansion of macro 'SYSCALL_DEFINE1'
1450 | SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
arch/powerpc/include/asm/syscall_wrapper.h:34:28: error: invalid storage class for function '__do_sys_io_destroy'
34 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:225:36: note: in expansion of macro 'SYSCALL_DEFINEx'
225 | #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:1450:1: note: in expansion of macro 'SYSCALL_DEFINE1'
1450 | SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
| ^~~~~~~~~~~~~~~
fs/aio.c:1480:13: error: invalid storage class for function 'aio_remove_iocb'
1480 | static void aio_remove_iocb(struct aio_kiocb *iocb)
| ^~~~~~~~~~~~~~~
fs/aio.c:1490:13: error: invalid storage class for function 'aio_complete_rw'
1490 | static void aio_complete_rw(struct kiocb *kiocb, long res)
| ^~~~~~~~~~~~~~~
fs/aio.c:1509:12: error: invalid storage class for function 'aio_prep_rw'
1509 | static int aio_prep_rw(struct kiocb *req, const struct iocb *iocb, int rw_type)
| ^~~~~~~~~~~
fs/aio.c:1544:16: error: invalid storage class for function 'aio_setup_rw'
1544 | static ssize_t aio_setup_rw(int rw, const struct iocb *iocb,
| ^~~~~~~~~~~~
fs/aio.c: In function 'aio_setup_rw':
fs/aio.c:1552:57: error: passing argument 4 of 'import_ubuf' from incompatible pointer type [-Wincompatible-pointer-types]
1552 | ssize_t ret = import_ubuf(rw, buf, len, iter);
| ^~~~
| |
| struct iov_iter *
In file included from fs/aio.c:23:
include/linux/uio.h:370:74: note: expected 'struct iov_iter *' but argument is of type 'struct iov_iter *'
370 | int import_ubuf(int type, void __user *buf, size_t len, struct iov_iter *i);
| ~~~~~~~~~~~~~~~~~^
fs/aio.c:1557:65: error: passing argument 6 of '__import_iovec' from incompatible pointer type [-Wincompatible-pointer-types]
1557 | return __import_iovec(rw, buf, len, UIO_FASTIOV, iovec, iter, compat);
| ^~~~
| |
| struct iov_iter *
include/linux/uio.h:369:35: note: expected 'struct iov_iter *' but argument is of type 'struct iov_iter *'
369 | struct iov_iter *i, bool compat);
| ~~~~~~~~~~~~~~~~~^
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
fs/aio.c:1560:20: error: invalid storage class for function 'aio_rw_done'
1560 | static inline void aio_rw_done(struct kiocb *req, ssize_t ret)
| ^~~~~~~~~~~
fs/aio.c:1580:12: error: invalid storage class for function 'aio_read'
1580 | static int aio_read(struct kiocb *req, const struct iocb *iocb,
| ^~~~~~~~
fs/aio.c: In function 'aio_read':
fs/aio.c:1584:25: error: storage size of 'iter' isn't known
1584 | struct iov_iter iter;
| ^~~~
fs/aio.c:1584:25: warning: unused variable 'iter' [-Wunused-variable]
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
fs/aio.c:1607:12: error: invalid storage class for function 'aio_write'
1607 | static int aio_write(struct kiocb *req, const struct iocb *iocb,
| ^~~~~~~~~
fs/aio.c: In function 'aio_write':
fs/aio.c:1611:25: error: storage size of 'iter' isn't known
1611 | struct iov_iter iter;
| ^~~~
fs/aio.c:1611:25: warning: unused variable 'iter' [-Wunused-variable]
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
fs/aio.c:1639:13: error: invalid storage class for function 'aio_fsync_work'
1639 | static void aio_fsync_work(struct work_struct *work)
| ^~~~~~~~~~~~~~
In file included from include/linux/bitmap.h:9,
from include/linux/nodemask.h:91,
from include/linux/list_lru.h:12:
fs/aio.c: In function 'aio_fsync_work':
fs/aio.c:1643:38: error: passing argument 1 of 'class_override_creds_constructor' from incompatible pointer type [-Wincompatible-pointer-types]
1643 | scoped_with_creds(iocb->fsync.creds)
| ~~~~~~~~~~~^~~~~~
| |
| struct cred *
include/linux/cleanup.h:306:32: note: in definition of macro '__scoped_class'
306 | for (CLASS(_name, var)(args); ; ({ goto _label; })) \
| ^~~~
include/linux/cred.h:195:9: note: in expansion of macro 'scoped_class'
195 | scoped_class(override_creds, __UNIQUE_ID(label), cred)
| ^~~~~~~~~~~~
fs/aio.c:1643:9: note: in expansion of macro 'scoped_with_creds'
1643 | scoped_with_creds(iocb->fsync.creds)
| ^~~~~~~~~~~~~~~~~
include/linux/cred.h:192:64: note: expected 'const struct cred *' but argument is of type 'struct cred *'
192 | override_creds(override_cred), const struct cred *override_cred)
| ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
include/linux/cleanup.h:285:58: note: in definition of macro 'DEFINE_CLASS'
285 | static __always_inline _type class_##_name##_constructor(_init_args) \
| ^~~~~~~~~~
fs/aio.c:1646:29: error: passing argument 1 of 'put_cred' from incompatible pointer type [-Wincompatible-pointer-types]
1646 | put_cred(iocb->fsync.creds);
| ~~~~~~~~~~~^~~~~~
| |
| struct cred *
In file included from include/linux/sched/signal.h:10,
from include/linux/rcuwait.h:6,
from include/linux/percpu-rwsem.h:7,
from include/linux/fs/super_types.h:13:
include/linux/cred.h:277:48: note: expected 'const struct cred *' but argument is of type 'struct cred *'
277 | static inline void put_cred(const struct cred *cred)
| ~~~~~~~~~~~~~~~~~~~^~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
fs/aio.c:1650:12: error: invalid storage class for function 'aio_fsync'
1650 | static int aio_fsync(struct fsync_iocb *req, const struct iocb *iocb,
| ^~~~~~~~~
fs/aio.c: In function 'aio_fsync':
fs/aio.c:1660:20: error: assignment to 'struct cred *' from incompatible pointer type 'struct cred *' [-Wincompatible-pointer-types]
1660 | req->creds = prepare_creds();
| ^
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
fs/aio.c:1670:13: error: invalid storage class for function 'aio_poll_put_work'
1670 | static void aio_poll_put_work(struct work_struct *work)
| ^~~~~~~~~~~~~~~~~
fs/aio.c:1686:13: error: invalid storage class for function 'poll_iocb_lock_wq'
1686 | static bool poll_iocb_lock_wq(struct poll_iocb *req)
| ^~~~~~~~~~~~~~~~~
fs/aio.c:1717:13: error: invalid storage class for function 'poll_iocb_unlock_wq'
1717 | static void poll_iocb_unlock_wq(struct poll_iocb *req)
| ^~~~~~~~~~~~~~~~~~~
fs/aio.c:1723:13: error: invalid storage class for function 'aio_poll_complete_work'
1723 | static void aio_poll_complete_work(struct work_struct *work)
| ^~~~~~~~~~~~~~~~~~~~~~
fs/aio.c:1769:12: error: invalid storage class for function 'aio_poll_cancel'
1769 | static int aio_poll_cancel(struct kiocb *iocb)
| ^~~~~~~~~~~~~~~
fs/aio.c:1786:12: error: invalid storage class for function 'aio_poll_wake'
1786 | static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,
| ^~~~~~~~~~~~~
fs/aio.c:1876:1: error: invalid storage class for function 'aio_poll_queue_proc'
1876 | aio_poll_queue_proc(struct file *file, struct wait_queue_head *head,
| ^~~~~~~~~~~~~~~~~~~
fs/aio.c:1893:12: error: invalid storage class for function 'aio_poll'
1893 | static int aio_poll(struct aio_kiocb *aiocb, const struct iocb *iocb)
| ^~~~~~~~
fs/aio.c:1968:12: error: invalid storage class for function '__io_submit_one'
1968 | static int __io_submit_one(struct kioctx *ctx, const struct iocb *iocb,
| ^~~~~~~~~~~~~~~
fs/aio.c:2022:12: error: invalid storage class for function 'io_submit_one'
2022 | static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
| ^~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:21:21: error: invalid storage class for function '__se_sys_io_submit'
21 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2081:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2081 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:22:28: error: invalid storage class for function '__do_sys_io_submit'
22 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2081:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2081 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:23:14: error: static declaration of 'sys_io_submit' follows non-static declaration
23 | long sys##name(const struct pt_regs *regs) \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2081:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2081 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
| ^~~~~~~~~~~~~~~
arch/powerpc/include/asm/syscall_wrapper.h:19:14: note: previous declaration of 'sys_io_submit' with type 'long int(const struct pt_regs *)'
19 | long sys##name(const struct pt_regs *regs); \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2081:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2081 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'sys_io_submit':
>> arch/powerpc/include/asm/syscall_wrapper.h:25:24: error: implicit declaration of function '__se_sys_io_submit'; did you mean 'sys_io_submit'? [-Wimplicit-function-declaration]
25 | return __se_sys##name(SC_POWERPC_REGS_TO_ARGS(x,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2081:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2081 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
arch/powerpc/include/asm/syscall_wrapper.h:27:21: error: invalid storage class for function '__se_sys_io_submit'
27 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2081:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2081 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function '__se_sys_io_submit':
>> arch/powerpc/include/asm/syscall_wrapper.h:29:28: error: implicit declaration of function '__do_sys_io_submit'; did you mean '__se_sys_io_submit'? [-Wimplicit-function-declaration]
29 | long ret = __do_sys##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2081:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2081 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
arch/powerpc/include/asm/syscall_wrapper.h:34:28: error: invalid storage class for function '__do_sys_io_submit'
34 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2081:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2081 | SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:21:21: error: invalid storage class for function '__se_sys_io_cancel'
21 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2175:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2175 | SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:22:28: error: invalid storage class for function '__do_sys_io_cancel'
22 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2175:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2175 | SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
| ^~~~~~~~~~~~~~~
>> arch/powerpc/include/asm/syscall_wrapper.h:23:14: error: static declaration of 'sys_io_cancel' follows non-static declaration
23 | long sys##name(const struct pt_regs *regs) \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2175:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2175 | SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
| ^~~~~~~~~~~~~~~
arch/powerpc/include/asm/syscall_wrapper.h:19:14: note: previous declaration of 'sys_io_cancel' with type 'long int(const struct pt_regs *)'
19 | long sys##name(const struct pt_regs *regs); \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2175:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2175 | SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'sys_io_cancel':
>> arch/powerpc/include/asm/syscall_wrapper.h:25:24: error: implicit declaration of function '__se_sys_io_cancel'; did you mean 'sys_io_cancel'? [-Wimplicit-function-declaration]
25 | return __se_sys##name(SC_POWERPC_REGS_TO_ARGS(x,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2175:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2175 | SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
arch/powerpc/include/asm/syscall_wrapper.h:27:21: error: invalid storage class for function '__se_sys_io_cancel'
27 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2175:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2175 | SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function '__se_sys_io_cancel':
>> arch/powerpc/include/asm/syscall_wrapper.h:29:28: error: implicit declaration of function '__do_sys_io_cancel'; did you mean '__se_sys_io_cancel'? [-Wimplicit-function-declaration]
29 | long ret = __do_sys##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2175:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2175 | SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
arch/powerpc/include/asm/syscall_wrapper.h:34:28: error: invalid storage class for function '__do_sys_io_cancel'
34 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:227:36: note: in expansion of macro 'SYSCALL_DEFINEx'
227 | #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2175:1: note: in expansion of macro 'SYSCALL_DEFINE3'
2175 | SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
| ^~~~~~~~~~~~~~~
fs/aio.c:2217:13: error: invalid storage class for function 'do_io_getevents'
2217 | static long do_io_getevents(aio_context_t ctx_id,
| ^~~~~~~~~~~~~~~
arch/powerpc/include/asm/syscall_wrapper.h:21:21: error: invalid storage class for function '__se_sys_io_pgetevents'
21 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:230:36: note: in expansion of macro 'SYSCALL_DEFINEx'
230 | #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2275:1: note: in expansion of macro 'SYSCALL_DEFINE6'
2275 | SYSCALL_DEFINE6(io_pgetevents,
| ^~~~~~~~~~~~~~~
arch/powerpc/include/asm/syscall_wrapper.h:22:28: error: invalid storage class for function '__do_sys_io_pgetevents'
22 | static inline long __do_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:230:36: note: in expansion of macro 'SYSCALL_DEFINEx'
230 | #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2275:1: note: in expansion of macro 'SYSCALL_DEFINE6'
2275 | SYSCALL_DEFINE6(io_pgetevents,
| ^~~~~~~~~~~~~~~
arch/powerpc/include/asm/syscall_wrapper.h:23:14: error: static declaration of 'sys_io_pgetevents' follows non-static declaration
23 | long sys##name(const struct pt_regs *regs) \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:230:36: note: in expansion of macro 'SYSCALL_DEFINEx'
230 | #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2275:1: note: in expansion of macro 'SYSCALL_DEFINE6'
2275 | SYSCALL_DEFINE6(io_pgetevents,
| ^~~~~~~~~~~~~~~
arch/powerpc/include/asm/syscall_wrapper.h:19:14: note: previous declaration of 'sys_io_pgetevents' with type 'long int(const struct pt_regs *)'
19 | long sys##name(const struct pt_regs *regs); \
| ^~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:230:36: note: in expansion of macro 'SYSCALL_DEFINEx'
230 | #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2275:1: note: in expansion of macro 'SYSCALL_DEFINE6'
2275 | SYSCALL_DEFINE6(io_pgetevents,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'sys_io_pgetevents':
arch/powerpc/include/asm/syscall_wrapper.h:25:24: error: implicit declaration of function '__se_sys_io_pgetevents'; did you mean 'sys_io_pgetevents'? [-Wimplicit-function-declaration]
25 | return __se_sys##name(SC_POWERPC_REGS_TO_ARGS(x,__VA_ARGS__)); \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:230:36: note: in expansion of macro 'SYSCALL_DEFINEx'
230 | #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2275:1: note: in expansion of macro 'SYSCALL_DEFINE6'
2275 | SYSCALL_DEFINE6(io_pgetevents,
| ^~~~~~~~~~~~~~~
fs/aio.c: In function 'softleaf_entry_wait_on_locked':
arch/powerpc/include/asm/syscall_wrapper.h:27:21: error: invalid storage class for function '__se_sys_io_pgetevents'
27 | static long __se_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
| ^~~~~~~~
include/linux/syscalls.h:236:9: note: in expansion of macro '__SYSCALL_DEFINEx'
236 | __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
| ^~~~~~~~~~~~~~~~~
include/linux/syscalls.h:230:36: note: in expansion of macro 'SYSCALL_DEFINEx'
230 | #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
| ^~~~~~~~~~~~~~~
fs/aio.c:2275:1: note: in expansion of macro 'SYSCALL_DEFINE6'
2275 | SYSCALL_DEFINE6(io_pgetevents,
..
vim +49 arch/powerpc/include/asm/pgalloc.h
0186f47e703fb7 Kumar Gala 2008-11-19 6
de3b87611dd1f3 Balbir Singh 2017-05-02 7 #ifndef MODULE
de3b87611dd1f3 Balbir Singh 2017-05-02 @8 static inline gfp_t pgtable_gfp_flags(struct mm_struct *mm, gfp_t gfp)
de3b87611dd1f3 Balbir Singh 2017-05-02 9 {
de3b87611dd1f3 Balbir Singh 2017-05-02 @10 if (unlikely(mm == &init_mm))
de3b87611dd1f3 Balbir Singh 2017-05-02 11 return gfp;
de3b87611dd1f3 Balbir Singh 2017-05-02 12 return gfp | __GFP_ACCOUNT;
de3b87611dd1f3 Balbir Singh 2017-05-02 13 }
de3b87611dd1f3 Balbir Singh 2017-05-02 14 #else /* !MODULE */
de3b87611dd1f3 Balbir Singh 2017-05-02 15 static inline gfp_t pgtable_gfp_flags(struct mm_struct *mm, gfp_t gfp)
de3b87611dd1f3 Balbir Singh 2017-05-02 16 {
de3b87611dd1f3 Balbir Singh 2017-05-02 17 return gfp | __GFP_ACCOUNT;
de3b87611dd1f3 Balbir Singh 2017-05-02 18 }
de3b87611dd1f3 Balbir Singh 2017-05-02 19 #endif /* MODULE */
de3b87611dd1f3 Balbir Singh 2017-05-02 20
75f296d93bcebc Levin, Alexander (Sasha Levin 2017-11-15 21) #define PGALLOC_GFP (GFP_KERNEL | __GFP_ZERO)
5b6c133e080100 Michael Ellerman 2017-08-15 22
dc096864ba784c Christophe Leroy 2019-04-26 23 pte_t *pte_fragment_alloc(struct mm_struct *mm, int kernel);
dc096864ba784c Christophe Leroy 2019-04-26 24
dc096864ba784c Christophe Leroy 2019-04-26 @25 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
dc096864ba784c Christophe Leroy 2019-04-26 26 {
dc096864ba784c Christophe Leroy 2019-04-26 27 return (pte_t *)pte_fragment_alloc(mm, 1);
dc096864ba784c Christophe Leroy 2019-04-26 28 }
dc096864ba784c Christophe Leroy 2019-04-26 29
dc096864ba784c Christophe Leroy 2019-04-26 @30 static inline pgtable_t pte_alloc_one(struct mm_struct *mm)
dc096864ba784c Christophe Leroy 2019-04-26 31 {
dc096864ba784c Christophe Leroy 2019-04-26 32 return (pgtable_t)pte_fragment_alloc(mm, 0);
dc096864ba784c Christophe Leroy 2019-04-26 33 }
dc096864ba784c Christophe Leroy 2019-04-26 34
dc096864ba784c Christophe Leroy 2019-04-26 35 void pte_frag_destroy(void *pte_frag);
dc096864ba784c Christophe Leroy 2019-04-26 36 void pte_fragment_free(unsigned long *table, int kernel);
dc096864ba784c Christophe Leroy 2019-04-26 37
dc096864ba784c Christophe Leroy 2019-04-26 @38 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
dc096864ba784c Christophe Leroy 2019-04-26 39 {
dc096864ba784c Christophe Leroy 2019-04-26 40 pte_fragment_free((unsigned long *)pte, 1);
dc096864ba784c Christophe Leroy 2019-04-26 41 }
dc096864ba784c Christophe Leroy 2019-04-26 42
dc096864ba784c Christophe Leroy 2019-04-26 @43 static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
dc096864ba784c Christophe Leroy 2019-04-26 44 {
dc096864ba784c Christophe Leroy 2019-04-26 45 pte_fragment_free((unsigned long *)ptepage, 0);
dc096864ba784c Christophe Leroy 2019-04-26 46 }
dc096864ba784c Christophe Leroy 2019-04-26 47
32cc0b7c9d508e Hugh Dickins 2023-07-11 48 /* arch use pte_free_defer() implementation in arch/powerpc/mm/pgtable-frag.c */
32cc0b7c9d508e Hugh Dickins 2023-07-11 @49 #define pte_free_defer pte_free_defer
32cc0b7c9d508e Hugh Dickins 2023-07-11 50 void pte_free_defer(struct mm_struct *mm, pgtable_t pgtable);
32cc0b7c9d508e Hugh Dickins 2023-07-11 51
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2026 Red Hat, Inc.