1. A computer-implemented method comprising: providing, by a user process, a request for data to an input-output device; in response to providing the request for data to the input-output device, receiving, by the user process and from the input-output device, a set of memory addresses for the requested data; in response to receiving the set of memory addresses for the requested data, determining a subset of the memory addresses for the requested data; in response to determining the subset of the memory addresses for the requested data, providing, by the user process and to a processor, a request for a processor to pre-fetch or inject data corresponding to the subset of the memory addresses for the requested data; after providing the request for the processor to pre-fetch or inject data corresponding to the subset of the memory addresses for the requested data, receiving, by a memory controller, the requested data and the set of memory addresses for the requested data; in response to receiving, by the memory controller, the requested data and the set of memory addresses for the requested data, determining, by the memory controller, that the received data includes data for the subset of memory addresses that has been requested to be pre-fetched or injected; and in response to determining that the received data includes the data for the subset of memory addresses that has been requested to be pre-fetched or injected, storing, by the memory controller, the data for the subset of memory addresses in a cache of the processor and storing remaining data of the received data for the memory addresses in a main memory.