[PATCH 3/4] mm: simplify device private page handling in hmm_range_fault
Ralph Campbell
rcampbell at nvidia.com
Fri Mar 20 01:33:04 UTC 2020
On 3/19/20 5:14 PM, Jason Gunthorpe wrote:
> On Tue, Mar 17, 2020 at 04:14:31PM -0700, Ralph Campbell wrote:
>
>> +static int dmirror_fault(struct dmirror *dmirror, unsigned long start,
>> + unsigned long end, bool write)
>> +{
>> + struct mm_struct *mm = dmirror->mm;
>> + unsigned long addr;
>> + uint64_t pfns[64];
>> + struct hmm_range range = {
>> + .notifier = &dmirror->notifier,
>> + .pfns = pfns,
>> + .flags = dmirror_hmm_flags,
>> + .values = dmirror_hmm_values,
>> + .pfn_shift = DPT_SHIFT,
>> + .pfn_flags_mask = ~(dmirror_hmm_flags[HMM_PFN_VALID] |
>> + dmirror_hmm_flags[HMM_PFN_WRITE]),
>
> Since pfns is not initialized pfn_flags_mask should be 0.
Good point.
>> + .default_flags = dmirror_hmm_flags[HMM_PFN_VALID] |
>> + (write ? dmirror_hmm_flags[HMM_PFN_WRITE] : 0),
>> + .dev_private_owner = dmirror->mdevice,
>> + };
>> + int ret = 0;
>
>> +static int dmirror_snapshot(struct dmirror *dmirror,
>> + struct hmm_dmirror_cmd *cmd)
>> +{
>> + struct mm_struct *mm = dmirror->mm;
>> + unsigned long start, end;
>> + unsigned long size = cmd->npages << PAGE_SHIFT;
>> + unsigned long addr;
>> + unsigned long next;
>> + uint64_t pfns[64];
>> + unsigned char perm[64];
>> + char __user *uptr;
>> + struct hmm_range range = {
>> + .pfns = pfns,
>> + .flags = dmirror_hmm_flags,
>> + .values = dmirror_hmm_values,
>> + .pfn_shift = DPT_SHIFT,
>> + .pfn_flags_mask = ~0ULL,
>
> Same here, especially since this is snapshot
>
> Jason
Actually, snapshot ignores pfn_flags_mask and default_flags.
In hmm_pte_need_fault(), HMM_FAULT_SNAPSHOT is checked and returns early before
checking pfn_flags_mask and default_flags since no faults are being requested.
More information about the dri-devel
mailing list