A multiprocessor system comprising: a plurality of nodes and at least one memory, each node containing at least one processor (101; 621; 721; 821); a first cache (625; 725; 825) configured to store a plurality of first cache lines, the first cache (625; 725; 825) being private to at least one node among the plurality of nodes; and a second cache (605; 745; 845) configured to store a plurality of second cache lines, the second cache (605; 745; 845) being at a higher level than the first cache (625; 725; 825), wherein at least one of the first cache lines includes a first associated pointer pointing to a location of one of the second cache lines, wherein at least one of the second cache lines includes a second associated pointer pointing to a location of one of the first cache lines, wherein the first associated pointer points to the location of the second cache line which includes the second associated pointer, wherein the second associated pointer points to the location of the first cache line which includes the first associated pointer, and characterized in that the first cache (625; 725; 825) is a virtually tagged cache, each of the first cache lines includes a virtual tag, the second cache is a physically tagged cache, each of the second cache lines includes a physical tag, and wherein the at least one processor (101; 621; 721; 821) is configured to: generate a data request, perform a lookup in the first cache (625; 725; 825) based on a virtual address included in the data request, when the data misses in the first cache (625; 725; 825), select one of the first cache lines as a victim cache line, fill the data from a location of a hit cache line of the second cache (605; 745; 845) to a location of the victim cache line of the first cache (625; 725; 825) based on a physical address translated from the virtual address, store, in the location of the victim cache line of the first cache (625; 725; 825), the first associated pointer pointing to the location of the hit cache line of the second cache (605; 745; 845), and store, in the location of the hit cache line of the second cache (605; 745; 845), the second associated pointer pointing to the location of the victim cache line of the first cache (625; 725; 825). a plurality of nodes and at least one memory, each node containing at least one processor (101; 621; 721; 821); a first cache (625; 725; 825) configured to store a plurality of first cache lines, the first cache (625; 725; 825) being private to at least one node among the plurality of nodes; and a second cache (605; 745; 845) configured to store a plurality of second cache lines, the second cache (605; 745; 845) being at a higher level than the first cache (625; 725; 825), wherein at least one of the first cache lines includes a first associated pointer pointing to a location of one of the second cache lines, wherein at least one of the second cache lines includes a second associated pointer pointing to a location of one of the first cache lines, wherein the first associated pointer points to the location of the second cache line which includes the second associated pointer, wherein the second associated pointer points to the location of the first cache line which includes the first associated pointer, and characterized in that the first cache (625; 725; 825) is a virtually tagged cache, each of the first cache lines includes a virtual tag, the second cache is a physically tagged cache, each of the second cache lines includes a physical tag, and wherein the at least one processor (101; 621; 721; 821) is configured to: generate a data request, perform a lookup in the first cache (625; 725; 825) based on a virtual address included in the data request, when the data misses in the first cache (625; 725; 825), select one of the first cache lines as a victim cache line, fill the data from a location of a hit cache line of the second cache (605; 745; 845) to a location of the victim cache line of the first cache (625; 725; 825) based on a physical address translated from the virtual address, store, in the location of the victim cache line of the first cache (625; 725; 825), the first associated pointer pointing to the location of the hit cache line of the second cache (605; 745; 845), and store, in the location of the hit cache line of the second cache (605; 745; 845), the second associated pointer pointing to the location of the victim cache line of the first cache (625; 725; 825). generate a data request, perform a lookup in the first cache (625; 725; 825) based on a virtual address included in the data request, when the data misses in the first cache (625; 725; 825), select one of the first cache lines as a victim cache line, fill the data from a location of a hit cache line of the second cache (605; 745; 845) to a location of the victim cache line of the first cache (625; 725; 825) based on a physical address translated from the virtual address, store, in the location of the victim cache line of the first cache (625; 725; 825), the first associated pointer pointing to the location of the hit cache line of the second cache (605; 745; 845), and store, in the location of the hit cache line of the second cache (605; 745; 845), the second associated pointer pointing to the location of the victim cache line of the first cache (625; 725; 825).