@@ -368,7 +368,7 @@ struct siw_umem *siw_umem_get(u64 start, u64 len, bool writable)
368368 struct mm_struct * mm_s ;
369369 u64 first_page_va ;
370370 unsigned long mlock_limit ;
371- unsigned int foll_flags = FOLL_WRITE ;
371+ unsigned int foll_flags = FOLL_LONGTERM ;
372372 int num_pages , num_chunks , i , rv = 0 ;
373373
374374 if (!can_do_mlock ())
@@ -391,14 +391,14 @@ struct siw_umem *siw_umem_get(u64 start, u64 len, bool writable)
391391
392392 mmgrab (mm_s );
393393
394- if (! writable )
395- foll_flags |= FOLL_FORCE ;
394+ if (writable )
395+ foll_flags |= FOLL_WRITE ;
396396
397397 mmap_read_lock (mm_s );
398398
399399 mlock_limit = rlimit (RLIMIT_MEMLOCK ) >> PAGE_SHIFT ;
400400
401- if (num_pages + atomic64_read ( & mm_s -> pinned_vm ) > mlock_limit ) {
401+ if (atomic64_add_return ( num_pages , & mm_s -> pinned_vm ) > mlock_limit ) {
402402 rv = - ENOMEM ;
403403 goto out_sem_up ;
404404 }
@@ -411,38 +411,38 @@ struct siw_umem *siw_umem_get(u64 start, u64 len, bool writable)
411411 goto out_sem_up ;
412412 }
413413 for (i = 0 ; num_pages ; i ++ ) {
414- int got , nents = min_t (int , num_pages , PAGES_PER_CHUNK );
415-
416- umem -> page_chunk [i ].plist =
414+ int nents = min_t (int , num_pages , PAGES_PER_CHUNK );
415+ struct page * * plist =
417416 kcalloc (nents , sizeof (struct page * ), GFP_KERNEL );
418- if (!umem -> page_chunk [i ].plist ) {
417+
418+ if (!plist ) {
419419 rv = - ENOMEM ;
420420 goto out_sem_up ;
421421 }
422- got = 0 ;
422+ umem -> page_chunk [ i ]. plist = plist ;
423423 while (nents ) {
424- struct page * * plist = & umem -> page_chunk [i ].plist [got ];
425-
426- rv = pin_user_pages (first_page_va , nents ,
427- foll_flags | FOLL_LONGTERM ,
424+ rv = pin_user_pages (first_page_va , nents , foll_flags ,
428425 plist , NULL );
429426 if (rv < 0 )
430427 goto out_sem_up ;
431428
432429 umem -> num_pages += rv ;
433- atomic64_add (rv , & mm_s -> pinned_vm );
434430 first_page_va += rv * PAGE_SIZE ;
431+ plist += rv ;
435432 nents -= rv ;
436- got + = rv ;
433+ num_pages - = rv ;
437434 }
438- num_pages -= got ;
439435 }
440436out_sem_up :
441437 mmap_read_unlock (mm_s );
442438
443439 if (rv > 0 )
444440 return umem ;
445441
442+ /* Adjust accounting for pages not pinned */
443+ if (num_pages )
444+ atomic64_sub (num_pages , & mm_s -> pinned_vm );
445+
446446 siw_umem_release (umem , false);
447447
448448 return ERR_PTR (rv );
0 commit comments