{"action":"created","comment":{"url":"https://api.github.com/repos/xen-troops/linux/pulls/comments/86857418","pull_request_review_id":7494101,"id":86857418,"diff_hunk":"@@ -0,0 +1,2127 @@\n+/*\n+ *  Xen para-virtual sound device\n+ *\n+ *  Based on sound/drivers/dummy.c\n+ *  Based on drivers/net/xen-netfront.c\n+ *  Based on drivers/block/xen-blkfront.c\n+ *\n+ *   This program is free software; you can redistribute it and/or modify\n+ *   it under the terms of the GNU General Public License as published by\n+ *   the Free Software Foundation; either version 2 of the License, or\n+ *   (at your option) any later version.\n+ *\n+ *   This program is distributed in the hope that it will be useful,\n+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ *   GNU General Public License for more details.\n+ *\n+ * Copyright (C) 2016 EPAM Systems Inc.\n+ */\n+\n+#include <linux/kernel.h>\n+#include <linux/errno.h>\n+#include <linux/module.h>\n+#include <linux/slab.h>\n+#include <linux/platform_device.h>\n+#include <linux/irq.h>\n+#include <linux/vmalloc.h>\n+\n+#include <sound/core.h>\n+#include <sound/pcm.h>\n+\n+#include <asm/xen/hypervisor.h>\n+#include <xen/xen.h>\n+#include <xen/platform_pci.h>\n+#include <xen/xenbus.h>\n+#include <xen/events.h>\n+#include <xen/grant_table.h>\n+#include <xen/interface/io/ring.h>\n+#include <xen/interface/io/sndif_linux.h>\n+\n+#define GRANT_INVALID_REF\t0\n+/* timeout in ms to wait for backend to respond */\n+#define VSND_WAIT_BACK_MS\t5000\n+\n+enum xdrv_evtchnl_state {\n+\tEVTCHNL_STATE_DISCONNECTED,\n+\tEVTCHNL_STATE_CONNECTED,\n+\tEVTCHNL_STATE_SUSPENDED,\n+};\n+\n+struct xdrv_evtchnl_info {\n+\tstruct xdrv_info *drv_info;\n+\tstruct xen_sndif_front_ring ring;\n+\tint ring_ref;\n+\tunsigned int port;\n+\tunsigned int irq;\n+\tstruct completion completion;\n+\t/* state of the event channel */\n+\tenum xdrv_evtchnl_state state;\n+\t/* latest response status and id */\n+\tint resp_status;\n+\tuint8_t resp_id;\n+};\n+\n+struct xdrv_shared_buffer_info {\n+\tint num_grefs;\n+\tgrant_ref_t *grefs;\n+\tunsigned char *vdirectory;\n+\tunsigned char *vbuffer;\n+\tsize_t vbuffer_sz;\n+};\n+\n+struct sdev_alsa_timer_info {\n+\tspinlock_t lock;\n+\tstruct timer_list timer;\n+\tunsigned long base_time;\n+\tunsigned int frac_pos;\t/* fractional sample position (based HZ) */\n+\tunsigned int frac_period_rest;\n+\tunsigned int frac_buffer_size;\t/* buffer_size * HZ */\n+\tunsigned int frac_period_size;\t/* period_size * HZ */\n+\tunsigned int rate;\n+\tint elapsed;\n+\tstruct snd_pcm_substream *substream;\n+};\n+\n+struct sdev_pcm_stream_info {\n+\tint index;\n+\tstruct snd_pcm_hardware pcm_hw;\n+\tstruct xdrv_evtchnl_info *evtchnl;\n+\tbool is_open;\n+\tuint8_t req_next_id;\n+\tstruct sdev_alsa_timer_info dpcm;\n+\tstruct xdrv_shared_buffer_info sh_buf;\n+};\n+\n+struct sdev_pcm_instance_info {\n+\tstruct sdev_card_info *card_info;\n+\tstruct snd_pcm *pcm;\n+\tstruct snd_pcm_hardware pcm_hw;\n+\tint num_pcm_streams_pb;\n+\tstruct sdev_pcm_stream_info *streams_pb;\n+\tint num_pcm_streams_cap;\n+\tstruct sdev_pcm_stream_info *streams_cap;\n+};\n+\n+struct sdev_card_info {\n+\tstruct xdrv_info *xdrv_info;\n+\tstruct snd_card *card;\n+\tstruct snd_pcm_hardware pcm_hw;\n+\t/* array of PCM instances of this card */\n+\tint num_pcm_instances;\n+\tstruct sdev_pcm_instance_info *pcm_instances;\n+};\n+\n+struct xdrv_info {\n+\tstruct xenbus_device *xb_dev;\n+\tspinlock_t io_lock;\n+\tstruct mutex mutex;\n+\tbool sdrv_registered;\n+\t/* array of virtual sound platform devices */\n+\tstruct platform_device **sdrv_devs;\n+\n+\tint num_evt_channels;\n+\tstruct xdrv_evtchnl_info *evtchnls;\n+\n+\t/* number of virtual cards */\n+\tint cfg_num_cards;\n+\tstruct sdev_card_plat_data *cfg_plat_data;\n+};\n+\n+struct cfg_stream {\n+\tint index;\n+\tchar *xenstore_path;\n+\tstruct snd_pcm_hardware pcm_hw;\n+};\n+\n+struct cfg_pcm_instance {\n+\tchar name[80];\n+\t/* device number */\n+\tint device_id;\n+\t/* Device's PCM hardware descriptor */\n+\tstruct snd_pcm_hardware pcm_hw;\n+\tint  num_streams_pb;\n+\tstruct cfg_stream *streams_pb;\n+\tint  num_streams_cap;\n+\tstruct cfg_stream *streams_cap;\n+};\n+\n+struct cfg_card {\n+\t/* card configuration */\n+\tchar shortname[32];\n+\tchar longname[80];\n+\t/* number of PCM instances in this configuration */\n+\tint num_devices;\n+\t/* Card's PCM hardware descriptor */\n+\tstruct snd_pcm_hardware pcm_hw;\n+\n+\t/* pcm instance configurations */\n+\tstruct cfg_pcm_instance *pcm_instances;\n+};\n+\n+struct sdev_card_plat_data {\n+\tint index;\n+\tstruct xdrv_info *xdrv_info;\n+\tstruct cfg_card cfg_card;\n+};\n+\n+static inline void xdrv_evtchnl_flush(\n+\t\tstruct xdrv_evtchnl_info *channel);\n+static void sdrv_copy_pcm_hw(struct snd_pcm_hardware *dst,\n+\tstruct snd_pcm_hardware *src,\n+\tstruct snd_pcm_hardware *ref_pcm_hw);\n+static void xdrv_sh_buf_clear(struct xdrv_shared_buffer_info *buf);\n+static void xdrv_sh_buf_free(struct xdrv_shared_buffer_info *buf);\n+static int xdrv_sh_buf_alloc(struct xenbus_device *xb_dev,\n+\tstruct xdrv_shared_buffer_info *buf,\n+\tunsigned int buffer_size);\n+static grant_ref_t xdrv_sh_buf_get_dir_start(\n+\tstruct xdrv_shared_buffer_info *buf);\n+\n+struct SNDIF_TO_KERN_ERROR {\n+\tint sndif;\n+\tint kern;\n+};\n+static struct SNDIF_TO_KERN_ERROR sndif_kern_error_codes[] = {\n+\t{ .sndif = XENSND_RSP_OKAY,     .kern = 0 },\n+\t{ .sndif = XENSND_RSP_ERROR,    .kern = EIO },\n+};\n+\n+static int sndif_to_kern_error(int sndif_err)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < ARRAY_SIZE(sndif_kern_error_codes); i++)\n+\t\tif (sndif_kern_error_codes[i].sndif == sndif_err)\n+\t\t\treturn -sndif_kern_error_codes[i].kern;\n+\treturn -EIO;\n+}\n+\n+struct ALSA_SNDIF_SAMPLE_FORMAT {\n+\tuint8_t sndif;\n+\tsnd_pcm_format_t alsa;\n+};\n+static struct ALSA_SNDIF_SAMPLE_FORMAT alsa_sndif_formats[] = {\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_U8,\n+\t\t.alsa = SNDRV_PCM_FORMAT_S8\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_S8,\n+\t\t.alsa = SNDRV_PCM_FORMAT_S8\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_U16_LE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_U16_LE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_U16_BE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_U16_BE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_S16_LE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_S16_LE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_S16_BE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_S16_BE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_U24_LE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_U24_LE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_U24_BE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_U24_BE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_S24_LE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_S24_LE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_S24_BE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_S24_BE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_U32_LE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_U32_LE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_U32_BE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_U32_BE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_S32_LE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_S32_LE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_S32_BE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_S32_BE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_A_LAW,\n+\t\t.alsa = SNDRV_PCM_FORMAT_A_LAW\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_MU_LAW,\n+\t\t.alsa = SNDRV_PCM_FORMAT_MU_LAW\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_F32_LE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_FLOAT_LE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_F32_BE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_FLOAT_BE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_F64_LE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_FLOAT64_LE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_F64_BE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_FLOAT64_BE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_IEC958_SUBFRAME_LE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_IEC958_SUBFRAME_BE,\n+\t\t.alsa = SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_IMA_ADPCM,\n+\t\t.alsa = SNDRV_PCM_FORMAT_IMA_ADPCM\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_MPEG,\n+\t\t.alsa = SNDRV_PCM_FORMAT_MPEG\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_GSM,\n+\t\t.alsa = SNDRV_PCM_FORMAT_GSM\n+\t},\n+\t{\n+\t\t.sndif = XENSND_PCM_FORMAT_SPECIAL,\n+\t\t.alsa = SNDRV_PCM_FORMAT_SPECIAL\n+\t},\n+};\n+\n+static uint8_t alsa_to_sndif_format(snd_pcm_format_t format)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < ARRAY_SIZE(alsa_sndif_formats); i++)\n+\t\tif (alsa_sndif_formats[i].alsa == format)\n+\t\t\treturn alsa_sndif_formats[i].sndif;\n+\treturn XENSND_PCM_FORMAT_SPECIAL;\n+}\n+\n+/*\n+ * Sound driver start\n+ */\n+\n+struct sdev_pcm_stream_info *sdrv_stream_get(\n+\t\tstruct snd_pcm_substream *substream)\n+{\n+\tstruct sdev_pcm_instance_info *pcm_instance =\n+\t\tsnd_pcm_substream_chip(substream);\n+\tstruct sdev_pcm_stream_info *stream;\n+\n+\tif (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)\n+\t\tstream = &pcm_instance->streams_pb[substream->number];\n+\telse\n+\t\tstream = &pcm_instance->streams_cap[substream->number];\n+\treturn stream;\n+}\n+\n+static void sdrv_stream_clear(struct sdev_pcm_stream_info *stream)\n+{\n+\tstream->is_open = false;\n+\tstream->req_next_id = 0;\n+\txdrv_sh_buf_clear(&stream->sh_buf);\n+}\n+\n+static inline struct xensnd_req *sdrv_be_stream_prepare_req(\n+\t\tstruct sdev_pcm_stream_info *stream,\n+\t\tuint8_t operation)\n+{\n+\tstruct xensnd_req *req;\n+\n+\treq = RING_GET_REQUEST(&stream->evtchnl->ring,\n+\t\tstream->evtchnl->ring.req_prod_pvt);\n+\treq->u.data.operation = operation;\n+\treq->u.data.stream_idx = stream->index;\n+\treq->u.data.id = stream->req_next_id++;\n+\tstream->evtchnl->resp_id = req->u.data.id;\n+\treturn req;\n+}\n+\n+void sdrv_be_stream_free(struct sdev_pcm_stream_info *stream)\n+{\n+\txdrv_sh_buf_free(&stream->sh_buf);\n+\tsdrv_stream_clear(stream);\n+}\n+\n+/* CAUTION!!! Call this with the spin lock held.\n+ * This function will release it\n+ */\n+int sdrv_be_stream_do_io(struct snd_pcm_substream *substream,\n+\tstruct xdrv_info *xdrv_info,\n+\tstruct xensnd_req *req, unsigned long flags)\n+{\n+\tstruct sdev_pcm_stream_info *stream = sdrv_stream_get(substream);\n+\tint ret;\n+\n+\treinit_completion(&stream->evtchnl->completion);\n+\tif (unlikely(stream->evtchnl->state != EVTCHNL_STATE_CONNECTED)) {\n+\t\tspin_unlock_irqrestore(&xdrv_info->io_lock, flags);\n+\t\treturn -EIO;\n+\t}\n+\txdrv_evtchnl_flush(stream->evtchnl);\n+\tspin_unlock_irqrestore(&xdrv_info->io_lock, flags);\n+\tret = 0;\n+\tif (wait_for_completion_interruptible_timeout(\n+\t\t\t&stream->evtchnl->completion,\n+\t\t\tmsecs_to_jiffies(VSND_WAIT_BACK_MS)) <= 0)\n+\t\tret = -ETIMEDOUT;\n+\tif (ret < 0)\n+\t\treturn ret;\n+\treturn sndif_to_kern_error(stream->evtchnl->resp_status);\n+}\n+\n+int sdrv_be_stream_open(struct snd_pcm_substream *substream,\n+\t\tstruct sdev_pcm_stream_info *stream)\n+{\n+\tstruct sdev_pcm_instance_info *pcm_instance =\n+\t\tsnd_pcm_substream_chip(substream);\n+\tstruct snd_pcm_runtime *runtime = substream->runtime;\n+\tstruct xdrv_info *xdrv_info;\n+\tstruct xensnd_req *req;\n+\tint ret;\n+\tunsigned long flags;\n+\n+\txdrv_info = pcm_instance->card_info->xdrv_info;\n+\tspin_lock_irqsave(&xdrv_info->io_lock, flags);\n+\n+\treq = sdrv_be_stream_prepare_req(stream, XENSND_OP_OPEN);\n+\treq->u.data.op.open.pcm_format = alsa_to_sndif_format(runtime->format);\n+\treq->u.data.op.open.pcm_channels = runtime->channels;\n+\treq->u.data.op.open.pcm_rate = runtime->rate;\n+\treq->u.data.op.open.gref_directory_start =\n+\t\txdrv_sh_buf_get_dir_start(&stream->sh_buf);\n+\tret = sdrv_be_stream_do_io(substream, xdrv_info, req, flags);\n+\tstream->is_open = ret < 0 ? false : true;\n+\treturn ret;\n+}\n+\n+int sdrv_be_stream_close(struct snd_pcm_substream *substream,\n+\tstruct sdev_pcm_stream_info *stream)\n+{\n+\tstruct sdev_pcm_instance_info *pcm_instance =\n+\t\tsnd_pcm_substream_chip(substream);\n+\tstruct xdrv_info *xdrv_info;\n+\tstruct xensnd_req *req;\n+\tint ret;\n+\tunsigned long flags;\n+\n+\txdrv_info = pcm_instance->card_info->xdrv_info;\n+\tspin_lock_irqsave(&xdrv_info->io_lock, flags);\n+\n+\treq = sdrv_be_stream_prepare_req(stream, XENSND_OP_CLOSE);\n+\tret = sdrv_be_stream_do_io(substream, xdrv_info, req, flags);\n+\tstream->is_open = false;\n+\treturn ret;\n+}\n+\n+static void sdrv_alsa_timer_rearm(struct sdev_alsa_timer_info *dpcm)\n+{\n+\tmod_timer(&dpcm->timer, jiffies +\n+\t\t(dpcm->frac_period_rest + dpcm->rate - 1) / dpcm->rate);\n+}\n+\n+static void sdrv_alsa_timer_update(struct sdev_alsa_timer_info *dpcm)\n+{\n+\tunsigned long delta;\n+\n+\tdelta = jiffies - dpcm->base_time;\n+\tif (!delta)\n+\t\treturn;\n+\tdpcm->base_time += delta;\n+\tdelta *= dpcm->rate;","path":"sound/drivers/xen-sndfront.c","position":452,"original_position":452,"commit_id":"e7d6f5ef1c246655324f5da25c6d3ad5ebb1f694","original_commit_id":"e7d6f5ef1c246655324f5da25c6d3ad5ebb1f694","user":{"login":"otyshchenko1","id":22071282,"avatar_url":"https://avatars.githubusercontent.com/u/22071282?v=3","gravatar_id":"","url":"https://api.github.com/users/otyshchenko1","html_url":"https://github.com/otyshchenko1","followers_url":"https://api.github.com/users/otyshchenko1/followers","following_url":"https://api.github.com/users/otyshchenko1/following{/other_user}","gists_url":"https://api.github.com/users/otyshchenko1/gists{/gist_id}","starred_url":"https://api.github.com/users/otyshchenko1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/otyshchenko1/subscriptions","organizations_url":"https://api.github.com/users/otyshchenko1/orgs","repos_url":"https://api.github.com/users/otyshchenko1/repos","events_url":"https://api.github.com/users/otyshchenko1/events{/privacy}","received_events_url":"https://api.github.com/users/otyshchenko1/received_events","type":"User","site_admin":false},"body":"Are the delta has enough type not to overflow?  ","created_at":"2016-11-07T20:06:33Z","updated_at":"2016-11-07T20:06:40Z","html_url":"https://github.com/xen-troops/linux/pull/1#discussion_r86857418","pull_request_url":"https://api.github.com/repos/xen-troops/linux/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/xen-troops/linux/pulls/comments/86857418"},"html":{"href":"https://github.com/xen-troops/linux/pull/1#discussion_r86857418"},"pull_request":{"href":"https://api.github.com/repos/xen-troops/linux/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/xen-troops/linux/pulls/1","id":92598535,"html_url":"https://github.com/xen-troops/linux/pull/1","diff_url":"https://github.com/xen-troops/linux/pull/1.diff","patch_url":"https://github.com/xen-troops/linux/pull/1.patch","issue_url":"https://api.github.com/repos/xen-troops/linux/issues/1","number":1,"state":"open","locked":false,"title":"Pv devel","user":{"login":"andr2000","id":827874,"avatar_url":"https://avatars.githubusercontent.com/u/827874?v=3","gravatar_id":"","url":"https://api.github.com/users/andr2000","html_url":"https://github.com/andr2000","followers_url":"https://api.github.com/users/andr2000/followers","following_url":"https://api.github.com/users/andr2000/following{/other_user}","gists_url":"https://api.github.com/users/andr2000/gists{/gist_id}","starred_url":"https://api.github.com/users/andr2000/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andr2000/subscriptions","organizations_url":"https://api.github.com/users/andr2000/orgs","repos_url":"https://api.github.com/users/andr2000/repos","events_url":"https://api.github.com/users/andr2000/events{/privacy}","received_events_url":"https://api.github.com/users/andr2000/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-11-07T15:00:59Z","updated_at":"2016-11-07T20:06:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"03e5932263bb3bd6298a73325020e18ee4b2c233","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/xen-troops/linux/pulls/1/commits","review_comments_url":"https://api.github.com/repos/xen-troops/linux/pulls/1/comments","review_comment_url":"https://api.github.com/repos/xen-troops/linux/pulls/comments{/number}","comments_url":"https://api.github.com/repos/xen-troops/linux/issues/1/comments","statuses_url":"https://api.github.com/repos/xen-troops/linux/statuses/e7d6f5ef1c246655324f5da25c6d3ad5ebb1f694","head":{"label":"andr2000:pv-devel","ref":"pv-devel","sha":"e7d6f5ef1c246655324f5da25c6d3ad5ebb1f694","user":{"login":"andr2000","id":827874,"avatar_url":"https://avatars.githubusercontent.com/u/827874?v=3","gravatar_id":"","url":"https://api.github.com/users/andr2000","html_url":"https://github.com/andr2000","followers_url":"https://api.github.com/users/andr2000/followers","following_url":"https://api.github.com/users/andr2000/following{/other_user}","gists_url":"https://api.github.com/users/andr2000/gists{/gist_id}","starred_url":"https://api.github.com/users/andr2000/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andr2000/subscriptions","organizations_url":"https://api.github.com/users/andr2000/orgs","repos_url":"https://api.github.com/users/andr2000/repos","events_url":"https://api.github.com/users/andr2000/events{/privacy}","received_events_url":"https://api.github.com/users/andr2000/received_events","type":"User","site_admin":false},"repo":{"id":73061394,"name":"linux","full_name":"andr2000/linux","owner":{"login":"andr2000","id":827874,"avatar_url":"https://avatars.githubusercontent.com/u/827874?v=3","gravatar_id":"","url":"https://api.github.com/users/andr2000","html_url":"https://github.com/andr2000","followers_url":"https://api.github.com/users/andr2000/followers","following_url":"https://api.github.com/users/andr2000/following{/other_user}","gists_url":"https://api.github.com/users/andr2000/gists{/gist_id}","starred_url":"https://api.github.com/users/andr2000/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andr2000/subscriptions","organizations_url":"https://api.github.com/users/andr2000/orgs","repos_url":"https://api.github.com/users/andr2000/repos","events_url":"https://api.github.com/users/andr2000/events{/privacy}","received_events_url":"https://api.github.com/users/andr2000/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/andr2000/linux","description":"Linux kernel source tree","fork":true,"url":"https://api.github.com/repos/andr2000/linux","forks_url":"https://api.github.com/repos/andr2000/linux/forks","keys_url":"https://api.github.com/repos/andr2000/linux/keys{/key_id}","collaborators_url":"https://api.github.com/repos/andr2000/linux/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/andr2000/linux/teams","hooks_url":"https://api.github.com/repos/andr2000/linux/hooks","issue_events_url":"https://api.github.com/repos/andr2000/linux/issues/events{/number}","events_url":"https://api.github.com/repos/andr2000/linux/events","assignees_url":"https://api.github.com/repos/andr2000/linux/assignees{/user}","branches_url":"https://api.github.com/repos/andr2000/linux/branches{/branch}","tags_url":"https://api.github.com/repos/andr2000/linux/tags","blobs_url":"https://api.github.com/repos/andr2000/linux/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/andr2000/linux/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/andr2000/linux/git/refs{/sha}","trees_url":"https://api.github.com/repos/andr2000/linux/git/trees{/sha}","statuses_url":"https://api.github.com/repos/andr2000/linux/statuses/{sha}","languages_url":"https://api.github.com/repos/andr2000/linux/languages","stargazers_url":"https://api.github.com/repos/andr2000/linux/stargazers","contributors_url":"https://api.github.com/repos/andr2000/linux/contributors","subscribers_url":"https://api.github.com/repos/andr2000/linux/subscribers","subscription_url":"https://api.github.com/repos/andr2000/linux/subscription","commits_url":"https://api.github.com/repos/andr2000/linux/commits{/sha}","git_commits_url":"https://api.github.com/repos/andr2000/linux/git/commits{/sha}","comments_url":"https://api.github.com/repos/andr2000/linux/comments{/number}","issue_comment_url":"https://api.github.com/repos/andr2000/linux/issues/comments{/number}","contents_url":"https://api.github.com/repos/andr2000/linux/contents/{+path}","compare_url":"https://api.github.com/repos/andr2000/linux/compare/{base}...{head}","merges_url":"https://api.github.com/repos/andr2000/linux/merges","archive_url":"https://api.github.com/repos/andr2000/linux/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/andr2000/linux/downloads","issues_url":"https://api.github.com/repos/andr2000/linux/issues{/number}","pulls_url":"https://api.github.com/repos/andr2000/linux/pulls{/number}","milestones_url":"https://api.github.com/repos/andr2000/linux/milestones{/number}","notifications_url":"https://api.github.com/repos/andr2000/linux/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/andr2000/linux/labels{/name}","releases_url":"https://api.github.com/repos/andr2000/linux/releases{/id}","deployments_url":"https://api.github.com/repos/andr2000/linux/deployments","created_at":"2016-11-07T09:16:06Z","updated_at":"2016-11-07T09:22:03Z","pushed_at":"2016-11-07T15:03:36Z","git_url":"git://github.com/andr2000/linux.git","ssh_url":"git@github.com:andr2000/linux.git","clone_url":"https://github.com/andr2000/linux.git","svn_url":"https://github.com/andr2000/linux","homepage":"","size":1703864,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"xen-troops:pv-devel","ref":"pv-devel","sha":"bc33b0ca11e3df467777a4fa7639ba488c9d4911","user":{"login":"xen-troops","id":22070357,"avatar_url":"https://avatars.githubusercontent.com/u/22070357?v=3","gravatar_id":"","url":"https://api.github.com/users/xen-troops","html_url":"https://github.com/xen-troops","followers_url":"https://api.github.com/users/xen-troops/followers","following_url":"https://api.github.com/users/xen-troops/following{/other_user}","gists_url":"https://api.github.com/users/xen-troops/gists{/gist_id}","starred_url":"https://api.github.com/users/xen-troops/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xen-troops/subscriptions","organizations_url":"https://api.github.com/users/xen-troops/orgs","repos_url":"https://api.github.com/users/xen-troops/repos","events_url":"https://api.github.com/users/xen-troops/events{/privacy}","received_events_url":"https://api.github.com/users/xen-troops/received_events","type":"Organization","site_admin":false},"repo":{"id":73060647,"name":"linux","full_name":"xen-troops/linux","owner":{"login":"xen-troops","id":22070357,"avatar_url":"https://avatars.githubusercontent.com/u/22070357?v=3","gravatar_id":"","url":"https://api.github.com/users/xen-troops","html_url":"https://github.com/xen-troops","followers_url":"https://api.github.com/users/xen-troops/followers","following_url":"https://api.github.com/users/xen-troops/following{/other_user}","gists_url":"https://api.github.com/users/xen-troops/gists{/gist_id}","starred_url":"https://api.github.com/users/xen-troops/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xen-troops/subscriptions","organizations_url":"https://api.github.com/users/xen-troops/orgs","repos_url":"https://api.github.com/users/xen-troops/repos","events_url":"https://api.github.com/users/xen-troops/events{/privacy}","received_events_url":"https://api.github.com/users/xen-troops/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/xen-troops/linux","description":"Linux kernel source tree","fork":true,"url":"https://api.github.com/repos/xen-troops/linux","forks_url":"https://api.github.com/repos/xen-troops/linux/forks","keys_url":"https://api.github.com/repos/xen-troops/linux/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xen-troops/linux/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xen-troops/linux/teams","hooks_url":"https://api.github.com/repos/xen-troops/linux/hooks","issue_events_url":"https://api.github.com/repos/xen-troops/linux/issues/events{/number}","events_url":"https://api.github.com/repos/xen-troops/linux/events","assignees_url":"https://api.github.com/repos/xen-troops/linux/assignees{/user}","branches_url":"https://api.github.com/repos/xen-troops/linux/branches{/branch}","tags_url":"https://api.github.com/repos/xen-troops/linux/tags","blobs_url":"https://api.github.com/repos/xen-troops/linux/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xen-troops/linux/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xen-troops/linux/git/refs{/sha}","trees_url":"https://api.github.com/repos/xen-troops/linux/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xen-troops/linux/statuses/{sha}","languages_url":"https://api.github.com/repos/xen-troops/linux/languages","stargazers_url":"https://api.github.com/repos/xen-troops/linux/stargazers","contributors_url":"https://api.github.com/repos/xen-troops/linux/contributors","subscribers_url":"https://api.github.com/repos/xen-troops/linux/subscribers","subscription_url":"https://api.github.com/repos/xen-troops/linux/subscription","commits_url":"https://api.github.com/repos/xen-troops/linux/commits{/sha}","git_commits_url":"https://api.github.com/repos/xen-troops/linux/git/commits{/sha}","comments_url":"https://api.github.com/repos/xen-troops/linux/comments{/number}","issue_comment_url":"https://api.github.com/repos/xen-troops/linux/issues/comments{/number}","contents_url":"https://api.github.com/repos/xen-troops/linux/contents/{+path}","compare_url":"https://api.github.com/repos/xen-troops/linux/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xen-troops/linux/merges","archive_url":"https://api.github.com/repos/xen-troops/linux/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xen-troops/linux/downloads","issues_url":"https://api.github.com/repos/xen-troops/linux/issues{/number}","pulls_url":"https://api.github.com/repos/xen-troops/linux/pulls{/number}","milestones_url":"https://api.github.com/repos/xen-troops/linux/milestones{/number}","notifications_url":"https://api.github.com/repos/xen-troops/linux/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xen-troops/linux/labels{/name}","releases_url":"https://api.github.com/repos/xen-troops/linux/releases{/id}","deployments_url":"https://api.github.com/repos/xen-troops/linux/deployments","created_at":"2016-11-07T09:06:47Z","updated_at":"2016-11-07T09:12:49Z","pushed_at":"2016-11-07T15:03:47Z","git_url":"git://github.com/xen-troops/linux.git","ssh_url":"git@github.com:xen-troops/linux.git","clone_url":"https://github.com/xen-troops/linux.git","svn_url":"https://github.com/xen-troops/linux","homepage":"","size":1703712,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/xen-troops/linux/pulls/1"},"html":{"href":"https://github.com/xen-troops/linux/pull/1"},"issue":{"href":"https://api.github.com/repos/xen-troops/linux/issues/1"},"comments":{"href":"https://api.github.com/repos/xen-troops/linux/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/xen-troops/linux/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/xen-troops/linux/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/xen-troops/linux/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/xen-troops/linux/statuses/e7d6f5ef1c246655324f5da25c6d3ad5ebb1f694"}}}}
{"actor":{"display_login":"otyshchenko1"}}