linux/drivers/hv/channel.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2009, Microsoft Corporation.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 *
  13 * You should have received a copy of the GNU General Public License along with
  14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  15 * Place - Suite 330, Boston, MA 02111-1307 USA.
  16 *
  17 * Authors:
  18 *   Haiyang Zhang <haiyangz@microsoft.com>
  19 *   Hank Janssen  <hjanssen@microsoft.com>
  20 */
  21#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  22
  23#include <linux/kernel.h>
  24#include <linux/sched.h>
  25#include <linux/wait.h>
  26#include <linux/mm.h>
  27#include <linux/slab.h>
  28#include <linux/module.h>
  29#include <linux/hyperv.h>
  30
  31#include "hyperv_vmbus.h"
  32
  33#define NUM_PAGES_SPANNED(addr, len) \
  34((PAGE_ALIGN(addr + len) >> PAGE_SHIFT) - (addr >> PAGE_SHIFT))
  35
  36/*
  37 * vmbus_setevent- Trigger an event notification on the specified
  38 * channel.
  39 */
  40static void vmbus_setevent(struct vmbus_channel *channel)
  41{
  42        struct hv_monitor_page *monitorpage;
  43
  44        if (channel->offermsg.monitor_allocated) {
  45                /* Each u32 represents 32 channels */
  46                sync_set_bit(channel->offermsg.child_relid & 31,
  47                        (unsigned long *) vmbus_connection.send_int_page +
  48                        (channel->offermsg.child_relid >> 5));
  49
  50                monitorpage = vmbus_connection.monitor_pages;
  51                monitorpage++; /* Get the child to parent monitor page */
  52
  53                sync_set_bit(channel->monitor_bit,
  54                        (unsigned long *)&monitorpage->trigger_group
  55                                        [channel->monitor_grp].pending);
  56
  57        } else {
  58                vmbus_set_event(channel);
  59        }
  60}
  61
  62/*
  63 * vmbus_get_debug_info -Retrieve various channel debug info
  64 */
  65void vmbus_get_debug_info(struct vmbus_channel *channel,
  66                              struct vmbus_channel_debug_info *debuginfo)
  67{
  68        struct hv_monitor_page *monitorpage;
  69        u8 monitor_group = (u8)channel->offermsg.monitorid / 32;
  70        u8 monitor_offset = (u8)channel->offermsg.monitorid % 32;
  71
  72        debuginfo->relid = channel->offermsg.child_relid;
  73        debuginfo->state = channel->state;
  74        memcpy(&debuginfo->interfacetype,
  75               &channel->offermsg.offer.if_type, sizeof(uuid_le));
  76        memcpy(&debuginfo->interface_instance,
  77               &channel->offermsg.offer.if_instance,
  78               sizeof(uuid_le));
  79
  80        monitorpage = (struct hv_monitor_page *)vmbus_connection.monitor_pages;
  81
  82        debuginfo->monitorid = channel->offermsg.monitorid;
  83
  84        debuginfo->servermonitor_pending =
  85                        monitorpage->trigger_group[monitor_group].pending;
  86        debuginfo->servermonitor_latency =
  87                        monitorpage->latency[monitor_group][monitor_offset];
  88        debuginfo->servermonitor_connectionid =
  89                        monitorpage->parameter[monitor_group]
  90                                        [monitor_offset].connectionid.u.id;
  91
  92        monitorpage++;
  93
  94        debuginfo->clientmonitor_pending =
  95                        monitorpage->trigger_group[monitor_group].pending;
  96        debuginfo->clientmonitor_latency =
  97                        monitorpage->latency[monitor_group][monitor_offset];
  98        debuginfo->clientmonitor_connectionid =
  99                        monitorpage->parameter[monitor_group]
 100                                        [monitor_offset].connectionid.u.id;
 101
 102        hv_ringbuffer_get_debuginfo(&channel->inbound, &debuginfo->inbound);
 103        hv_ringbuffer_get_debuginfo(&channel->outbound, &debuginfo->outbound);
 104}
 105
 106/*
 107 * vmbus_open - Open the specified channel.
 108 */
 109int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
 110                     u32 recv_ringbuffer_size, void *userdata, u32 userdatalen,
 111                     void (*onchannelcallback)(void *context), void *context)
 112{
 113        struct vmbus_channel_open_channel *open_msg;
 114        struct vmbus_channel_msginfo *open_info = NULL;
 115        void *in, *out;
 116        unsigned long flags;
 117        int ret, t, err = 0;
 118
 119        newchannel->onchannel_callback = onchannelcallback;
 120        newchannel->channel_callback_context = context;
 121
 122        /* Allocate the ring buffer */
 123        out = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
 124                get_order(send_ringbuffer_size + recv_ringbuffer_size));
 125
 126        if (!out)
 127                return -ENOMEM;
 128
 129
 130        in = (void *)((unsigned long)out + send_ringbuffer_size);
 131
 132        newchannel->ringbuffer_pages = out;
 133        newchannel->ringbuffer_pagecount = (send_ringbuffer_size +
 134                                           recv_ringbuffer_size) >> PAGE_SHIFT;
 135
 136        ret = hv_ringbuffer_init(
 137                &newchannel->outbound, out, send_ringbuffer_size);
 138
 139        if (ret != 0) {
 140                err = ret;
 141                goto error0;
 142        }
 143
 144        ret = hv_ringbuffer_init(
 145                &newchannel->inbound, in, recv_ringbuffer_size);
 146        if (ret != 0) {
 147                err = ret;
 148                goto error0;
 149        }
 150
 151
 152        /* Establish the gpadl for the ring buffer */
 153        newchannel->ringbuffer_gpadlhandle = 0;
 154
 155        ret = vmbus_establish_gpadl(newchannel,
 156                                         newchannel->outbound.ring_buffer,
 157                                         send_ringbuffer_size +
 158                                         recv_ringbuffer_size,
 159                                         &newchannel->ringbuffer_gpadlhandle);
 160
 161        if (ret != 0) {
 162                err = ret;
 163                goto error0;
 164        }
 165
 166        /* Create and init the channel open message */
 167        open_info = kmalloc(sizeof(*open_info) +
 168                           sizeof(struct vmbus_channel_open_channel),
 169                           GFP_KERNEL);
 170        if (!open_info) {
 171                err = -ENOMEM;
 172                goto error0;
 173        }
 174
 175        init_completion(&open_info->waitevent);
 176
 177        open_msg = (struct vmbus_channel_open_channel *)open_info->msg;
 178        open_msg->header.msgtype = CHANNELMSG_OPENCHANNEL;
 179        open_msg->openid = newchannel->offermsg.child_relid;
 180        open_msg->child_relid = newchannel->offermsg.child_relid;
 181        open_msg->ringbuffer_gpadlhandle = newchannel->ringbuffer_gpadlhandle;
 182        open_msg->downstream_ringbuffer_pageoffset = send_ringbuffer_size >>
 183                                                  PAGE_SHIFT;
 184        open_msg->target_vp = newchannel->target_vp;
 185
 186        if (userdatalen > MAX_USER_DEFINED_BYTES) {
 187                err = -EINVAL;
 188                goto error0;
 189        }
 190
 191        if (userdatalen)
 192                memcpy(open_msg->userdata, userdata, userdatalen);
 193
 194        spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
 195        list_add_tail(&open_info->msglistentry,
 196                      &vmbus_connection.chn_msg_list);
 197        spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
 198
 199        ret = vmbus_post_msg(open_msg,
 200                               sizeof(struct vmbus_channel_open_channel));
 201
 202        if (ret != 0)
 203                goto error1;
 204
 205        t = wait_for_completion_timeout(&open_info->waitevent, 5*HZ);
 206        if (t == 0) {
 207                err = -ETIMEDOUT;
 208                goto error1;
 209        }
 210
 211
 212        if (open_info->response.open_result.status)
 213                err = open_info->response.open_result.status;
 214
 215        spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
 216        list_del(&open_info->msglistentry);
 217        spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
 218
 219        kfree(open_info);
 220        return err;
 221
 222error1:
 223        spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
 224        list_del(&open_info->msglistentry);
 225        spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
 226
 227error0:
 228        free_pages((unsigned long)out,
 229                get_order(send_ringbuffer_size + recv_ringbuffer_size));
 230        kfree(open_info);
 231        return err;
 232}
 233EXPORT_SYMBOL_GPL(vmbus_open);
 234
 235/*
 236 * create_gpadl_header - Creates a gpadl for the specified buffer
 237 */
 238static int create_gpadl_header(void *kbuffer, u32 size,
 239                                         struct vmbus_channel_msginfo **msginfo,
 240                                         u32 *messagecount)
 241{
 242        int i;
 243        int pagecount;
 244        unsigned long long pfn;
 245        struct vmbus_channel_gpadl_header *gpadl_header;
 246        struct vmbus_channel_gpadl_body *gpadl_body;
 247        struct vmbus_channel_msginfo *msgheader;
 248        struct vmbus_channel_msginfo *msgbody = NULL;
 249        u32 msgsize;
 250
 251        int pfnsum, pfncount, pfnleft, pfncurr, pfnsize;
 252
 253        pagecount = size >> PAGE_SHIFT;
 254        pfn = virt_to_phys(kbuffer) >> PAGE_SHIFT;
 255
 256        /* do we need a gpadl body msg */
 257        pfnsize = MAX_SIZE_CHANNEL_MESSAGE -
 258                  sizeof(struct vmbus_channel_gpadl_header) -
 259                  sizeof(struct gpa_range);
 260        pfncount = pfnsize / sizeof(u64);
 261
 262        if (pagecount > pfncount) {
 263                /* we need a gpadl body */
 264                /* fill in the header */
 265                msgsize = sizeof(struct vmbus_channel_msginfo) +
 266                          sizeof(struct vmbus_channel_gpadl_header) +
 267                          sizeof(struct gpa_range) + pfncount * sizeof(u64);
 268                msgheader =  kzalloc(msgsize, GFP_KERNEL);
 269                if (!msgheader)
 270                        goto nomem;
 271
 272                INIT_LIST_HEAD(&msgheader->submsglist);
 273                msgheader->msgsize = msgsize;
 274
 275                gpadl_header = (struct vmbus_channel_gpadl_header *)
 276                        msgheader->msg;
 277                gpadl_header->rangecount = 1;
 278                gpadl_header->range_buflen = sizeof(struct gpa_range) +
 279                                         pagecount * sizeof(u64);
 280                gpadl_header->range[0].byte_offset = 0;
 281                gpadl_header->range[0].byte_count = size;
 282                for (i = 0; i < pfncount; i++)
 283                        gpadl_header->range[0].pfn_array[i] = pfn+i;
 284                *msginfo = msgheader;
 285                *messagecount = 1;
 286
 287                pfnsum = pfncount;
 288                pfnleft = pagecount - pfncount;
 289
 290                /* how many pfns can we fit */
 291                pfnsize = MAX_SIZE_CHANNEL_MESSAGE -
 292                          sizeof(struct vmbus_channel_gpadl_body);
 293                pfncount = pfnsize / sizeof(u64);
 294
 295                /* fill in the body */
 296                while (pfnleft) {
 297                        if (pfnleft > pfncount)
 298                                pfncurr = pfncount;
 299                        else
 300                                pfncurr = pfnleft;
 301
 302                        msgsize = sizeof(struct vmbus_channel_msginfo) +
 303                                  sizeof(struct vmbus_channel_gpadl_body) +
 304                                  pfncurr * sizeof(u64);
 305                        msgbody = kzalloc(msgsize, GFP_KERNEL);
 306
 307                        if (!msgbody) {
 308                                struct vmbus_channel_msginfo *pos = NULL;
 309                                struct vmbus_channel_msginfo *tmp = NULL;
 310                                /*
 311                                 * Free up all the allocated messages.
 312                                 */
 313                                list_for_each_entry_safe(pos, tmp,
 314                                        &msgheader->submsglist,
 315                                        msglistentry) {
 316
 317                                        list_del(&pos->msglistentry);
 318                                        kfree(pos);
 319                                }
 320
 321                                goto nomem;
 322                        }
 323
 324                        msgbody->msgsize = msgsize;
 325                        (*messagecount)++;
 326                        gpadl_body =
 327                                (struct vmbus_channel_gpadl_body *)msgbody->msg;
 328
 329                        /*
 330                         * Gpadl is u32 and we are using a pointer which could
 331                         * be 64-bit
 332                         * This is governed by the guest/host protocol and
 333                         * so the hypervisor gurantees that this is ok.
 334                         */
 335                        for (i = 0; i < pfncurr; i++)
 336                                gpadl_body->pfn[i] = pfn + pfnsum + i;
 337
 338                        /* add to msg header */
 339                        list_add_tail(&msgbody->msglistentry,
 340                                      &msgheader->submsglist);
 341                        pfnsum += pfncurr;
 342                        pfnleft -= pfncurr;
 343                }
 344        } else {
 345                /* everything fits in a header */
 346                msgsize = sizeof(struct vmbus_channel_msginfo) +
 347                          sizeof(struct vmbus_channel_gpadl_header) +
 348                          sizeof(struct gpa_range) + pagecount * sizeof(u64);
 349                msgheader = kzalloc(msgsize, GFP_KERNEL);
 350                if (msgheader == NULL)
 351                        goto nomem;
 352                msgheader->msgsize = msgsize;
 353
 354                gpadl_header = (struct vmbus_channel_gpadl_header *)
 355                        msgheader->msg;
 356                gpadl_header->rangecount = 1;
 357                gpadl_header->range_buflen = sizeof(struct gpa_range) +
 358                                         pagecount * sizeof(u64);
 359                gpadl_header->range[0].byte_offset = 0;
 360                gpadl_header->range[0].byte_count = size;
 361                for (i = 0; i < pagecount; i++)
 362                        gpadl_header->range[0].pfn_array[i] = pfn+i;
 363
 364                *msginfo = msgheader;
msgsize = sizeof(struct  f(strgsize" class="sref"> f(L266"3class="line" n3"> 343                }
 337
byte_offset = 0;
error0:
 230        byte_offset = 0;
 230        byte_offset = 0;
NOMEMif (!msgheader;
 343                }
 274
 235/*
 236
 237
236 : a /span> dl for the specified buffer 236 330 331 332verything fits in a header */ 251gpadl_establish class=vmbus_channel_gpadl_establish classe=kfr"sref">gpadl_header = (struct <=vmbus_channel_gpadl_header"unt" cgpadl_headercreate_gpadl_header(void * 362 buffer, u32 NULL) 344 } else { 246 struct vmbus_channel_gpadl_headeder->msgheader; 247 struct vmbus_channel_gpadl_body *gpadl_body; 248 struct vmbus_channel_msgi *ms">tmp = NULL; 248 struct vmbus_channel_me=submef="+code=vmbus_chae=submef="ode=NULL" class="sref">NULL; 230 msf"size"ode=NULL" class="sref">NULL; 248 ist_a"sre class="sref">mist_a"sreunt" cgpadl_header -= pfncurr; 230 pfncurr; 24=u32" class="srg_lock, pfncurr; 251r0].byte_offset = 0; 251].NULL; 316 257next_gpadl_handlcmsatomic_rsre class="sref">matomic_rsree=kfrspin_unlock_irqrestore(&vmbus_connext_gpadl_handlcbyte_offset = 0; 228atomic_in/a> = vmbus_connext_gpadl_handlcbyte_offset = 0; 289 230r0].u32 msf"size"ode=y="sref">byte_offset = 0; 350 r0].NULL) 231 r0].byte_offset = 0; 363 **gpadl_heawaitevee" class="sref">mwaitevee"ode=y="sref">byte_offset = 0; 255 gpadl_header = (struct vmbus_unlock_irqresto fo **gpadl_header->msg; 257headeder->gpadl_hea"+code=vmbus_channel_"sref">vmb"sref">vmbus_condertyp/a> = = msg; 228headeder->gpadl_heachild_rslie class="sref">mchild_rsliet" clasgpadl_headergpadl_heaoe=kbder->vmb"sref">vmbus_conchild_rslie class="sref">mchild_rsliet" ce=msg" class="sref">msg; 228headeder->gpadl_heaclass=vmbus_channel_classe=kflasgpadl_headerpfncurr; 320 301 230spin_lock_irqsav>u32 e=kfrspin_unlock_irqrestore(&vmbus_con01 der_lock=vmbus_channel_header"der_lockuffere=u32" class="srg_lock, byte_offset = 0; 253 list_add_tail **gpadl_header->msglistentry, 31spin_unlock_irqrestore(&vmbus_con01n_der_l->byte_offset = 0; 255 vmbus_con01 der_lock=vmbus_channel_header"der_lockuffere=u32" class="srg_lock, byte_offset = 0; 337 228r0].->gpadl_header-> 319 ass="sr>vmbus_channel_msgi *byte_offset = 0; 350 r0].NULL) pfncurr; pfncurr; 350 size" class="sref">msf"size"ode=t" cla1ass="sref">msglistentry) { 253 ry_safe"a href="+code=list_ary_safe"="sreate_gpadl_headet -= msgheader->msglistentry) { 255 326 e=submef="+code=vmbus_chae=submef="ode=ass="sref">gpadl_header = (struct _unlock_irqrestot -= pfncurr; 327 *gpadl_body = 358 (struct vmbus_channel_gpadle=submef="+code=vmbus_chae=submef="ode=ass="sref">gpadl_header->msg; 289 340 *gpadl_hea"+code=vmbus_channel_"sref">vmb"sref">vmbus_condertyp/a> = 289 321 gpadl_header = msg; 362 *gpadl_heaclass=vmbus_channel_classe=kflasgpadl_headerpfncurr; 363 324 r0].->msglistentry, 335 324 e=submef="+code=vmbus_chae=submef="ode=ass="sref">gpadl_header-> 336 ass="sr>vmbus_channel_me=submef="+code=vmbus_chae=submef="ode=)y="sref">byte_offset = 0; 297 r0].NULL) 338<<<<<<<< cleanu>pos, ncurr" class="sref">pfncurr; 289 343 } 343 } 230].mwaitary_secmple **gpadl_heawaitevee" class="sref">mwaitevee"ode=, 5>vmbus_channel_mHZ class="sref">mHZe=fly="sref">byte_offset = 0; 253BUG_ON class="sref">mBUG_ON="sreate_gpadl_heade].byte_offset = 0; 274 255 345 Ahe hype is u, rece"L2d lass gpadl_dn claverything fits in a header */ gpadl_heaclass=vmbus_channel_classe=kf="sref">byte_offset = 0; 328 pos, ncurr0" class="sref">error0: 230spin_lock_irqsav>u32 e=kfrspin_unlock_irqrestore(&vmbus_con01 der_lock=vmbus_channel_header"der_lockuffere=u32" class="srg_lock, byte_offset: 230 list_dil **gpadl_header->byte_offset: 230spin_unlock_irqrestor>u32 e=kfrspin_unlock_irqrestore(&vmbus_con01 der_lock=vmbus_channel_header"der_lockuffere=u32" class="srg_lock, byte_offset: 353 byte_offset: 231 r0].byte_offset = 0; 343 } 231 EXPORT_SYMBOL_GPmp = byte_offset: 328 235/* 330/* 331 251gpadl_teardown class=vmbus_channel_gpadl_teardown classe=kfr"sref">gpadl_header = (struct <=vmbus_channel_gpadl_header"unt" cgpadl_header NULL) msglistentry) { ->msg; 248 struct vmbus_channel_mef="+code=vmbus_chaef="ode=NULL" class="sref">NULL; f(4trgsize" class="sref"> f4L266"4class="line" name="L244"> 24=u32" class="srg_lock, pfncurr; 251r0].pfncurr; 328 228ef="+code=vmbus_chaef="ode= class="sref">msghemder = vmbus_channel_mef="+code=vmbus_chaef="ode= class="sref">gpa_range) + 340> sizeof(struct msgsize, GFP_KERNEL); ef="+code=vmbus_chaef="ode= ass="sref">GFP_KERNEL); NOMEMif (!msgheader; 353 gpadl_heawaitevee" class="sref">mwaitevee"ode=y="sref">byte_offset = 0; 255 gpadl_header = (struct gpadl_header->msg; 337 228der->gpadl_hea"+code=vmbus_channel_"sref">vmb"sref">vmbus_condertyp/a> = mAGE" clMSG_GPADLETEARDOWN+code=msg" class="sref">msg; 228der->gpadl_heachild_rslie class="sref">mchild_rsliet" clasgpadl_headergpadl_heaoe=kbder->vmb"sref">vmbus_conchild_rslie class="sref">mchild_rsliet" ce=msg" class="sref">msg; 230der->gpadl_heaclass=vmbus_channel_classe=kflasgpadl_headermsg; 301 230spin_lock_irqsav>u32 e=kfrspin_unlock_irqrestore(&vmbus_con01 der_lock=vmbus_channel_header"der_lockuffere=u32" class="srg_lock, byte_offset: 253 list_add_taef="+code=vmbus_chaef="ode=ass="sref">gpadl_header->msglistentry, (&vmbus_con01n_der_l->byte_offset = 0; 230spin_unlock_irqrestor>u32 e=kfrspin_unlock_irqrestore(&vmbus_con01 der_lock=vmbus_channel_header"der_lockuffere=u32" class="srg_lock, byte_offset = 0; ->msglistentry, 297<0"> 340> sizeof(struct byte_offset = 0; 328 228BUG_ON class="sref">mBUG_ON="sreate_gpadl_header0].byte_offset = 0; 230].mwaitary_secmplegpadl_heawaitevee" class="sref">mwaitevee"ode=, 5>vmbus_channel_mHZ class="sref">mHZe=fly="sref">byte_offset = 0; 230BUG_ON class="sref">mBUG_ON="sreate_gpadl_heade].byte_offset = 0; pfncurr; 345 Rece"L2d a torndowneresponse1 vmbus_con01 der_lock=vmbus_channel_header"der_lockuffere=u32" class="srg_lock, byte_offset 230 list_def="+code=vmbus_chaef="ode=ass="sref">gpadl_header->byte_offset vmbus_con01 der_lock=vmbus_channel_header"der_lockuffere=u32" class="srg_lock, byte_offset 337 228 byte_offset 231 r0].byte_offset = 0; 343 } 231 EXPORT_SYMBOL_GPmp = byte_offset pfncurr; 235/* 330/* 231 crunlock_irqrestore(loseref="+code=vmbus_connelosee=kfr"sref">gpadl_header = (struct <=vmbus_channel_gpadl_header"unt" cgpadl_headerGFP_KERNEL); msglistentry) { 248 struct ->msg; 251r0].msg; 24=u32" class="srg_lock, pfncurr; 301 345 Stop callback aneshancel1adertimer asap1 253spin_lock_irqsav>u32 e=kfrspin_unlock_irqrestotruct <=vmbus_channel_header"unt"ass="sref">gpadl_heainbound_lock=vmbus_channel_inbound_lockuffere=u32" class="srg_lock, byte_offset gpadl_heaonheader"aeallback->tmp = NULL; 230spin_unlock_irqrestor>u32 e=kfrspin_unlock_irqrestotruct <=vmbus_channel_header"unt"ass="sref">gpadl_heainbound_lock=vmbus_channel_inbound_lockuffere=u32" class="srg_lock, byte_offset 316 345 Send a elosi 24sgsize<1 328 228der->gpadl_heaelosesder->vmb"sref">vmbus_conder->msg; 320 230der->gpadl_hea"+code=vmbus_channel_"sref">vmb"sref">vmbus_condertyp/a> = mAGE" clMSG_CLOSEAGE" cl+code=msg" class="sref">msg; 230der->gpadl_heachild_rslie class="sref">mchild_rsliet" clasgpadl_headergpadl_heaoe=kbder->vmb"sref">vmbus_conchild_rslie class="sref">mchild_rsliet" ce=msg" class="sref">msg; 353 -> sizeof(struct byte_offset = 0; 255 mBUG_ON="sreate_gpadl_header0].byte_offset = 0; 345 Tear downeaderclass l_header> = 0; 's ri 24ode=kb1 truct <=vmbus_channel_header"unt"ass="sref">gpadl_heari 2ode=kb classhandlcGFP_KERNEL); 359 gpadl_teardown class=vmbus_channel_gpadl_teardown classe=kfr truct <=vmbus_channel_header"unt"ass="sref">msglistentry, 340<<<<<<<<<<<<<<<<<<< truct <=vmbus_channel_header"unt"ass="sref">gpadl_heari 2ode=kb classhandlcbyte_offset = 0; 301 345 Cleanu>eaderri 24ode=kbs l_headisr> = 0; 1 253hv_ri 2ode=kb cleanu>pos, e=kfrspin_unlock_irqrestotruct <=vmbus_channel_header"unt"ass="sref">gpadl_heaoutbound->byte_offset = 0; gpadl_heainbound=vmbus_channel_inboundunt" ="sref">byte_offset = 0; 255 2_unlock_irqrestotruct <=vmbus_channel_header"unt"ass="sref">gpadl_heari 2ode=kb de=pck, msglistentry, gpadl_heaget_orode=vmbus_channel_get_orodee=kfr truct <=vmbus_channel_header"unt"ass="sref">gpadl_heari 2ode=kb de=psize" class="sref">mri 2ode=kb de=psize"unt" c9sref">gpadl_heaPAGE_SIZE class="sref">mPAGE_SIZEunt")y="sref">byte_offset = 0; 328 289 343 } 231 EXPORT_SYMBOL_GPmp = byte_offset = 0; pfncurr; 235</* 330/* 231 : Pis upa to gpadl_header"name="Lure.un>/* 236/* 237 of what1adertder a gpa will holdun>/* 236 reatr of aderrequestun>/* 236/* 330/* 331/* 332v Sendsrdatanam/@ode=kb directly to hyp/r-v via adergpadlun>/* 232v Tdisrwill send aderdatanunpars2d o hyp/r-v.un>/* 330/* 231/* 236 251gpadl_sendpacketref="+code=vmbus_connsendpackete=kfr"sref">gpadl_header = (struct <=vmbus_channel_gpadl_header"unt" cgpadl_headercrcgpadl_header(void * 338<<< 319enum0gpadl_header = = msglistentry) { 248 vmpacket_descriptoe=vmbus_channel_gppacket_descriptoe+code=u32" class="srdesc=vmbus_channel_desct" ce=msg" class="sref">msg; 230 sizepacket_descriptoe=vmbus_channel_gppacket_descriptoe+cod) +e=u32" class="srode=kblenoid *msg; 253 mALIGNe=kfree" class="srefpacketlenoid *byte_offset<4s/hv/channel.c#Lfe="L236"> 236 236 236, a h5ef="drive5s/hv/channel.c#L310" id=5L310"51lass="line" name="L244"> 24=u32"r0]. 24=u32"rpadl_headdrive4s/hv/channel.c#L265" id=5L269"46lass="line" name="L228"> 228ef=5+code=vmb5s_chaef="ode= class="sre5">msg56340"54lass=3"> 343 5 sizeof(stru5t 251gpadl_se ef="+cod5=vmbus_chaef="ode= ass="5ref">57+code=vmbus_channel_"sref">vv/channel.c#L362" id=5L362"f">msg; 251gpadl_se NOMEMif (!msg; 251gpadl_se 251gpadl_se *a h4ef=href="+code=vmbuenitnecm5lemsg; unt"d=4L3351lass="line" name="L244"> 24=u32" e=kfrspin_unlocv/channel.c#L362" id=5L362"f">msg; byte_offdrive5s/hv/n a heaL317"5)L338"53lacket_descriptoe+"sref">mALIGNe=kfree" class="srefpacketlenoidunt"d=4L33L236"> 236-><5 href="+codass="sref">gp5dl_he5der = (struct msg; 236 228der5/a>-><5 href="+codass="sref">gp5dl_he5"+code=vmbus_channel_"sref">vsg_ef">g.c#Lus_channel_headerg_ef">g.c#Luid=5L338"53lacket_delass="aive4s/hv/channel.class="aiveus/h,33L236"> 236gp5dl_he5child_rslie class="sref">mchirg_set_lass_channel_headerg_set_las_heainbound=vmbus_channellass="aive4s/hv/channel.class="aiveus/h[0]ader-> 236-><5 href="+codass="sref">gp5dl_he5class=vmbus_channel_classe=kfrg_set_lass_channel_headerg_set_las_heainbound=vmbus_channellass="aive4s/hv/channel.class="aiveus/h[1]ref="+code=fly fi5s/hv/channel.c#L358" id=5L358"5sg; 236vrg_set_lass_channel_headerg_set_las_heainbound=vmbus_channellass="aive4s/hv/channel.class="aiveus/h[2]ader-> 319_lock_irq5av>u32 gpad338"53lacket_descriptoe+"sref">mALIGNe=kfree" class="srefpacketlenoid- sizepacket_descriptoe=vmbus_channel_gppacketL236"> 236->byte_offset = 0; ; -> 236u32 ) msglistentry) 340> 5 siz5of(st5uct = (strfly="sref">byte_offse> = (strfly="si 2ode=kb de=psize" class="sref">mri 2ode=kb de=psizeL236"> 236-><5drive4s/hv/channel.c#L285" id=5L289"48lass="line" name="L228"> 228BUG5ON class=5sref">mBUG_ON="sreate_gp5dl_he58ffset = 0; 343 href="+c5de"ode=lasgpadl_header 231 EXPORT_SYMBOON class=5sref">mBUG_ON="sreate_gp5dl_he59ee" class="srefgpadl_(loseref="+cvmbus_connelosee=kfy="sref">_offset = 0; 236 345 5 Rec5"L2d a torndowneresponse5 330u32 /* id=5L35304"5class="line" name="L330"> 330/* 236u32 251gpadl_se gpadl_header = (struct <=vmref"> crcgpadl_header(void * 251gpadl_se a>-><5 href="+code=kfree" clas5="sre59a hrecleanu>ncurr" class="sref">pfncuuuuuu_header_ _ 251gpadl_se N class=5href="+coderset" c="sref5>byte59mPAGE_SIZef">byte_offs, 251gpadl_s6} gpadl_hear"+codersquestiduffer fits in a header */ msglistentry)6L_GPmp 248 24=u326/* 24=u326<4pan cla6sv>u32 _ _ 230 <6 h5ef60ck_irqrestor>e=kfrspin_unlocuffere=u32" class="srus/hv/channe 230u32 = (struct sizepacket_descriptoe=vmbus_channel_gppacket56lass="line" name="L230"> 230mALIGNe=kfree" class="srefpacketlenoi56lass="line" name="L230"> 230 236mchiuffer fits in a header */ 236 24=u326 345 6 Sto6 callback aneshancel1ade6timer6asap1) mPAGE_SIZef">byte_offsdunt"*mPAGE_SIZMAX_L338"BUFFER_COUNT359"56lass=s="sref">msglistentry)6_lock_irq6av>u32 e=kfrspin_________der; 24=u326 4pan cla6channel_header"unt"ass="6ref">61345"44lass="line" name="L255"> 255u32 251gpadl_s6 Sen6 a elosi 24sgsize<1_ 251gpadl_s6 8ing fit6drive5s/hv/channel.c#L316" id=61n class="comment">/* ========* largid=v h5efwhv uppor=5L349"54lass="line" name="L236"> 236-><6 href="+codlasspin_unloc6_irqr61. negotiate,rtimeun> 251gpadl_s6 _ _ 251gpadl_s6 gp6dl_he6"+code=vmbus_ccccccccccccccccccc( mPAGE_SIZMAX_L338"BUFFER_COUNT359"d- sizepackeclass="sref">mPAGE_SIZef">byte_offs) *class=ame="L251"> 251gpadl_s6 Sto6 href="+codass="sref">gp6dl_he62dl_body" ass="sref">gpaddl_headecriptoe+cod) +e=u32" class=""unef">_ _ 236; 253->mALIGNe=kfree" class="srefpacketlenoid *byte_offset<4s/hv/channel.c#Lfe="L236"> 236mBUG_ON="sreate_gp6dl_he62 gpadl_dn claverything fits in a heade5st 251gpadl_s6 Tea6 downeaderclass l_header6 = 0;62f.msg; mPAGE_SIZVM_PKT_DATA_USINel.c#_DIRECT363"56lass="line" name="L253"> 253vv/channel.c#L362" id=5L362"f">msg; mPAGE_SIZVMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED363"56lass="line" name="L253"> 253-><6teardown class=vmbus_cha6nel_g62hild_rslie class="sref">mchiv/channel.c#L362" id=5L362"f">msg; 251gpadl_s6<<<<<<<<<6<<<<< truc6 <=vm63lass=vmbus_channel_classe=kfd=5Lannel.c#L362" id=5L362"f">msg; byte_offdrive5s/hv/n a heaL317"5)L338"53lacket_descriptoe+"sref">mALIGNe=kfree" class="srefpacketlenoidunt"d=4L33L236"> 236vv/channel.c#L362" id=5L362"f">msg; 236eaderri 24ode=kbs l_h6adisr63tlenoid *msg; mPAGE_SIZEang"ass="cket_deannel_classe=kfkeclass="sref">mPAGE_SIZef">byte_offs236"> 236pos, mPAGE_SIZef">byte_offs25ef="drive5s/hv/innel.c#L310" idi310"++) 56lass="line" name="L248"> 248id *msg; mPAGE_SIZEang"us/h[ef="drive5s/hv/innel.c#L310" idi310"]f">msg; msg; 236, 2_unloid *msg; mPAGE_SIZEang"us/h[ef="drive5s/hv/innel.c#L310" idi310"]f">msg; msg; 236msg; mPAGE_SIZEang"us/h[ef="drive5s/hv/innel.c#L310" idi310"]f">msg; msg; 236 231 EXPORT_SYMB6 343 6} g.c#Lus_channel_headerg_ef">g.c#Luid=5L338"53lacket_delass="aive4s/hv/channel.class="aiveus/h,33L236"> 236vrg_set_lass_channel_headerg_set_las_heainbound=vmbus_channellass="aive4s/hv/channel.class="aiveus/h[0]ader-> 236e=kfrspin_unlock_irqrestorg_set_lass_channel_headerg_set_las_heainbound=vmbus_channellass="aive4s/hv/channel.class="aiveus/h[1]ref="+code=fly fi5s/hv/channel.c#L358" id=5L358"5sg; 236/* <6 h5ef64av>e=kfrspin_unlock_irqrestotg_set_lass_channel_headerg_set_las_heainbound=vmbus_channellass="aive4s/hv/channel.class="aiveus/h[2]ader-> 319mALIGNe=kfree" class="srefpacketlenoid- sizepacket_descriptoe=vmbus_channel_gppacketL236"> 236 : P6s upa to gpadl_header"na6e="Lu64326"526ass="line" n=pfn" class="srBUG6de=kb: Pi6 upa to ader a gpa you w6nt to64onnpot_ader->byte_offset = 0; ; -> 236 of what1ade6tder 64278"47lass="line" name="L228"> 228der6equestid:6Id"> reatr of aderreques6un>gpadl_heari 2ode=kb classhandls/hv/channel.c#L338" id=4LL292der msglistentry)6yp/: Typ/6of packet adat1isrbei 246end e64dl_teardown classe=kfr tructtrfly="sref">byte_offse> = (strfly="si 2ode=kb de=psize" class="sref">mri 2ode=kb de=psizeL236"> 2366* 230der6/* 343 6ndsrdatan6m/@ode=kb directly to hy6/r-v 6ia ade54lass=31"> 231 EXPORT_SYMB6isrwill s6nd aderdatanunpars2d o 6yp/r-6.un>byte_offset = 0; 236/* 255/* 251gpadl_s6thing fit6 in a header */ <6 h5ef6"drive5s/hv/channel.c#L357" idan class="commentrmultief"> id=5L unt" cgp357"5class=ame="L251"> 251gpadl_s6t Tea6f="+code=vmbus_connsendp6ckete65gpa will holdun> 236 /* <=5L357"5class=ame="L251"> 251gpadl_s6enum0gpad6_header 6 gpadl_header = (struct <=vmrmultief"> crcgpadl_header(void * 251gpadl_s6{ gpadle+cod) +e=u32" class=""unmultief">_ _ (void * 251gpadl_s6{span cla6t_descriptoe=vmbus_chann6l_gpp66+code=vmbus_ccccccccccccccccccccccccc/span> msglistentry)6 <6 href="+code=u32" class=6srpac6etleno56lass="line" name="L248"> 248 343 6r *a h4ef6"drive4s/hv/channel.c#L360" id6673 eizepacket_descriptoe=vmbus_chan" cgpadl_headeunt" crmultief">_ _ 230 230, sizepacket_descriptoe=vmbus_channel_gppacket56lass="line" name="L230"> 230mALIGNe=kfree" class="srefpacketlenoi56lass="line" name="L230"> 230 236msg66hild_rslie class="sref">mchiuffer fits in a header */ 236 24=u326 ef="+cod6=vmbus_chaef="ode= ass="6ref">67+code=vmbus_channel_"sref">vacketlen_al="L24t" clasgpadl_headermPAGE_SIZefnass="enoid *mPAGE_SIZNUM_L338S_SPid=5D_offset = 0; msetnnel.c#L310" idoffsetcketaclass=ame="L251"> 251gpadl_s6 <6f">NOMEMif (!gpaddl_headdddddddddddddddet = 0; 236 255 2odL338"53lacket_desfnass="sref">mPAGE_SIZefnass="enoid<"*0) ||) mPAGE_SIZefnass="enoid&nt"*mPAGE_SIZMAX_MULTIL338"BUFFER_COUNTcketL56lass=s="sref">msglistentry)6/a>-><6 href="+codass="sref">gp6dl_he67L244"> 2_unloid *; 24=u326/0]. 228der6/a>-><6 href="+codass="sref">gp6dl_he6"+code=vmbus_chment">/* 251gpadl_s6/code=vmb6 href="+codass="sref">gp6dl_he67. negotiate,rtimeun>_ 232v T6/a>-><6 href="+codass="sref">gp6dl_he68> 236 251gpadl_s6_lock_irq6av>u32 _ _ 251gpadl_s6/ <6 href="+code=list_add_ta6l" cl68av>e=kfrspin___________________( mPAGE_SIZMAX_MULTIL338"BUFFER_COUNTcketd- sizepackfnass="sref">mPAGE_SIZefnass="enoi) *class=ame="L251"> 251gpadl_s6unlock_ir6restore(&byte_offset<4s/hv/channel.c#Lfe="L236"> 236u32 e=kfrspin_unlocket_descriptoe=vmbus_channel_gppacket_deannel_classe=kfd=5L4s/hv/channel.c#L33d=5L4s/h362"_msg; 253 = (struct mALIGNe=kfree" class="srefpacketlenoid *byte_offset<4s/hv/channel.c#Lfe="L236"> 236 6 siz6of(st68278"47lass="line" name="L228"> 228der6/a>-><6drive4s/hv/channel.c#L286" id=6L289"48lass="line" name="L228"> 228BUG6ON class=6sref">mBUG_ON="sreate_gp6dl_he68ffset = 0verything fits in a heade5st 251gpadl_s6 href="+c6de"ode=lasgpadl_headermsg; mPAGE_SIZVM_PKT_DATA_USINel.c#_DIRECT363"56lass="line" name="L253"> 253mBUG_ON="sreate_gp6dl_he69+code=vmbus_channel_"sref">vv/channel.c#L362" id=5L362"f">msg; mPAGE_SIZVMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED363"56lass="line" name="L253"> 253msg; 251gpadl_s6 Rec6"L2d a torndowneresponse6e=kfrspin_unlock_irqrestod=5Lannel.c#L362" id=5L362"f">msg; byte_offdrive5s/hv/n a heaL317"5)L338"53lacket_descriptoe+"sref">mALIGNe=kfree" class="srefpacketlenoidunt"d=4L33L236"> 236u32 msg; 236msg; mPAGE_SIZEang"ass="cket_de1236"> 236 236 6drive4s/hv/channel.c#L296" id=69f.msg; mPAGE_SIZEang"us/hf">msg; 236-><6 href="+code=kfree" clas6="sre69+code=vmbus_channel_"sref">vv/channel.c#L362" id=5L362"f">msg; mPAGE_SIZEang"us/hf">msg; msetnnel.c#L310" idoffsetcket236"> 236 343 7} msg; mPAGE_SIZEang"us/hf">msg; 343 7}1mBUG_ON="sreate_gp7Pme=k70+code=vmbus_ccccccccmPAGE_SIZefnass="enoid*e=la= 0N="sref">byte_offset<4s/hv/channel.c#Lfe="L236"> 236 345 7/* e=kfrspin_unlock_irqrestotg_ef">g.c#Lus_channel_headerg_ef">g.c#Luid=5L338"53lacket_delass="aive4s/hv/channel.class="aiveus/h,33L236"> 236u32 -> 236 <7 h5ef70ck_irqrestor>e=kfrspin_unlocrg_set_lass_channel_headerg_set_las_heainbound=vmbus_channellass="aive4s/hv/channel.class="aiveus/h[1]ref="+code=fly fi5s/hv/channel.c#L358" id=5L358"5sg; 236u32 = (struct -> 319mALIGNe=kfree" class="srefpacketlenoid- sizepacket_descriptoe=vmbus_channel_gppacketL236"> 236 228BUG7r0].mchiconnpot_ader="sreate_gpadl_headeder->"unt"ass="srefwritus_channel_heade"unt"ass="srefwritu_heainbound=vmbus_channel_inboundunt" ="sref">byte_offset = 0; ; -> 236 230der7 msglistentry)7 Sto7 callback aneshancel1ade7timer71dl_body" ass="sref">g+e=u32" class="srcgpatrfly="sref">byte_offse> = (strfly="si 2ode=kb de=psize" class="sref">mri 2ode=kb de=psizeL236"> 236u32 71=kfrspin_unlo; 343 7_unlock_i7qrestor>u32 231 EXPORT_SYMB7 byte_offset = 0; 236 228der7 8ing fit7drive5s/hv/channel.c#L317" id=71n class="comment">/*/*d5L357"5class=ame="L251"> 251gpadl_s7/a>-><7 href="+codlasspin_unloc7_irqr71. negotiate,rtimeun> 251gpadl_s7 236gp7dl_he72rive5s/hv/channel.c#L352" id* @ 236gp7dl_he72dl_bos/hv/channel.c#L352" id* @ 236 236 236/* 236mBUG_ON="sreate_gp7dl_he72drive5s/hv/channel.c#L357" idaReceiy=s d="drily from h5efhyper-v " cgp and puts h5ef5s/h=at receiy=d5L346"54lass="line" name="L236"> 236 236/* <5L346"54lass="line" name="L236"> 236-><7teardown class=vmbus_cha7nel_g72. negotiate,rtimeun> 236 251gpadl_s7 gpadl_header = (srecvunt" cbus_channel_gpadl_hearecvunt" c_offs_headercrcgpadl_header(void * 251gpadl_s7 Sto7nu>eaderri 24ode=kbs l_h7adisr73dl_body" ass="sref">gpaddl_he="sref">byte_offffere=u32" class="srus/hv/channe msglistentry)7 pos, 248pos, e=er"aelosestruct 230e=kfrspin_unlocuffere=u32" class="srus/hv/channe 230, sizepacus5Lscriptoe=vmbus_chaus5Lscrcket56lass="line" name="L230"> 230 343 7 8ing fit7drive5s/hv/channel.c#L337" id=73+code=vmbus_channel_"sref">vloo="+ode=kbuffer floo=r */ 24=u327 343 7} 236 236 345 7>/* <7 h5ef74324"52lass="line" n=pfn" class="srr0]7adl_sendp7cket() - Send ader - Cre7tes a74=kfrspin_unlock_irqrestoef="connpot_ader="sreate_gpadl_headeder->"unt"ass="srefpeeks_channel_heade"unt"ass="srefpeek_heainbound=vmbus_channel_inboundunt" ="sref">byte_offset = 0; 236) msglistentry)7s Tea7Maximum0> of what1ade7tder 74 truct ; 236 reatr of aderreques7un> 228BUG7yp/: Typ/7of packet adat1isrbei 247end e74hild_rslie class="sref">mchiket_descriptoe=vmbus_channel_gppacket_deannel_classe=kfd=5Lannel.c#L362" id=5L362"f">msg; 2367*msg; 236/* 345 7ndsrdatan7m/@ode=kb directly to hy7/r-v 752ass=vmbus_ch> 230/* ) 248 2_unloid *"B 236 ncurr" clder; 230 75hild_rslie cl54lass=31"> 231 EXPORT_SYMB7{ 230der7{span cla7t_descriptoe=vmbus_chann7l_gpp76+code=vmbus_c> msg; 236 345 7 <7 href="+code=u32" class=7srpac763l_body" ass=header */ 251gpadl_s7r *a h4ef7"drive4s/hv/channel.c#L370" id76=kfrspin_unlock_irqrestoef="connpot_ader="sreate_gpadl_headeder->"unt"ass="srefrea/hv/channel.c#L3"unt"ass="srefrea/_heainbound=vmbus_channel_inboundunt" ="sref">byte_offset = 0; id *msg; -> 236, 236) msglistentry)7rpadl_hea7drive4s/hv/channel.c#L267" id=76a hrecleanu>ncurr" cl+e=u32" class="srcgpatrfly="sref">byte_offse> = (strfly="si 2ode=kb de=psize" class="sref">mri 2ode=kb de=psizeL236"> 236msg76340"54lass=3"> 343 7 7 sizeof(stru7t 23677+code54lass=31"> 231 EXPORT_SYMB7 <7f">NOMEMif (!_offset = 0; 236 251gpadl_s7 /* 251gpadl_s7/a>-><7 href="+codass="sref">gp7dl_he77drive5s/hv/channel.c#L357" id=5L357"5class=ame="L251"> 251gpadl_s7/0].gpadl_header = (srecvunt" c_rawbus_channel_gpadl_hearecvunt" c_raw_offs_headercrcgpadl_header(void * 251gpadl_s7/a>-><7 href="+codass="sref">gp7dl_he77a hrecleanu>ncurr" cleanu>ncurr" cl+e=u32" class="fffere=u32" class="srus/hv/channe 251gpadl_s7/code=vmb7 href="+codass="sref">gp7dl_he77dl_teardown classe=kfeanu>ncurr" cl+e=u32" class="fffer fits in a header */<> msglistentry)7/a>-><7 href="+codass="sref">gp7dl_he78> 248 230u32 230 343 7unlock_ir7restore(& 24=u327/u32 = (str> 236 7 siz7of(st787r = (str> 236-><7drive4s/hv/channel.c#L287" id=7L289"48lass="line" name="L228"> 228BUG7ON class=7sref">mBUG_ON="sreate_gp7dl_he78340"54lass=3"> 343 7 href="+c7de"ode=lasgpadl_header->"unt"ass="srefpeeks_channel_heade"unt"ass="srefpeek_heainbound=vmbus_channel_inboundunt" ="sref">byte_offset = 0; 343 7 ef="+cod7sref">mBUG_ON="sreate_gp7dl_he79+code=vmbus_ccccccccccccccccccccccdl_header"aelosestruct 236) msglistentry)7 Rec7"L2d a torndowneresponse7e=kfrspin_________; 236u32 255u32 = (struct msg; 236 7drive4s/hv/channel.c#L297" id=79278"47lass="line" name="L228"> 228der7_a>-><7 href="+code=kfree" clas7="sre79+code=vmbus_c> 230 343 8} ) 248mBUG_ON="sreate_gp8Pme=k80+code=vmbus_cccccccchref="+packetlenpr_er href="+ode=kblepr_er _offse5ef="drive5ser""as">"B 248gpaddl_he=5ef="drive5ser""as">"got 5efce=chanonly %d bytes\n"5L357"5p2lass="line" n=pfn" class="srr0]8/* e=kfrspin_________________ 236u32 230 <8 h5ef80ck_irqrestor>54lass=31"> 231 EXPORT_SYMB8t6ing fit8 restor>u32 236 = (str> msg; 236 228BUG8r0]. 251gpadl_s8 class="s8g_lock, ->"unt"ass="srefrea/hv/channel.c#L3"unt"ass="srefrea/_heainbound=vmbus_channel_inboundunt" ="sref">byte_offset = 0; -> 236 345 8_lock_irq8av>u32 ) msglistentry)8 4pan cla8channel_header"unt"ass="8ref">81=kfrspin_unlo________+e=u32" class="srcgpatrfly="sref">byte_offse> = (strfly="si 2ode=kb de=psize" class="sref">mri 2ode=kb de=psizeL236"> 236u32 = (str; 236 231 EXPORT_SYMB8 8ing fit8drive5s/hv/channel.c#L318" id=81n clasbyte_offset = 0; 236 T/hvorigiha= LXR software 236LXR s inunity hrefrt/is experin a a= hingion 236 rx/.lasux.no kindly hosted by 6"> 236