# Transferring Memory to Other Tasks

The previous section explained how to use `ControlMem()` to grant and revoke write access to memory pages. You can also use `ControlMem()` to transfer ownership of memory pages to other tasks:

  `Err ControlMem( void *p, int32 size, int32 cmd, Item task )`

If the value of the `cmd` argument is `MEMC_GIVE`, the call gives the memory pages to the task specified by the task argument. In this case, the `p` argument, a pointer to a memory location, and the `size` argument, the amount of the contiguous memory, in bytes, beginning at the memory location specified by the `p` argument, together specify the memory to give away. If these two arguments specify any part of a page, the entire page is given away.

You can also give memory pages back to the kernel-and thereby return them to the system-wide free memory pool-by calling `ControlMem()` as described here, but with 0 as the value of the task argument. Memory pages can be returned to the kernel automatically when a task calls the `ScavengeMem()` function described in Reclaiming Memory for Other Tasks.