)]}'
{
  "commit": "c34d1b4d165c67b966bca4aba026443d7ff161eb",
  "tree": "27ffca9daba2a6b16d29bd508faf3e68bda2aad1",
  "parents": [
    "c0718806cf955d5eb51ea77bffb5b21d9bba4972"
  ],
  "author": {
    "name": "Hugh Dickins",
    "email": "hugh@veritas.com",
    "time": "Sat Oct 29 18:16:32 2005 -0700"
  },
  "committer": {
    "name": "Linus Torvalds",
    "email": "torvalds@g5.osdl.org",
    "time": "Sat Oct 29 21:40:41 2005 -0700"
  },
  "message": "[PATCH] mm: kill check_user_page_readable\n\ncheck_user_page_readable is a problematic variant of follow_page.  It\u0027s used\nonly by oprofile\u0027s i386 and arm backtrace code, at interrupt time, to\nestablish whether a userspace stackframe is currently readable.\n\nThis is problematic, because we want to push the page_table_lock down inside\nfollow_page, and later split it; whereas oprofile is doing a spin_trylock on\nit (in the i386 case, forgotten in the arm case), and needs that to pin\nperhaps two pages spanned by the stackframe (which might be covered by\ndifferent locks when we split).\n\nI think oprofile is going about this in the wrong way: it doesn\u0027t need to know\nthe area is readable (neither i386 nor arm uses read protection of user\npages), it doesn\u0027t need to pin the memory, it should simply\n__copy_from_user_inatomic, and see if that succeeds or not.  Sorry, but I\u0027ve\nnot got around to devising the sparse __user annotations for this.\n\nThen we can eliminate check_user_page_readable, and return to a single\nfollow_page without the __follow_page variants.\n\nSigned-off-by: Hugh Dickins \u003chugh@veritas.com\u003e\nSigned-off-by: Andrew Morton \u003cakpm@osdl.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@osdl.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "df35c452a8bf6528c3cf92ee892af205350d7b50",
      "old_mode": 33188,
      "old_path": "arch/arm/oprofile/backtrace.c",
      "new_id": "7c22c12618cc66aee585d0be5b5205512048fc18",
      "new_mode": 33188,
      "new_path": "arch/arm/oprofile/backtrace.c"
    },
    {
      "type": "modify",
      "old_id": "65dfd2edb67117deec70cc54817440a30050332c",
      "old_mode": 33188,
      "old_path": "arch/i386/oprofile/backtrace.c",
      "new_id": "21654be3f73f6409a6d33aa8de16b0a9f5f57244",
      "new_mode": 33188,
      "new_path": "arch/i386/oprofile/backtrace.c"
    },
    {
      "type": "modify",
      "old_id": "972e2ce8e07c1e8803add7af9186b6c36fd0db46",
      "old_mode": 33188,
      "old_path": "include/linux/mm.h",
      "new_id": "aa8de20e2e80386fbb1012a3b8b38e0f8b13c20a",
      "new_mode": 33188,
      "new_path": "include/linux/mm.h"
    },
    {
      "type": "modify",
      "old_id": "622a4ef5409f3e3620a88c20d68193ca803344e1",
      "old_mode": 33188,
      "old_path": "mm/memory.c",
      "new_id": "51f7c0a220d4281eb864b13c6c78afe67930f6e3",
      "new_mode": 33188,
      "new_path": "mm/memory.c"
    }
  ]
}
