Hello.
On Wed, Mar 09, 2022 at 04:52:15PM +0000, "T.J. Mercier" tjmercier@google.com wrote:
+int dma_buf_charge_transfer(struct dma_buf *dmabuf, struct gpucg *gpucg) +{ +#ifdef CONFIG_CGROUP_GPU
- struct gpucg *current_gpucg;
- int ret = 0;
- /*
* Verify that the cgroup of the process requesting the transfer is the
* same as the one the buffer is currently charged to.
*/
- current_gpucg = gpucg_get(current);
- mutex_lock(&dmabuf->lock);
- if (current_gpucg != dmabuf->gpucg) {
ret = -EPERM;
goto err;
- }
Add a shortcut for gpucg == current_gpucg?
- ret = gpucg_try_charge(gpucg, dmabuf->gpucg_dev, dmabuf->size);
- if (ret)
goto err;
- dmabuf->gpucg = gpucg;
- /* uncharge the buffer from the cgroup it's currently charged to. */
- gpucg_uncharge(current_gpucg, dmabuf->gpucg_dev, dmabuf->size);
I think gpucg_* API would need to cater for such transfers too since possibly transitional breach of a limit during the transfer may unnecessarily fail the operation.
My 0.02€, Michal