)]}'
{
  "commit": "08f051eda33b51e8ee0f45f05bcfe49d0f0caf6b",
  "tree": "46a1e3577de686377e859c7f346299e9ea726260",
  "parents": [
    "28dfbe6ed483e8a589cce88095d7787d61bf9c16"
  ],
  "author": {
    "name": "Andrew Waterman",
    "email": "andrew@sifive.com",
    "time": "Wed Oct 25 14:30:32 2017 -0700"
  },
  "committer": {
    "name": "Palmer Dabbelt",
    "email": "palmer@sifive.com",
    "time": "Thu Nov 30 12:58:25 2017 -0800"
  },
  "message": "RISC-V: Flush I$ when making a dirty page executable\n\nThe RISC-V ISA allows for instruction caches that are not coherent WRT\nstores, even on a single hart.  As a result, we need to explicitly flush\nthe instruction cache whenever marking a dirty page as executable in\norder to preserve the correct system behavior.\n\nLocal instruction caches aren\u0027t that scary (our implementations actually\nflush the cache, but RISC-V is defined to allow higher-performance\nimplementations to exist), but RISC-V defines no way to perform an\ninstruction cache shootdown.  When explicitly asked to do so we can\nshoot down remote instruction caches via an IPI, but this is a bit on\nthe slow side.\n\nInstead of requiring an IPI to all harts whenever marking a page as\nexecutable, we simply flush the currently running harts.  In order to\nmaintain correct behavior, we additionally mark every other hart as\nneeding a deferred instruction cache which will be taken before anything\nruns on it.\n\nSigned-off-by: Andrew Waterman \u003candrew@sifive.com\u003e\nSigned-off-by: Palmer Dabbelt \u003cpalmer@sifive.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "0595585013b07d899bccbe98598f3750bdd39bca",
      "old_mode": 33188,
      "old_path": "arch/riscv/include/asm/cacheflush.h",
      "new_id": "5c9ed39ee2a2d4ebe554f5099aed5fa556cc9af3",
      "new_mode": 33188,
      "new_path": "arch/riscv/include/asm/cacheflush.h"
    },
    {
      "type": "modify",
      "old_id": "66805cba9a27ad819a8cfc938e93f705fe432943",
      "old_mode": 33188,
      "old_path": "arch/riscv/include/asm/mmu.h",
      "new_id": "5df2dccdba122c4d5d02ffff7d82e8727b735ba6",
      "new_mode": 33188,
      "new_path": "arch/riscv/include/asm/mmu.h"
    },
    {
      "type": "modify",
      "old_id": "de1fc1631fc4367b439ce96ff21e2137ee8aa797",
      "old_mode": 33188,
      "old_path": "arch/riscv/include/asm/mmu_context.h",
      "new_id": "b15b169e3d22210f5b86ae3417cf6d98967df43a",
      "new_mode": 33188,
      "new_path": "arch/riscv/include/asm/mmu_context.h"
    },
    {
      "type": "modify",
      "old_id": "3399257780b2cc219b7c6a29a48e54f67d342865",
      "old_mode": 33188,
      "old_path": "arch/riscv/include/asm/pgtable.h",
      "new_id": "2cbd92ed1629c00df42b8ceaffd2250b6de7413a",
      "new_mode": 33188,
      "new_path": "arch/riscv/include/asm/pgtable.h"
    },
    {
      "type": "modify",
      "old_id": "5ee4ae370b5e54d49f3c062d1a19c30ca3ddfec2",
      "old_mode": 33188,
      "old_path": "arch/riscv/include/asm/tlbflush.h",
      "new_id": "77edf2826c1f88bcad6ebc69e37b9321361c7272",
      "new_mode": 33188,
      "new_path": "arch/riscv/include/asm/tlbflush.h"
    },
    {
      "type": "modify",
      "old_id": "b4a71ec5906f64089e7ec613daaade6bd3fef95a",
      "old_mode": 33188,
      "old_path": "arch/riscv/kernel/smp.c",
      "new_id": "1b27ade437b492deb0bb660b510665bb6bc4e560",
      "new_mode": 33188,
      "new_path": "arch/riscv/kernel/smp.c"
    },
    {
      "type": "modify",
      "old_id": "81f7d9ce6d881df0da157b0913275f49517495d4",
      "old_mode": 33188,
      "old_path": "arch/riscv/mm/Makefile",
      "new_id": "eb22ab49b3e008ec4ab677778302d5dbbea358b1",
      "new_mode": 33188,
      "new_path": "arch/riscv/mm/Makefile"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "498c0a0814fe3fa2ddaa59cd0de0831aa94eba87",
      "new_mode": 33188,
      "new_path": "arch/riscv/mm/cacheflush.c"
    }
  ]
}
