{"action":"created","comment":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/186235798","pull_request_review_id":117784848,"id":186235798,"diff_hunk":"@@ -1567,52 +219,214 @@ aes_alloc_keysched(size_t *size, int kmflag)\n \treturn (NULL);\n }\n \n+/* AES implementation that contains the fastest methods */\n+static aes_impl_ops_t aes_fastest_impl = {\n+\t.name = \"fastest\"\n+};\n+\n+/* All compiled in implementations */\n+const aes_impl_ops_t *aes_all_impl[] = {\n+\t&aes_generic_impl,\n+#if defined(__x86_64)\n+\t&aes_x86_64_impl,\n+#endif\n+#if defined(__x86_64) && defined(HAVE_AES)\n+\t&aes_aesni_impl,\n+#endif\n+};\n+\n+/* Indicate that benchmark has been completed */\n+static boolean_t aes_impl_initialized = B_FALSE;\n+\n+/* Select aes implementation */\n+#define\tIMPL_FASTEST\t(UINT32_MAX)\n+#define\tIMPL_CYCLE\t(UINT32_MAX-1)\n \n-#ifdef __amd64\n+#define\tAES_IMPL_READ(i) (*(volatile uint32_t *) &(i))\n \n-#define\tINTEL_AESNI_FLAG (1 << 25)\n+static uint32_t icp_aes_impl = IMPL_FASTEST;\n+static uint32_t user_sel_impl = IMPL_FASTEST;\n+\n+/* Hold all supported implementations */\n+static size_t aes_supp_impl_cnt = 0;\n+static aes_impl_ops_t *aes_supp_impl[ARRAY_SIZE(aes_all_impl)];\n \n /*\n- * Return 1 if executing on Intel with AES-NI instructions,\n- * otherwise 0 (i.e., Intel without AES-NI or AMD64).\n- * Cache the result, as the CPU can't change.\n+ * Selects the aes operations for encrypt/decrypt/key setup\n  */\n-static int\n-intel_aes_instructions_present(void)\n+aes_impl_ops_t *\n+aes_impl_get_ops()\n {\n-\tstatic int cached_result = -1;\n-\tunsigned eax, ebx, ecx, edx;\n-\tunsigned func, subfunc;\n+\taes_impl_ops_t *ops = NULL;\n+\tconst uint32_t impl = AES_IMPL_READ(icp_aes_impl);\n \n-\tif (cached_result == -1) { /* first time */\n-\t\t/* check for an intel cpu */\n-\t\tfunc = 0;\n-\t\tsubfunc = 0;\n+\tswitch (impl) {\n+\tcase IMPL_FASTEST:\n+\t\tASSERT(aes_impl_initialized);\n+\t\tops = &aes_fastest_impl;\n+\t\tbreak;\n+\tcase IMPL_CYCLE:\n+\t{\n+\t\tASSERT(aes_impl_initialized);\n+\t\tASSERT3U(aes_supp_impl_cnt, >, 0);\n+\t\t/* Cycle through supported implementations */\n+\t\tstatic size_t cycle_impl_idx = 0;\n+\t\tsize_t idx = (++cycle_impl_idx) % aes_supp_impl_cnt;\n+\t\tops = aes_supp_impl[idx];\n+\t}\n+\tbreak;\n+\tdefault:\n+\t\tASSERT3U(impl, <, aes_supp_impl_cnt);\n+\t\tASSERT3U(aes_supp_impl_cnt, >, 0);\n+\t\tif (impl < ARRAY_SIZE(aes_all_impl))\n+\t\t\tops = aes_supp_impl[impl];\n+\t\tbreak;\n+\t}\n \n-\t\t__asm__ __volatile__(\n-\t\t    \"cpuid\"\n-\t\t    : \"=a\" (eax), \"=b\" (ebx), \"=c\" (ecx), \"=d\" (edx)\n-\t\t    : \"a\"(func), \"c\"(subfunc));\n+\tASSERT3P(ops, !=, NULL);\n \n-\t\tif (memcmp((char *)(&ebx), \"Genu\", 4) == 0 &&\n-\t\t    memcmp((char *)(&edx), \"ineI\", 4) == 0 &&\n-\t\t    memcmp((char *)(&ecx), \"ntel\", 4) == 0) {\n-\t\t\tfunc = 1;\n-\t\t\tsubfunc = 0;\n+\treturn (ops);\n+}\n \n-\t\t\t/* check for aes-ni instruction set */\n-\t\t\t__asm__ __volatile__(\n-\t\t\t    \"cpuid\"\n-\t\t\t    : \"=a\" (eax), \"=b\" (ebx), \"=c\" (ecx), \"=d\" (edx)\n-\t\t\t    : \"a\"(func), \"c\"(subfunc));\n+void\n+aes_impl_init(void)\n+{\n+\taes_impl_ops_t *curr_impl;\n+\tint i, c;\n \n-\t\t\tcached_result = !!(ecx & INTEL_AESNI_FLAG);\n-\t\t} else {\n-\t\t\tcached_result = 0;\n+\t/* move supported impl into aes_supp_impls */\n+\tfor (i = 0, c = 0; i < ARRAY_SIZE(aes_all_impl); i++) {\n+\t\tcurr_impl = (aes_impl_ops_t *)aes_all_impl[i];\n+\n+\t\tif (curr_impl->is_supported())\n+\t\t\taes_supp_impl[c++] = (aes_impl_ops_t *)curr_impl;\n+\t}\n+\taes_supp_impl_cnt = c;\n+\n+\t/* set fastest implementation. assume hardware accelerated is fastest */","path":"module/icp/algs/aes/aes_impl.c","position":1663,"original_position":1663,"commit_id":"d66a5151741aafcc9222917e09e9eddd5115d628","original_commit_id":"d66a5151741aafcc9222917e09e9eddd5115d628","user":{"login":"behlendorf","id":148917,"avatar_url":"https://avatars2.githubusercontent.com/u/148917?v=4","gravatar_id":"","url":"https://api.github.com/users/behlendorf","html_url":"https://github.com/behlendorf","followers_url":"https://api.github.com/users/behlendorf/followers","following_url":"https://api.github.com/users/behlendorf/following{/other_user}","gists_url":"https://api.github.com/users/behlendorf/gists{/gist_id}","starred_url":"https://api.github.com/users/behlendorf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/behlendorf/subscriptions","organizations_url":"https://api.github.com/users/behlendorf/orgs","repos_url":"https://api.github.com/users/behlendorf/repos","events_url":"https://api.github.com/users/behlendorf/events{/privacy}","received_events_url":"https://api.github.com/users/behlendorf/received_events","type":"User","site_admin":false},"body":"Based on the local testing I've done with this change it seems we can't assume the hardware accelerated version will always be fastest.  Using a dual-socket \"AMD EPYC 7451 24-Core Processor\" I was getting the best performance with `icp_aes_impl=x86_64` followed by the `generic` and then the `aesni` version was bringing up the rear at a little better than _half_ the x86_64 rate.\r\n\r\n@Teknoman117 can you look in to adding a micro-benchmark similar to the RAIDZ code to dynamically determine the fastest implementation during initiailization.","created_at":"2018-05-04T22:30:39Z","updated_at":"2018-05-04T22:35:06Z","html_url":"https://github.com/zfsonlinux/zfs/pull/7103#discussion_r186235798","pull_request_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/7103","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments/186235798"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/7103#discussion_r186235798"},"pull_request":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/7103"}}},"pull_request":{"url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/7103","id":166185366,"html_url":"https://github.com/zfsonlinux/zfs/pull/7103","diff_url":"https://github.com/zfsonlinux/zfs/pull/7103.diff","patch_url":"https://github.com/zfsonlinux/zfs/pull/7103.patch","issue_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/7103","number":7103,"state":"open","locked":false,"title":"Check for AES-NI on non-Intel processors","user":{"login":"Teknoman117","id":326028,"avatar_url":"https://avatars3.githubusercontent.com/u/326028?v=4","gravatar_id":"","url":"https://api.github.com/users/Teknoman117","html_url":"https://github.com/Teknoman117","followers_url":"https://api.github.com/users/Teknoman117/followers","following_url":"https://api.github.com/users/Teknoman117/following{/other_user}","gists_url":"https://api.github.com/users/Teknoman117/gists{/gist_id}","starred_url":"https://api.github.com/users/Teknoman117/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Teknoman117/subscriptions","organizations_url":"https://api.github.com/users/Teknoman117/orgs","repos_url":"https://api.github.com/users/Teknoman117/repos","events_url":"https://api.github.com/users/Teknoman117/events{/privacy}","received_events_url":"https://api.github.com/users/Teknoman117/received_events","type":"User","site_admin":false},"body":"<!--- Provide a general summary of your changes in the Title above -->\r\n\r\n<!---\r\nDocumentation on ZFS Buildbot options can be found at\r\nhttps://github.com/zfsonlinux/zfs/wiki/Buildbot-Options\r\n-->\r\n\r\n### Description\r\n<!--- Describe your changes in detail -->\r\nRemove the check for an Intel CPU in intel_aes_instructions_present().  Only check the aes-ni bit\r\nin cpuid.\r\n\r\n### Motivation and Context\r\n<!--- Why is this change required? What problem does it solve? -->\r\n<!--- If it fixes an open issue, please link to the issue here. -->\r\nAMD CPUs since the FX series (Family 15h) have support for AES-NI.  This can be checked via\r\ncpuid exactly the same way as Intel CPUs.  Addresses #7102 \r\n\r\n### How Has This Been Tested?\r\n<!--- Please describe in detail how you tested your changes. -->\r\n<!--- Include details of your testing environment, and the tests you ran to -->\r\n<!--- see how your change affects other areas of the code, etc. -->\r\n<!--- If your change is a performance enhancement, please provide benchmarks here. -->\r\ntested on my personal desktop with a Threadripper 1950x.\r\nZFS version: 0.7.0-263_g0735ecb3\r\nSPL version: 0.7.0-24_g23602fd\r\n\r\n- have a zpool called test on a ramdisk (to try and make this compute-bound)\r\n- zpool import -R /mnt test\r\n- zfs create -o encryption=on -o keyformat=passphrase -o keylocation=prompt test/encrypted\r\n- dd if=/dev/urandom of=/mnt/test/encrypted/file.bin bs=1024k count=4096\r\n- zpool export test\r\n- zpool import -R /mnt test\r\n- zfs load-key test/encrypted\r\n- zfs mount test/encrypted\r\n- dd if=/mnt/test/encrypted/file.bin of=/dev/null status=progress\r\n\r\nPerformance reading file.bin\r\n- ccm before change: 1318.02 MiB/s\r\n- ccm after change: 2730.5 MiB/s\r\n- gcm before change: 350 MiB/s\r\n- gcm after change: 2900 MiB/s\r\n- will run fio tomorrow\r\n\r\nI still need to run the zfs tests, but i first need to create a vm of something to run them on or figure out how to run them on gentoo.\r\n### Types of changes\r\n<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->\r\n- [x] Bug fix (non-breaking change which fixes an issue)\r\n- [ ] New feature (non-breaking change which adds functionality)\r\n- [ ] Performance enhancement (non-breaking change which improves efficiency)\r\n- [ ] Code cleanup (non-breaking change which makes code smaller or more readable)\r\n- [ ] Breaking change (fix or feature that would cause existing functionality to change)\r\n- [ ] Documentation (a change to man pages or other documentation)\r\n\r\n### Checklist:\r\n<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->\r\n<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\r\n- [x] My code follows the ZFS on Linux code style requirements.\r\n- [ ] I have updated the documentation accordingly.\r\n- [x] I have read the **CONTRIBUTING** document.\r\n- [ ] I have added tests to cover my changes.\r\n- [ ] All new and existing tests passed.\r\n- [ ] All commit messages are properly formatted and contain `Signed-off-by`.\r\n- [ ] Change has been approved by a ZFS on Linux member.\r\n","created_at":"2018-01-31T07:35:45Z","updated_at":"2018-05-04T22:35:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a049f3ef1a91d1e142a70d910077d07cf6aa0cc4","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":453022836,"url":"https://api.github.com/repos/zfsonlinux/zfs/labels/Work%20in%20Progress","name":"Work in Progress","color":"b60205","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/7103/commits","review_comments_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/7103/comments","review_comment_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/7103/comments","statuses_url":"https://api.github.com/repos/zfsonlinux/zfs/statuses/d66a5151741aafcc9222917e09e9eddd5115d628","head":{"label":"Teknoman117:master","ref":"master","sha":"d66a5151741aafcc9222917e09e9eddd5115d628","user":{"login":"Teknoman117","id":326028,"avatar_url":"https://avatars3.githubusercontent.com/u/326028?v=4","gravatar_id":"","url":"https://api.github.com/users/Teknoman117","html_url":"https://github.com/Teknoman117","followers_url":"https://api.github.com/users/Teknoman117/followers","following_url":"https://api.github.com/users/Teknoman117/following{/other_user}","gists_url":"https://api.github.com/users/Teknoman117/gists{/gist_id}","starred_url":"https://api.github.com/users/Teknoman117/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Teknoman117/subscriptions","organizations_url":"https://api.github.com/users/Teknoman117/orgs","repos_url":"https://api.github.com/users/Teknoman117/repos","events_url":"https://api.github.com/users/Teknoman117/events{/privacy}","received_events_url":"https://api.github.com/users/Teknoman117/received_events","type":"User","site_admin":false},"repo":{"id":119648785,"name":"zfs","full_name":"Teknoman117/zfs","owner":{"login":"Teknoman117","id":326028,"avatar_url":"https://avatars3.githubusercontent.com/u/326028?v=4","gravatar_id":"","url":"https://api.github.com/users/Teknoman117","html_url":"https://github.com/Teknoman117","followers_url":"https://api.github.com/users/Teknoman117/followers","following_url":"https://api.github.com/users/Teknoman117/following{/other_user}","gists_url":"https://api.github.com/users/Teknoman117/gists{/gist_id}","starred_url":"https://api.github.com/users/Teknoman117/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Teknoman117/subscriptions","organizations_url":"https://api.github.com/users/Teknoman117/orgs","repos_url":"https://api.github.com/users/Teknoman117/repos","events_url":"https://api.github.com/users/Teknoman117/events{/privacy}","received_events_url":"https://api.github.com/users/Teknoman117/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Teknoman117/zfs","description":"ZFS on Linux - the official OpenZFS implementation for Linux.","fork":true,"url":"https://api.github.com/repos/Teknoman117/zfs","forks_url":"https://api.github.com/repos/Teknoman117/zfs/forks","keys_url":"https://api.github.com/repos/Teknoman117/zfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Teknoman117/zfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Teknoman117/zfs/teams","hooks_url":"https://api.github.com/repos/Teknoman117/zfs/hooks","issue_events_url":"https://api.github.com/repos/Teknoman117/zfs/issues/events{/number}","events_url":"https://api.github.com/repos/Teknoman117/zfs/events","assignees_url":"https://api.github.com/repos/Teknoman117/zfs/assignees{/user}","branches_url":"https://api.github.com/repos/Teknoman117/zfs/branches{/branch}","tags_url":"https://api.github.com/repos/Teknoman117/zfs/tags","blobs_url":"https://api.github.com/repos/Teknoman117/zfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Teknoman117/zfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Teknoman117/zfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/Teknoman117/zfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Teknoman117/zfs/statuses/{sha}","languages_url":"https://api.github.com/repos/Teknoman117/zfs/languages","stargazers_url":"https://api.github.com/repos/Teknoman117/zfs/stargazers","contributors_url":"https://api.github.com/repos/Teknoman117/zfs/contributors","subscribers_url":"https://api.github.com/repos/Teknoman117/zfs/subscribers","subscription_url":"https://api.github.com/repos/Teknoman117/zfs/subscription","commits_url":"https://api.github.com/repos/Teknoman117/zfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/Teknoman117/zfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/Teknoman117/zfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/Teknoman117/zfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/Teknoman117/zfs/contents/{+path}","compare_url":"https://api.github.com/repos/Teknoman117/zfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Teknoman117/zfs/merges","archive_url":"https://api.github.com/repos/Teknoman117/zfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Teknoman117/zfs/downloads","issues_url":"https://api.github.com/repos/Teknoman117/zfs/issues{/number}","pulls_url":"https://api.github.com/repos/Teknoman117/zfs/pulls{/number}","milestones_url":"https://api.github.com/repos/Teknoman117/zfs/milestones{/number}","notifications_url":"https://api.github.com/repos/Teknoman117/zfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Teknoman117/zfs/labels{/name}","releases_url":"https://api.github.com/repos/Teknoman117/zfs/releases{/id}","deployments_url":"https://api.github.com/repos/Teknoman117/zfs/deployments","created_at":"2018-01-31T07:07:03Z","updated_at":"2018-05-04T00:27:29Z","pushed_at":"2018-05-04T00:27:27Z","git_url":"git://github.com/Teknoman117/zfs.git","ssh_url":"git@github.com:Teknoman117/zfs.git","clone_url":"https://github.com/Teknoman117/zfs.git","svn_url":"https://github.com/Teknoman117/zfs","homepage":"http://zfsonlinux.org/","size":46188,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"zfsonlinux:master","ref":"master","sha":"609b2425429da30d95943aaa3e501bc0b49a389e","user":{"login":"zfsonlinux","id":575083,"avatar_url":"https://avatars3.githubusercontent.com/u/575083?v=4","gravatar_id":"","url":"https://api.github.com/users/zfsonlinux","html_url":"https://github.com/zfsonlinux","followers_url":"https://api.github.com/users/zfsonlinux/followers","following_url":"https://api.github.com/users/zfsonlinux/following{/other_user}","gists_url":"https://api.github.com/users/zfsonlinux/gists{/gist_id}","starred_url":"https://api.github.com/users/zfsonlinux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zfsonlinux/subscriptions","organizations_url":"https://api.github.com/users/zfsonlinux/orgs","repos_url":"https://api.github.com/users/zfsonlinux/repos","events_url":"https://api.github.com/users/zfsonlinux/events{/privacy}","received_events_url":"https://api.github.com/users/zfsonlinux/received_events","type":"Organization","site_admin":false},"repo":{"id":437011,"name":"zfs","full_name":"zfsonlinux/zfs","owner":{"login":"zfsonlinux","id":575083,"avatar_url":"https://avatars3.githubusercontent.com/u/575083?v=4","gravatar_id":"","url":"https://api.github.com/users/zfsonlinux","html_url":"https://github.com/zfsonlinux","followers_url":"https://api.github.com/users/zfsonlinux/followers","following_url":"https://api.github.com/users/zfsonlinux/following{/other_user}","gists_url":"https://api.github.com/users/zfsonlinux/gists{/gist_id}","starred_url":"https://api.github.com/users/zfsonlinux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zfsonlinux/subscriptions","organizations_url":"https://api.github.com/users/zfsonlinux/orgs","repos_url":"https://api.github.com/users/zfsonlinux/repos","events_url":"https://api.github.com/users/zfsonlinux/events{/privacy}","received_events_url":"https://api.github.com/users/zfsonlinux/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/zfsonlinux/zfs","description":"ZFS on Linux - the official OpenZFS implementation for Linux.","fork":false,"url":"https://api.github.com/repos/zfsonlinux/zfs","forks_url":"https://api.github.com/repos/zfsonlinux/zfs/forks","keys_url":"https://api.github.com/repos/zfsonlinux/zfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zfsonlinux/zfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zfsonlinux/zfs/teams","hooks_url":"https://api.github.com/repos/zfsonlinux/zfs/hooks","issue_events_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/events{/number}","events_url":"https://api.github.com/repos/zfsonlinux/zfs/events","assignees_url":"https://api.github.com/repos/zfsonlinux/zfs/assignees{/user}","branches_url":"https://api.github.com/repos/zfsonlinux/zfs/branches{/branch}","tags_url":"https://api.github.com/repos/zfsonlinux/zfs/tags","blobs_url":"https://api.github.com/repos/zfsonlinux/zfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zfsonlinux/zfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zfsonlinux/zfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/zfsonlinux/zfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zfsonlinux/zfs/statuses/{sha}","languages_url":"https://api.github.com/repos/zfsonlinux/zfs/languages","stargazers_url":"https://api.github.com/repos/zfsonlinux/zfs/stargazers","contributors_url":"https://api.github.com/repos/zfsonlinux/zfs/contributors","subscribers_url":"https://api.github.com/repos/zfsonlinux/zfs/subscribers","subscription_url":"https://api.github.com/repos/zfsonlinux/zfs/subscription","commits_url":"https://api.github.com/repos/zfsonlinux/zfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/zfsonlinux/zfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/zfsonlinux/zfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/zfsonlinux/zfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/zfsonlinux/zfs/contents/{+path}","compare_url":"https://api.github.com/repos/zfsonlinux/zfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zfsonlinux/zfs/merges","archive_url":"https://api.github.com/repos/zfsonlinux/zfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zfsonlinux/zfs/downloads","issues_url":"https://api.github.com/repos/zfsonlinux/zfs/issues{/number}","pulls_url":"https://api.github.com/repos/zfsonlinux/zfs/pulls{/number}","milestones_url":"https://api.github.com/repos/zfsonlinux/zfs/milestones{/number}","notifications_url":"https://api.github.com/repos/zfsonlinux/zfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zfsonlinux/zfs/labels{/name}","releases_url":"https://api.github.com/repos/zfsonlinux/zfs/releases{/id}","deployments_url":"https://api.github.com/repos/zfsonlinux/zfs/deployments","created_at":"2009-12-14T20:20:34Z","updated_at":"2018-05-04T17:51:05Z","pushed_at":"2018-05-04T22:06:45Z","git_url":"git://github.com/zfsonlinux/zfs.git","ssh_url":"git@github.com:zfsonlinux/zfs.git","clone_url":"https://github.com/zfsonlinux/zfs.git","svn_url":"https://github.com/zfsonlinux/zfs","homepage":"http://zfsonlinux.org/","size":46387,"stargazers_count":3255,"watchers_count":3255,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":756,"mirror_url":null,"archived":false,"open_issues_count":938,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":756,"open_issues":938,"watchers":3255,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/7103"},"html":{"href":"https://github.com/zfsonlinux/zfs/pull/7103"},"issue":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/7103"},"comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/issues/7103/comments"},"review_comments":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/7103/comments"},"review_comment":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/zfsonlinux/zfs/pulls/7103/commits"},"statuses":{"href":"https://api.github.com/repos/zfsonlinux/zfs/statuses/d66a5151741aafcc9222917e09e9eddd5115d628"}},"author_association":"NONE"}}
{"actor":{"display_login":"behlendorf"}}