An integrated circuit, comprising: a core; a first level core cache memory coupled to the core; a shared core cache memory coupled to the core; a first cache controller coupled to the core and communicatively coupled to the first level core cache memory; a second cache controller coupled to the core and communicatively coupled to the shared core cache memory; and circuitry coupled to the core and communicatively coupled to the first cache controller and the second cache controller to: determine if a workload has a large code footprint based on a number of first level code cache misses from the workload and a number of first level data cache misses from the workload, and, if so determined, partition N ways of the shared core cache memory into first and second chunks of ways with the first chunk of M ways reserved for code cache lines from the workload and the second chunk of N minus M ways reserved for data cache lines from the workload, where N and M are positive integer values and N minus M is greater than zero, characterized in that: determining if a workload has a large code footprint comprises: counting the number of first level code cache misses from the workload; counting the number of first level data cache misses from the workload; and determining that the workload has the large code footprint if the counted number of first level code cache misses exceeds the counted number of first level data cache misses after a counted number of first level cache misses exceeds a threshold. a core; a first level core cache memory coupled to the core; a shared core cache memory coupled to the core; a first cache controller coupled to the core and communicatively coupled to the first level core cache memory; a second cache controller coupled to the core and communicatively coupled to the shared core cache memory; and circuitry coupled to the core and communicatively coupled to the first cache controller and the second cache controller to: determine if a workload has a large code footprint based on a number of first level code cache misses from the workload and a number of first level data cache misses from the workload, and, if so determined, partition N ways of the shared core cache memory into first and second chunks of ways with the first chunk of M ways reserved for code cache lines from the workload and the second chunk of N minus M ways reserved for data cache lines from the workload, where N and M are positive integer values and N minus M is greater than zero, determine if a workload has a large code footprint based on a number of first level code cache misses from the workload and a number of first level data cache misses from the workload, and, if so determined, partition N ways of the shared core cache memory into first and second chunks of ways with the first chunk of M ways reserved for code cache lines from the workload and the second chunk of N minus M ways reserved for data cache lines from the workload, where N and M are positive integer values and N minus M is greater than zero, counting the number of first level code cache misses from the workload; counting the number of first level data cache misses from the workload; and determining that the workload has the large code footprint if the counted number of first level code cache misses exceeds the counted number of first level data cache misses after a counted number of first level cache misses exceeds a threshold.