mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
mm: add account_locked_vm utility function
locked_vm accounting is done roughly the same way in five places, so unify them in a helper. Include the helper's caller in the debug print to distinguish between callsites. Error codes stay the same, so user-visible behavior does too. The one exception is that the -EPERM case in tce_account_locked_vm is removed because Alexey has never seen it triggered. [[email protected]: v3] Link: http://lkml.kernel.org/r/[email protected] [[email protected]: fix mm/util.c] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Daniel Jordan <[email protected]> Signed-off-by: Stephen Rothwell <[email protected]> Tested-by: Alexey Kardashevskiy <[email protected]> Acked-by: Alex Williamson <[email protected]> Cc: Alan Tull <[email protected]> Cc: Alex Williamson <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Christoph Lameter <[email protected]> Cc: Christophe Leroy <[email protected]> Cc: Davidlohr Bueso <[email protected]> Cc: Jason Gunthorpe <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: Moritz Fischer <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: Steve Sistare <[email protected]> Cc: Wu Hao <[email protected]> Cc: Ira Weiny <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
73b20c84d4
commit
79eb597cba
7 changed files with 98 additions and 190 deletions
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/dma-mapping.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include "dfl-afu.h"
|
||||
|
||||
|
|
@ -31,52 +32,6 @@ void afu_dma_region_init(struct dfl_feature_platform_data *pdata)
|
|||
afu->dma_regions = RB_ROOT;
|
||||
}
|
||||
|
||||
/**
|
||||
* afu_dma_adjust_locked_vm - adjust locked memory
|
||||
* @dev: port device
|
||||
* @npages: number of pages
|
||||
* @incr: increase or decrease locked memory
|
||||
*
|
||||
* Increase or decrease the locked memory size with npages input.
|
||||
*
|
||||
* Return 0 on success.
|
||||
* Return -ENOMEM if locked memory size is over the limit and no CAP_IPC_LOCK.
|
||||
*/
|
||||
static int afu_dma_adjust_locked_vm(struct device *dev, long npages, bool incr)
|
||||
{
|
||||
unsigned long locked, lock_limit;
|
||||
int ret = 0;
|
||||
|
||||
/* the task is exiting. */
|
||||
if (!current->mm)
|
||||
return 0;
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
|
||||
if (incr) {
|
||||
locked = current->mm->locked_vm + npages;
|
||||
lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
|
||||
|
||||
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
|
||||
ret = -ENOMEM;
|
||||
else
|
||||
current->mm->locked_vm += npages;
|
||||
} else {
|
||||
if (WARN_ON_ONCE(npages > current->mm->locked_vm))
|
||||
npages = current->mm->locked_vm;
|
||||
current->mm->locked_vm -= npages;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "[%d] RLIMIT_MEMLOCK %c%ld %ld/%ld%s\n", current->pid,
|
||||
incr ? '+' : '-', npages << PAGE_SHIFT,
|
||||
current->mm->locked_vm << PAGE_SHIFT, rlimit(RLIMIT_MEMLOCK),
|
||||
ret ? "- exceeded" : "");
|
||||
|
||||
up_write(¤t->mm->mmap_sem);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* afu_dma_pin_pages - pin pages of given dma memory region
|
||||
* @pdata: feature device platform data
|
||||
|
|
@ -92,7 +47,7 @@ static int afu_dma_pin_pages(struct dfl_feature_platform_data *pdata,
|
|||
struct device *dev = &pdata->dev->dev;
|
||||
int ret, pinned;
|
||||
|
||||
ret = afu_dma_adjust_locked_vm(dev, npages, true);
|
||||
ret = account_locked_vm(current->mm, npages, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -121,7 +76,7 @@ put_pages:
|
|||
free_pages:
|
||||
kfree(region->pages);
|
||||
unlock_vm:
|
||||
afu_dma_adjust_locked_vm(dev, npages, false);
|
||||
account_locked_vm(current->mm, npages, false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -141,7 +96,7 @@ static void afu_dma_unpin_pages(struct dfl_feature_platform_data *pdata,
|
|||
|
||||
put_all_pages(region->pages, npages);
|
||||
kfree(region->pages);
|
||||
afu_dma_adjust_locked_vm(dev, npages, false);
|
||||
account_locked_vm(current->mm, npages, false);
|
||||
|
||||
dev_dbg(dev, "%ld pages unpinned\n", npages);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue