linux/drivers/lguest/lguest_device.c
<<
>>
Prefs
   1/*P:050
   2 * Lguest guests use a very simple method to describe devices.  It's a
   3 * series of device descriptors contained just above the top of normal Guest
   4 * memory.
   5 *
   6 * We use the standard "virtio" device infrastructure, which provides us with a
   7 * console, a network and a block driver.  Each one expects some configuration
   8 * information and a "virtqueue" or two to send and receive data.
   9:*/
  10#include <linux/init.h>
  11#include <linux/bootmem.h>
  12#include <linux/lguest_launcher.h>
  13#include <linux/virtio.h>
  14#include <linux/virtio_config.h>
  15#include <linux/interrupt.h>
  16#include <linux/virtio_ring.h>
  17#include <linux/err.h>
  18#include <linux/export.h>
  19#include <linux/slab.h>
  20#include <asm/io.h>
  21#include <asm/paravirt.h>
  22#include <asm/lguest_hcall.h>
  23
  24/* The pointer to our (page) of device descriptions. */
  25static void *lguest_devices;
  26
  27/*
  28 * For Guests, device memory can be used as normal memory, so we cast away the
  29 * __iomem to quieten sparse.
  30 */
  31static inline void *lguest_map(unsigned long phys_addr, unsigned long pages)
  32{
  33        return (__force void *)ioremap_cache(phys_addr, PAGE_SIZE*pages);
  34}
  35
  36static inline void lguest_unmap(void *addr)
  37{
  38        iounmap((__force void __iomem *)addr);
  39}
  40
  41/*D:100
  42 * Each lguest device is just a virtio device plus a pointer to its entry
  43 * in the lguest_devices page.
  44 */
  45struct lguest_device {
  46        struct virtio_device vdev;
  47
  48        /* The entry in the lguest_devices page for this device. */
  49        struct lguest_device_desc *desc;
  50};
  51
  52/*
  53 * Since the virtio infrastructure hands us a pointer to the virtio_device all
  54 * the time, it helps to have a curt macro to get a pointer to the struct
  55 * lguest_device it's enclosed in.
  56 */
  57#define to_lgdev(vd) container_of(vd, struct lguest_device, vdev)
  58
  59/*D:130
  60 * Device configurations
  61 *
  62 * The configuration information for a device consists of one or more
  63 * virtqueues, a feature bitmap, and some configuration bytes.  The
  64 * configuration bytes don't really matter to us: the Launcher sets them up, and
  65 * the driver will look at them during setup.
  66 *
  67 * A convenient routine to return the device's virtqueue config array:
  68 * immediately after the descriptor.
  69 */
  70static struct lguest_vqconfig *lg_vq(const struct lguest_device_desc *desc)
  71{
  72        return (void *)(desc + 1);
  73}
  74
  75/* The features come immediately after the virtqueues. */
  76static u8 *lg_features(const struct lguest_device_desc *desc)
  77{
  78        return (void *)(lg_vq(desc) + desc->num_vq);
  79}
  80
  81/* The config space comes after the two feature bitmasks. */
  82static u8 *lg_config(const struct lguest_device_desc *desc)
  83{
  84        return lg_features(desc) + desc->feature_len * 2;
  85}
  86
  87/* The total size of the config page used by this device (incl. desc) */
  88static unsigned desc_size(const struct lguest_device_desc *desc)
  89{
  90        return sizeof(*desc)
  91                + desc->num_vq * sizeof(struct lguest_vqconfig)
  92                + desc->feature_len * 2
  93                + desc->config_len;
  94}
  95
  96/* This gets the device's feature bits. */
  97static u32 lg_get_features(struct virtio_device *vdev)
  98{
  99        unsigned int i;
 100        u32 features = 0;
 101        struct lguest_device_desc *desc = to_lgdev(vdev)->desc;
 102        u8 *in_features = lg_features(desc);
 103
 104        /* We do this the slow but generic way. */
 105        for (i = 0; i < min(desc->feature_len * 8, 32); i++)
 106                if (in_features[i / 8] & (1 << (i % 8)))
 107                        features |= (1 << i);
 108
 109        return features;
 110}
 111
 112/*
 113 * To notify on reset or feature finaliof device .61"32(ab)he standNOTIFYn>
   14 * confihyperh)esshe confie.c#L11n>
   15 * the an>
   16featuc virtio_device *vdev)
   17   18vdevto_lgdev(vdev)->desc;
lguest_devices;
   19#inclref="drivers/lguest/lguest_device.c#L12" id=="L110" class="line" name="L20"> 1 20lgues.hlguesLHCALL_NOTIFYminminvdev 1 21#inclhref="drivers/lguest/lguest_device.c#L111" i2="L12" claass="line" name="L12">  112#inclref="drivers/lguest/lguest_device.c#L111" i2="L113" class="line" name="L23"> 1 23 * Topan>
 1 24/* The confio infraconaltake slow res come low Hosfeaffgue some copime low onean>
 1 25 * the dsuph
 1 26 * We uss
 1 27/*
 1 28 * For an>
 1 29lg_featurof deveures" clastruct virtio_device *vdev)
 1 30 1 31i;
i */<
 1 32lguest_device_desc *desc = to_lgdev(vdev)->desc;
 1 33        retur class="comment">/* We doSecoceihalfhe cp, andee sres come waiaccept1r an>
 1 34u8 *lg_fee tures" cla= lg_features(desc);
desc->feature_len * 2
href="drivers/lguest/lguest_device.c#L102" id="L25" c1lass="line" name="L35"> 1 35
 1 36/* We doG/lgio_devicsetupa chahe vioiacceptsres come1r an>
 1 37lg_fevsetu_transhvdev)->href="drivers/lguest/lguest_device.c#L102" id="L28" c1lass="line" name="L38"> 1 38 1 39/* We dn>
 1 40 * Devvvvvvvvv confioe.c
 1 41/*D:1vvvvvvvvv clow b metho:
 1 42 * Eacvvvvvvvv cis the sbut , manualenientrsytes proviie immethafteric waal1n>
 1 43 * in vvvvvvvv an>
  134vdevlg_fee tures" cla= desc->feature_len * 2
;href="drivers/lguest/lguest_device.c#L102" id="L45" c1lass="line" name="L45"> 1 45i */<
vdevdesc->feature_len * 2
,of(strucef="+code=vdev" class="sref">vdev)->features;
 1 46        struci = 0; i < i */<
i++)
 1 47to_lgdevic */i;
vdev)->features;
 1 48        lg_fee tures" cla= i / 8] & << i % 8)))
 1 49        struchref="drivers/lguest/lguest_device.c#L111" id="L50" c1lass="line" name="L50"> 1 50 1 51/* This gell Hosfe ;s feavaliofish tha
 1 52featuc vdev)->href="drivers/lguest/lguest_device.c#L102" id="L53" c1lass="line" name="L53"> 1 53 1 54 1 55 * lgis Ohe vireys feavaliou"fielg, gettetupa coppee citiie eas
 1 56lg_featugalvirtio_device *vdev)
vdev 1 57contabua
featua> * 2
;ref="drivers/lguest/lguest_device.c#L105" id="L28" c1lass="line" name="L58"> 1 58 1 59lguest_device_desc *desc;
to_lgdev(vdev)->desc;
 1 60 1 61/* This Checkvirey did;t reallaskc
 1 62descvdevfeatua> * 2
 a hrref="+code=desc" class="sref">desc->config_len;
 1 63featumemcprcontabua
lg_config(constef="+code=desc" class="sref">desc);
vdevfeatua> * 2
;href="drivers/lguest/lguest_device.c#L102" id="L54" c1lass="line" name="L64"> 1 64 1 65 1 66 *
 1 67vdevvirtio_device *vdev)
vdev 1 68contabua
featua> * 2
;ref="drivers/lguest/lguest_device.c#L105" id="L69" c1lass="line" name="L69"> 1 69 1 70lguest_device_desc *desc;
to_lgdev(vdev)->desc;
 1 71 1 72        retur class="comment">/* This Checkvirey did;t reallaskc
 1 73descvdevfeatua> * 2
 a hrref="+code=desc" class="sref">desc->config_len;
 1 74featumemcprlg_config(constef="+code=desc" class="sref">desc);
vdevcontabua
featua> * 2
;href="drivers/lguest/lguest_device.c#L102" id="L75" c1lass="line" name="L75"> 1 75 1 76 1 77/*
 1 78 * immedonfiopens
 1 79 * __iome confie.c#L1riptor.
 1 80 */
 1 81u8 *lg_featugal_b virtio_device *vdev)
 1 82 1 83to_lgdev(vdev)->desc;
lg_feb  1 84 1 85 1 86lg_featusal_b virtio_device *vdev)
u8 *lg_feb  1 87 1 88desclg_feb  1 89to_lgdev(vdev)->desc;
lg_feb lg_feb  1 90 1 91/* This gell Hosfeiately afterif waifailed/span>
 1 92             a href="+code=in_feb lg_feb lg_feVIRTIO_CONFIG_S_FAILED 1 93                + featuc vdev)->href="drivers/lguest/lguest_device.c#L102" id="L94" c1lass="line" name="L94"> 1 94}
 1 95
 1 96lg_featu or fvirtio_device *vdev)
 1 97 1 98/* The e0 b 
 1 99to_lgdev(vdev)->desc;
lg_feb 2100        featuc vdev)->href="drivers/lguest/lguest_device.c#L102" 2d="L101" 2lass="line" name="L101">210121022103 * Topan>
2104/* The cVeues. */
 2105 * the n>
2106 * We usonfiotets piecthe cstructure handso infraneedree sae"ueues. */":saewspee n>
 2107/*
 2108 * immedwrite ine v(ie. sed receirect/lgibuffgue).  lguese.c#L1rawn a curmultiplan>
2109 * __iomueues. */<:this examethoonfig psolver will usesor mo confihis sed etupapan>
2110 * Devicanotets his rect/letuan>
2111 *
2112/*
2113 * To noaln ady exof oninio_devicsetu.c.  We a virneedeturg pne hrit span>
 2 14 * confn>
 2 15 * the  We c 
 2 16 */
 2 17 2 18 * im30
 2 19lguest_devicfi_mati     href="drivers/lguest/lguest_device.c#L78" i2=="L110" 2lass="line" name="L20"> 2 20/* The eA coppee clow mation for ainer_of(aspan>
 2 21lguest_vqconfig *config_len< 2112#inclref="drivers/lguest/lguest_device.c#L111" 22="L113" 2lass="line" name="L23"> 2 23/* We doonfi/a>)esshwetseawermappedetnfio infrasetu,e cast awn unandeet1r an>
 2 24lg_feuseds 2 25 2 26 2 27/*
 2 28 * For  Whenvirtio_devicsetupaddrews
 2 29 * __iommakurt hyperh)esshe confiueue confiso low Hosfn>
 2 30 * Devicknowss proviueue confi ;s feanaltalketupaboutan>
 2 31 *
 2 32featut_fy on rvirtio_de confn>a href="+code=vdev" ass="sref">num_v>);
 2 33 2 34/* We dn>
 2 35 * theeeeeeeee  We c onalouriueue confimation for ae lgues"ps/l"spoinhe te confn>
 2 36 */
 2 37/*
 2 38lguest_devicfi_mati     ref="+code=vdev"llass="sref">lg_vq<> * sizhref="+code=to_lg ass="sref">num_v>);
lg_feus/l 2 39 2 40lgues.hlguesLHCALL_NOTIFYlg_vq<> * siconfig_len<minmin 2 41 2 42 2 43 * ine eAn exhe nse.="cr for ae sidrea C filree sbad fion.  Do;t realldoeet1r an>
 2134lg_vqlg_vqira 2 45 2 46 *
 2 47/*
 2 48 * For  device (inclnme celsrit span>
 2 49 * __ion>
 2 50 * Devicgets e sketdte cwn ugly duckletu.  I;s a
 2 51 *
 2 52/*
 2 53 * To noallocate ipreown usedslnme tell low Hosfe per virey are,generhis t_devi ips featn>
 2 54/* The cb methrthis defiHosfeturb mety tell use per vire usedslnndan>
 2 55 * lgr an>
 2 56virtio_de confn>a href="+code=vdev"aturofdclass="sref">lg_vqvirtio_device *vdev)
 2 57lg_vqifdex
 2 58configvirtio_de confn>a href="+code=vdev" ass="sref">num_v>);
 2 59num_v"L59;
 2 60 2 61lg_vq *vdev)
to_lgdev(vdev)->href="drivers/lguest/lguest_device.c#L108" 2d="L62" c2lass="line" name="L62"> 2 62lguest_devicfi_mati     ref="+code=vdev"llass="sref">lg_vq<> * sihref="drivers/lguest/lguest_device.c#L108" 2d="L43" c2lass="line" name="L63"> 2 63virtio_de confn>a href="+code=vdev" ass="sref">num_v>);
 2 64num_verr;
 2 65 2 66num_v"L59;
 2 67num_vNULL;
 2 68 2 69/* We d We m vira curdevicmanymueues. */<1r an>
 2 70lg_vqifdex
vdev)
desc;
lg_vqnumcla;
 2 71lg_vqERR_PTRmin 2 72 2 73lg_vq<> * sizhref="+code=to_lgkmallocss="sref">lg_vqkmalloclg_vq<> * si),hef="+code=vdev"GFP_KERNELss="sref">num_vGFP_KERNEL->href="drivers/lguest/lguest_device.c#L108" 2d="L14" c2lass="line" name="L74"> 2 74lg_vq<> * si)ref="drivers/lguest/lguest_device.c#L108" 2d="L55" c2lass="line" name="L75"> 2 75lg_vqERR_PTRmin 2 76 2 77/* We dn>
 2 78 * immmmmmmmmm* Makurt coppee clow "t  "s * ry,s provisipreaftern>
 2 79 * __immmmmmmm* escriptor. ascome mightfy on>
 2 80 */
 2 81/*D:1vvvvvvvvv an>
 2 82featumemcprlg_vq<> * siconfig_len<lg_vqvdev)
desc;
lg_vqifdex
lg_vq<> * siconfig_len< 2 83 2 84confipra hk"Mappetupleue confi 8)))i /a>)i 8)))lx\n"n>
lg_vqifdex
 2 85lg_vq<> * siconfig_len<minmin 2 86/* We doFn
 2 87lg_vq<> * silg_feusedslguest_devicandlg_vq<> * siconfig_len<minmin 2 88min 2 88;
min 2 59<"line" name="L88"> 2 88 1 88a href="+code=vdev" ass="sref">num_v>);
 2 59<"line" naode=desc"pfass="sref"IZEconfig_len< 2 74lg_vq<> * sii++)
 2 64lg_vqERR_PTRconfig_len< 2 74 r-ef+code=config_len"ss="sref">config_len< 2 41 1 95
 2sltandsetupwill laku some andeira; memoryv an>
 2 OK,ment">n class="commclasseass=an class="comn  rwe"L30"53
 2 drews<5
 2 7o .="cr ru<5:="comhan cfiopen(110">2) SMP CPUoonfi/a>onlycommen conf-cpuodtandsetupwill laku some andeira; memoryv an>
 2 8arrisomomment"> */
 2 81/*D:1vvvvvvvvv an>
virtio_de conf   ref="+code=vdev" hrefnew_ 2 63desc;
 2 88;
 1 88i;
a href="+code=vdev" ass="sref">num_v>);
 2 59<"line" naode=desc"pfass= ruvdev)
 2 88lg_vq<> * si 2 66config_len<virtio_de confni++)
 2 64lg_vqERR_PTRconfig_len<lg_vqERR_Phwetsr-ef+code=config_len"ss="sref">config_len< 2 41 2 68 2 78 2 t">/* This gell Hosfeiately afterif waifailed/span>
 2 64 2 88lg_vqira 2 64lg_vq<> * s3href="dri3ers/lguest/lguest_device3c#L6231 id="L92" c1lline" nagotoaode=desc"pfass=df">roy_< hre"sref">vdev)
<>roy_< hrer-ef+code=config_len"ss="sref">config_len< 2 83 2 34/* We dn>
 2 91/* We dn>
 2  confruptcass=less="comment"> * __iome confie.c#L1riptor.
 2="comment"> * __iome confie.c#L1riptor.
 2 FIXME:s="cus> * thte cwn flag 54/* T* esuldcus>="comment"> * __iome confie.c#L1riptor.
 2 79
 2 8acks="comment"> * __iome confie.c#L1riptor.
 2 81/*D:1vvvvvvvvv an>
 2 64 2 88a href="+code=vdev" ass="sref">num_v>);
 2 59<"lode=desc"pfass=dfv_"> 2 66 2href="+code=u8" cmemcprss=vdev"ass="sref">i;
i(virtio_de confn+code=config_len"ss="sref">config_len< 2 64lg_vq<> * s3href="dri3ers/lguest/lguest_device3c#L1832 2d="L55" c2lass="lingotoaode=desc"pfass=free_ass="sref">vdevfree_ass=r-ef+code=config_len"ss="sref">config_len< 2 26 2 77/* We dn>
 2 Lommespant">womhaokss=aan cl low "> * immmmmmmmm=lgueurt copspa 2  77/* We dn>
 2 the cstruc low  );
< ue confs="comment"> * __iome confie.c#L1riptor.
 2 81/*D:1vvvvvvvvv an>
lg_vq<> * sizhref="+code=to_lg ass="sref">num_v>);
lguest_devicfi_mati     ref="+code=vdev"llass="sref">lg_vq<> * s3href="dri3ers/lguest/lguest_device3c#L1033 2d="L82" c2le" name="L75"> 2 75virtio_de confn>a href="+code=vdev" ass="sref">num_v>);
<3 ref="dri3ers/lguest/lguest_device3c#L1033 2d="L83" c2lass="line" name="L83"> 2 83vdevfree_ass=r-ef:L83" c2lass="line" name="L83"> 2 83vdevd l_free_ass=evic.dev" nnnnn4cline" name="L88"> 2 88config_len<roy_< hre"sref">vdev)
<>roy_< hrer-ef:L83" c2lass="line" name="L83"> 2 83virtio_de confn+code=config_len"ss="sref">config_len<lg_vqERR_Phwetsr-ef:L83" c2lass="line" name="L83"> 2 83 2hwetsref">lg_vqERR_PL83"> 2hwetsevic.dev" nnnnn4cline" name="L88"> 2 88lg_vq<> * siconfig_len< 2 74 r-ef:L83" c2lass="line" name="L83"> 2 83 2 88config_len< 2 75 2 64config_len< 2 41/*D:1vvvvvvvvv an>
 2 45
del_ ="sref">config_lenfeatut_fy on rvirtio_de confn>a href="+code=vdev" ass="sref">num_v>);
<3href="dri3ers/lguest/lguest_device3c#L113" 2d="a href="+code=i" class="sref">i++)
 2 38lguest_devicfi_mati     ref="+code=vdev"llass="sref">lg_vq<> * sizhref="+code=to_lg ass="sref">num_v>);
lg_feus/l 1 90 1 Releascb met confruptcedsltandsetupwill laku some andeira; memoryv an>
 2 88virtio_de confn+code=config_len"ss="sref">config_len< 2 2nt">n class="commclasfree hyperh/* This gell Hosfeiately afterif waifailed/span>
virtio_de confn+code=config_len"ss="sref">config_len< 2 Unlouiraethrthis"commenent""comment">/* This gell Hosfeiately afterif waifailed/span>
 2hwetsref">lg_vqERR_PL83"> 2hwetsevic.dev" nnnnn4cline" name="L88"> 2 88lg_vq<> * siconfig_len< 2 Free an c5 * the">/* This gell Hosfeiately afterif waifailed/span>
 2 88config_len< 2 41 1 90del_ =static flg_featu or fvirtio_device *vdev)
 1 82 2 63virtio_de conf, struccccccccccccc"sref">virtio_dnalg_feus/llg_feus/llgt">_0 ge_pee c_saf63       lgt">_0 ge_pee c_saf6i" clDIV_ROUND_UPss="="sref">virtio_de conf="+code=config_le""sref">virtio_dnai;
l3       l*vdev)
del_ ="sref">config_lenvirtio_de confn+code=config_len"ss="sref">config_len< 2 41 2 68flg_featu or fvirtio_device * 2 68 2 63 2 68 2 68vdev)
 2 33 2 61lg_vq *vdev)
to_lgdev(vdev)->3)ref="dri3ers/lguest/lguest_device3c#L103" 2d="L55" c2ls="sref">lg_vqlg_feus/l 2 76 2 69/* We d We m vira curdevicmanymueues. */<1r an>
lg_vqifdex
vdev)
desc;
lg_vqnumcla;
<3href="dri3ers/lguest/lguest_device3c#L1137 2d="L39" c2lass="line" namecode=to_lgERR_PTRss="sref">lg_vqERR_PTRlg_feus/l 1 90i++)
virtio_de confn>a href="+code=vevice" class="sref">virtio_device * 2static vdev)->3href="dri3ers/lguest/lguest_device3c#L1038 id="L93" c1lass="linass=ass="line" nameIS_ER                IS_ER ef="+DIV_ROUND_UPss="=static lg_vqnumcla;
<3 ref="dri3ers/lguest/lguest_device3c#L103" 2d="L14" c2lllllllllllllllllgotoaode=desc"pfass=erro> 2 64num_verr;
<3,ref="dri3ers/lguest/lguest_device3c#L103" 2d="L85" c2lL41" c2lass="line" name="L41"> 2 41num_verr;
<3,ref="dri3ers/lguest/lguest_device3c#L1038i2d="L17" c2lass="line" name="L17"> 2 17 2 64 2 83del_ =static to_lgdev(vdev)->3href="dri3ers/lguest/lguest_device3c#L183902d="L39" c2le" name="L75"> 2 75vdev)->3href="dri3ers/lguest/lguest_device3c#L8139 2d="L41" c2lass="line" name="L41"> 2 41 2 72 2 66 2ef="+=__iomt_fy on rss="sref">flg_featu or fvirtio_device *vdev)
i++)
vdev)->3href="dri3ers/lguest/lguest_device3c#L9639 2d="L41" c2lass="line" name="L41"> 2 41 2 17 rent""oge0">2t">/* We d We m vira curdevicmanymueues. */<1r an>
flg_rs/lgu_opsor f 2 61i++)
 2 68 2 68 2 68 2 68 2 68 2 68 20or f 20* 20or f 20ef="=L28" c2lass="line" name="L68"> 2 68vstatic  2 68 2 68 2 66 2ef="ef="+code=confiuseds"bus_"> 2 66 2ef="=L28" c2lass="line" name="L68"> 2 68vdev)->4href="dri4ers/lguest/lguest_device4c#L6941i1d="ef="+code=vdev" class="sref">vdev)->4h2ef="dri4ers/lguest/lguest_device4c#L6241i2d="L42" c2lass="line" nam 2 77/* We dn>
/>n clas> 2 48/* * __iome confie.c#L1riptor.
/* We d We m vira curdevicmanymueues. */<1r an>
num_verr;
<4href="dri4ers/lguest/lguest_device4c#L5741i2d="L17" c2lass="line" name="L17"> 2 17
 2 mm* esre class="ent">/>bus: aassally"coment"a new> 2 48 * __iome confie.c#L1riptor.
 * Devotetsepar 2 5funcp or _immmmmmell low  neaonfitll rwayFn * __iome confie.c#L1riptor.
/*
 s="comment"> * __iome confie.c#L1riptor.
 * __iome confie.c#L1riptor.
says,"commenUnttorpan cdomis buggyn cdocommens="comment"> * __iome confie.c#L1riptor.
="comment"> * __iome confie.c#L1riptor.
 * Devotworthbreadent""cis ca* _ully:rwe"star rwithbn ue confito5mm* new> 2 48<="comment"> * __iome confie.c#L1riptor.
 commenriptor. offseas coo 79 * __iome confie.c#L1riptor.
c" cuniquely id" nifyclasipammentsano * __iome confie.c#L1riptor.
/* We d We m vira curdevicmanymueues. */<1r an>
vdev 2 61 2 68lg_vqvdev)
 1 82 2 61lg_vq *num_verr;
<4href="dri4ers/lguest/lguest_device4c#L8443 2d="ref="+code=desc"ps/lss="sref">lg_feus/l 2 Star rwithbzero   manymu; Linux* Devot 2 48/* We d We m vira curdevicmanymueues. */<1r an>
lg_vq *lg_vq<> *zsizhref="+code=to_lgkmallocss="sreef">lg_vq *lg_vq<> * si),hef="+code=vdev"GFP_KERNELss="sref">num_vGFP_KERNEL->4href="dri4ers/lguest/lguest_device4c#L6643 2d="L77" c2lass="line" name="L74"ef">lg_vq *i++)
 2 84 2 84 2 "ent">/>a>+et "Mappetupl href="+code=i" class="sref">i++)
lg_vqnum_vGFP_KERNEL->4lref="dri4ers/lguest/lguest_device4c#L124402d="L39" c2lass="line" namdev"GFP_KERNELss="sref">num_vGFP_KERNEL->4lref="dri4ers/lguest/lguest_device4c#L104412d="L82" c2lL41" c2lass="line" name="L41"> 2 41 2 72 2 2cis  2 mm*  name=" di2t">/* We d We m vira curdevicmanymueues. */<1r an>
lg_vqifdex
virtio_device *i( 2 84num_verr;
<4href="dri4ers/lguest/lguest_device4c#L1044522="L113" 2lass="line" name="L23"> 2* We d We m vira curdevicmanymueues. */<1r an>

 2  2 48 ref="+code=vilass="llow &quo/a>lee cwnmodtandsetupwill laku some andeira; memoryv an>
 2 0s="comment"> * __iome confie.c#L1riptor.
 2/* We d We m vira curdevicmanymueues. */<1r an>
lg_vqifdex
virtio_device *num_verr;
<4href="dri4ers/lguest/lguest_device4c#L6545i1d="L91" c1lass="line" name="L91"> 1* We d We m vira curdevicmanymueues. */<1r an>
 2 Wehte cwn simple"seaspanroutgues/54
 2 rs/lguur* thement"> * then * __iome confie.c#L1riptor.
 2/* We d We m vira curdevicmanymueues. */<1r an>
lg_vqifdex
virtio_device *num_verr;
<4href="dri4ers/lguest/lguest_device4c#L104562d="L14" c2lass="line" name="L23"> 2 Arews/* We d We m vira curdevicmanymueues. */<1r an>
lg_vqifdex
vdev)
num_verr;
<4href="dri4ers/lguest/lguest_device4c#L1045 2d="L28" c2lass="line" name="L68"> 2 68 2* We d We m vira curdevicmanymueues. */<1r an>
 2 register_ref="+code=vi()aseas"s=a"comgenericmfields/54
 2 ref="+code=vil/* 2 entran class="olaoks54 * __iome confie.c#L1riptor.
 2/* We d We m vira curdevicmanymueues. */<1r an>
gister_ref="+code=vihref="+code=u8" cmemcprss="sref">lg_vqifdex
virtio_device *i++)
 2 84 * th">gister"ent">/>a>+et "Mappetupl href="+code=i" class="sref">i++)
num_vGFP_KERNEL->4 ref="dri4ers/lguest/lguest_device4c#L104672d="L82" c2lL77" c2lass="line" namekfree2 74lg_vq *num_vGFP_KERNEL->4 ref="dri4ers/lguest/lguest_device4c#L1046 2d="L28" c2lL41" c2lass="line" name="L41"> 2 41 2 41 1 90

 2rv> * thme" cquot;Meurapan * __iome confie.c#L1riptor.

vdev)
i++)
lg_vqlg_feus/lvdev 2 61lg_feus/llg_feus/l 2 69ginnentFn/* We d We m vira curdevicmanymueues. */<1r an>
vdev)
i++)
lg_vqlg_feus/l 2 83num_verr;
4c#L104">vdev d="L811111111111len<lg_feus/l 2 17 248me="L74="L84"> 2 84 2 8l> * th">gister"ent">/>a>+Der()>/*t"+codei has rnedalg_feus/llg_vqlg_feus/l42 75 2 41 2 41 2 72 2rv> * thme" cquot;Meurvicma#se0st/lgue40 2d="r_t/f="dri4ers/lguest/lgue40 2d="revice3c#L4039 2d="a href="+code=i"4class49"As Andrew>Tridgnt">says,"commFai"cus52"cusin boot, vq * __iome confie.cu>"Map()>/crent"curdevs=iratFncheckmment">>/*r/* We dn>
 * Devotworthbreadent""cis cpv>lgue.ss=":ss="r>/*r *s * _check="c, buthbn ueseems mosymueues. */<1r an>
 commenriptoobviousurt coc#L1riptor.
 2 mm* esre class="ent">Ssipammentacp_iscop* siFnnt"ynfico#L1riptor.
 * Devotetsepar 2 5funcp or  We dtly"co52"cment"> w &quo/global siFn offseas coo 79ira cun/27
 2 48ow  ill la imm Thiffseas  wiimmhang (bn ueseems rt bess="e0st/lgue40 2d="r_t/f="dri4ers/lguest/lgue40 2d="5evice4c#L5140 2d="L82" c2llguest_d5vice.50"scan. * __iome confie.c#L1riptor.
Tridgnt">says,"commFass= conee cl< s="crough""com
 * __iome confie.cu>"rough""ce m vi#L1riptor.
 * Devotworthbreadent""cis guest/lgue40 2d="r_t/f="dri4ers/lguest/lgue40 2d="5evice4c#L514072d="L14" c2llguest_d5vice.50"L32">del_ =a hrnedavdev)
i++)
 2 66lguee" name="L74ef="v>lguest_df="drivers/lgues2ef="=L28" c2lass="ame="L68"ail> * th">gister"ent">/>a>+rs/lgu class="sref"s="srefi++)
num_vref">num_verr;
<3,ref="dri3ers/lguest/lguest_5evice4c#L5941i1d="ef="+code=vdev" 5lass=5sref">vdev)->4h2ef="dri4ers/lguest/lguest_5evice4c#L5241i2d="L42" c2lass="lin5" nam51ree_ic. 2 8l> * th">gister"ent">/>a>+rs/lgu class="sref"sf">num_verr;
<3,ref="dri3ers/lguest/lguest_5evice4c#L5241i2d="L43" c2lass="lin5" nam513us_"> 2 66 d="L811184      rL23ef="ni_ass=uest_device="ni_G> 2 8l> * th">gister"ent">/>a>+Couldment"preclassu>"rss= class="sref"sf">num_verr;
<3,ref="dri3ers/lguest/lguest_5e5ice4c#L564 i2d5"L104" 2lass="lin5" nam51"L45"> 2 45 2 Arewslg_vqifdex
lg_vq 2 88num_verr;
<3,ref="dri3ers/lguest/lguest_5evice4c#L584 i2d="L18" c2lass="lin5" nam51"L68"> 2 68del_ =static num_verr;
<3,ref="dri3ers/lguest/lguest_5evice4c#L5842 2d="L80" c2lass="lin5" nam52 75num_verr;
<3,ref="dri3ers/lguest/lguest_5evice4c#L5742 2d="L71" c2lass="lin5" nam52"L41"> 2 41num_verr;
<3,ref="dri3ers/lguest/lguest_5evice4c#L5042i2d="L14" c2lass="lin5" nam52sref">lg_feus/l="comment"> * __iome confievicma5ymueues. */<1r an>
 * Devotworthbreadent""cis cAthbn uecment w &quo/jo   > * _nfie. rt now wade< typre0 is* rs/lgumueues. */<1r an>
 commenriptor.gh""ce lakselves: net, block/* rs/lgr>/*immnow cmemcpmueues. */<1r an>
c" cuniqugh""ceras="r"th clrs/lgu-specific, Irs/lgv* Wecide. rt ignly"co52miraMostly,mueues. */<1r an>
/* We d We m vira curdevicmanet"> rs/lgr>/ki"> * _boy afte Buthbn uedo"cecos="yours/lgimmne conexperieri3et">mueues. */<1r an>
 * Devotetsepar 2 5funcp or  tyiimm<1r r rwithbn/*biddeclroWe scencmanried Weep w &quo/block/onfie.c#L1riptor.

/>>/*nsweWe d s"coms lik* siFn/dohGquotymueues. */<1r an>
 2rv> * thme" cquot;Meurapaan cs>ow ?siFn



"L52"rigass= LXR/snftw*rhttp://so ceflyge.net/projectef=xs+>LXR/curdunity"L68"abn ueexperidevis= hotplugby&*/<1r an>mailto:=xs@ls or.nonndxs@ls or.nost_df
dxs.ls or.no/ki">ly hos="coby&*/<1r an>http://www.redpiim-ls pro.nonnRedpiimnts pro AS"L68"aproviderm<1rts oretonsul __io We opet"3