Hello. On Wed, Mar 09, 2022 at 04:52:15PM +0000, "T.J. Mercier" <tjmercier@xxxxxxxxxx> 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