[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] libxl: introduce an option for disabling the non-O_DIRECT workaround



From: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>

Document and implement a new option that permits disk backends which
would otherwise have to avoid O_DIRECT (because of the network memory
lifetime bug) to use it anyway.  This is:
 direct-io-safe   in the xl domain disk config specification
 direct_io_safe   in the libxl disk API
 direct-io-safe   in the backend xenstore interface

Add a reference to xen/include/public/io/blkif.h in
docs/misc/vbd-interface.txt.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
 docs/misc/vbd-interface.txt         |    6 +
 docs/misc/xl-disk-configuration.txt |   38 ++
 tools/libxl/libxl.c                 |    4 +
 tools/libxl/libxl.h                 |    7 +
 tools/libxl/libxl_types.idl         |    1 +
 tools/libxl/libxlu_disk_l.c         |  681 ++++++++++++++++++-----------------
 tools/libxl/libxlu_disk_l.h         |    2 +-
 tools/libxl/libxlu_disk_l.l         |    1 +
 xen/include/public/io/blkif.h       |   22 ++
 9 files changed, 428 insertions(+), 334 deletions(-)

diff --git a/docs/misc/vbd-interface.txt b/docs/misc/vbd-interface.txt
index 3952e73..f873db0 100644
--- a/docs/misc/vbd-interface.txt
+++ b/docs/misc/vbd-interface.txt
@@ -125,3 +125,9 @@ because they directly map the bottom 8 bits of the xenstore 
integer
 directly to the Linux guest's device number and throw away the rest;
 they can crash due to minor number clashes.  With these guests, the
 workaround is not to supply problematic combinations of devices.
+
+
+Other frontend and backend options
+----------------------------------
+
+See xen/include/public/io/blkif.h for the full list of options.
diff --git a/docs/misc/xl-disk-configuration.txt 
b/docs/misc/xl-disk-configuration.txt
index 5bd456d..9c2650b 100644
--- a/docs/misc/xl-disk-configuration.txt
+++ b/docs/misc/xl-disk-configuration.txt
@@ -178,6 +178,44 @@ information to be interpreted by the executable program 
<script>,
 These scripts are normally called "block-<script>".
 
 
+direct-io-safe
+--------------
+
+Description:           Disables non-O_DIRECT workaround
+Supported values:      absent, present
+Mandatory:             No
+Default value:         absent (workaround may be enabled)
+
+There is a memory lifetime bug in some driver domain (dom0) kernels
+which can cause crashes when using O_DIRECT.  The bug occurs due to a
+mismatch between the backend-visible lifetime of pages used for the
+Xen PV network protocol and that expected by the backend kernel's
+networking subsystem.  This can cause crashes when using certain
+backends with certain underlying storage.
+
+See:
+ http://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.html
+
+For this reason, (this version of) the Xen libxl toolstack disables
+O_DIRECT when using the qemu-based Xen PV backend ("qdisk").
+
+However, this workaround has performance and scaling implications, and
+it is only necessary if the underlying device is a network filesystem.
+If the underlying device is not, then it is good to disable it; that
+is what this option is for.
+
+This option simply requests that the workaround be disabled.  (However,
+not all backends versions which use the workaround understand this
+option, so this is on a best effort basis.)
+
+It's important to note that if you are storing the VM disk on a
+network filesystem or a network block device (NFS or ISCSI) it might
+not be safe to use this option.  Otherwise specifying it is safe and
+can give better performances.
+
+If in the future the bug is fixed properly this option will then be
+silently ignored.
+
 
 ============================================
 DEPRECATED PARAMETERS, PREFIXES AND SYNTAXES
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 2b847ef..62aa6d7 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -2189,6 +2189,10 @@ static void device_disk_add(libxl__egc *egc, uint32_t 
domid,
         flexarray_append(back, disk->readwrite ? "w" : "r");
         flexarray_append(back, "device-type");
         flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
+        if (disk->direct_io_safe) {
+            flexarray_append(back, "direct-io-safe");
+            flexarray_append(back, "1");
+        }
 
         flexarray_append(front, "backend-id");
         flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid));
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index a9663e4..06d1390 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -95,6 +95,13 @@
 #define LIBXL_HAVE_BUILDINFO_EVENT_CHANNELS 1
 
 /*
+ * LIBXL_HAVE_DEVICE_DISK_DIRECT_IO_SAFE indicates that a
+ * 'direct_io_safe' field (of boolean type) is present in
+ * libxl_device_disk.
+ */
+#define LIBXL_HAVE_DEVICE_DISK_DIRECT_IO_SAFE 1
+
+/*
  * libxl ABI compatibility
  *
  * The only guarantee which libxl makes regarding ABI compatibility
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index cba8eff..8fb07b5 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -413,6 +413,7 @@ libxl_device_disk = Struct("device_disk", [
     ("removable", integer),
     ("readwrite", integer),
     ("is_cdrom", integer),
+    ("direct_io_safe", bool),
     ])
 
 libxl_device_nic = Struct("device_nic", [
diff --git a/tools/libxl/libxlu_disk_l.c b/tools/libxl/libxlu_disk_l.c
index 03adfef..c97f0b2 100644
--- a/tools/libxl/libxlu_disk_l.c
+++ b/tools/libxl/libxlu_disk_l.c
@@ -361,8 +361,8 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t 
yyscanner );
        *yy_cp = '\0'; \
        yyg->yy_c_buf_p = yy_cp;
 
-#define YY_NUM_RULES 26
-#define YY_END_OF_BUFFER 27
+#define YY_NUM_RULES 27
+#define YY_END_OF_BUFFER 28
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -370,90 +370,92 @@ struct yy_trans_info
        flex_int32_t yy_verify;
        flex_int32_t yy_nxt;
        };
-static yyconst flex_int16_t yy_acclist[454] =
+static yyconst flex_int16_t yy_acclist[470] =
     {   0,
-       25,   25,   27,   23,   24,   26, 8193,   23,   24,   26,
-    16385, 8193,   23,   26,16385,   23,   24,   26,   24,   26,
-       23,   24,   26,   23,   24,   26,   23,   24,   26,   23,
-       24,   26,   23,   24,   26,   23,   24,   26,   23,   24,
-       26,   23,   24,   26,   23,   24,   26,   23,   24,   26,
-       23,   24,   26,   23,   24,   26,   23,   24,   26,   23,
-       24,   26,   23,   24,   26,   25,   26,   26,   23,   23,
-     8193,   23, 8193,   23,16385, 8193,   23, 8193,   23,   23,
-     8214,   23,16406,   23,   23,   23,   23,   23,   23,   23,
-       23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
-
-       23,   23,   25, 8193,   23, 8193,   23, 8193, 8214,   23,
-     8214,   23, 8214,   13,   23,   23,   23,   23,   23,   23,
-       23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
-       23,   23, 8214,   23, 8214,   23, 8214,   13,   23,   18,
-     8214,   23,16406,   23,   23,   23,   23,   23,   23,   23,
-     8207, 8214,   23,16399,16406,   21, 8214,   23,16406,   23,
-     8206, 8214,   23,16398,16406,   23,   23, 8209, 8214,   23,
-    16401,16406,   23,   23,   23,   23,   18, 8214,   23,   18,
-     8214,   23,   18,   23,   18, 8214,   23,    3,   23,   23,
-       20, 8214,   23,16406,   23,   23, 8207, 8214,   23, 8207,
-
-     8214,   23, 8207,   23, 8207, 8214,   21, 8214,   23,   21,
-     8214,   23,   21,   23,   21, 8214, 8206, 8214,   23, 8206,
-     8214,   23, 8206,   23, 8206, 8214,   23, 8209, 8214,   23,
-     8209, 8214,   23, 8209,   23, 8209, 8214,   23,   23,   10,
-       23,   18, 8214,   23,   18, 8214,   23,   18, 8214,   18,
-       23,   18,   23,    3,   23,   23,   20, 8214,   23,   20,
-     8214,   23,   20,   23,   20, 8214,   23,   19, 8214,   23,
-    16406, 8207, 8214,   23, 8207, 8214,   23, 8207, 8214, 8207,
-       23, 8207,   21, 8214,   23,   21, 8214,   23,   21, 8214,
-       21,   23,   21, 8206, 8214,   23, 8206, 8214,   23, 8206,
-
-     8214, 8206,   23, 8206,   23, 8209, 8214,   23, 8209, 8214,
-       23, 8209, 8214, 8209,   23, 8209,   23,   23,   10,   13,
-       10,    7,   23,   23,   20, 8214,   23,   20, 8214,   23,
-       20, 8214,   20,   23,   20,    2,   19, 8214,   23,   19,
-     8214,   23,   19,   23,   19, 8214,   11,   23,   12,   10,
-       10,   13,    7,   13,    7,    8,   23,    6,    2,   13,
-        2,   19, 8214,   23,   19, 8214,   23,   19, 8214,   19,
-       23,   19,   11,   13,   11,   16, 8214,   23,16406,   12,
-       13,   12,    7,    7,   13,    8,   13,    8,   23,    6,
-       13,    6,    6,   13,    6,   13,    2,    2,   13,   11,
-
-       11,   13,   16, 8214,   23,   16, 8214,   23,   16,   23,
-       16, 8214,   12,   13,    8,    8,   13,   23,    6,    6,
-       13,    6,    6,   16, 8214,   23,   16, 8214,   23,   16,
-     8214,   16,   23,   16,   23,    6,    6,    9,    6,    5,
-        6,    9,   13,    9,    4,    6,    5,    6,    9,    9,
-       13,    4,    6
+       26,   26,   28,   24,   25,   27, 8193,   24,   25,   27,
+    16385, 8193,   24,   27,16385,   24,   25,   27,   25,   27,
+       24,   25,   27,   24,   25,   27,   24,   25,   27,   24,
+       25,   27,   24,   25,   27,   24,   25,   27,   24,   25,
+       27,   24,   25,   27,   24,   25,   27,   24,   25,   27,
+       24,   25,   27,   24,   25,   27,   24,   25,   27,   24,
+       25,   27,   24,   25,   27,   26,   27,   27,   24,   24,
+     8193,   24, 8193,   24,16385, 8193,   24, 8193,   24,   24,
+     8215,   24,16407,   24,   24,   24,   24,   24,   24,   24,
+       24,   24,   24,   24,   24,   24,   24,   24,   24,   24,
+
+       24,   24,   24,   26, 8193,   24, 8193,   24, 8193, 8215,
+       24, 8215,   24, 8215,   14,   24,   24,   24,   24,   24,
+       24,   24,   24,   24,   24,   24,   24,   24,   24,   24,
+       24,   24,   24,   24, 8215,   24, 8215,   24, 8215,   14,
+       24,   19, 8215,   24,16407,   24,   24,   24,   24,   24,
+       24,   24,   24, 8208, 8215,   24,16400,16407,   22, 8215,
+       24,16407,   24, 8207, 8215,   24,16399,16407,   24,   24,
+     8210, 8215,   24,16402,16407,   24,   24,   24,   24,   19,
+     8215,   24,   19, 8215,   24,   19,   24,   19, 8215,   24,
+        3,   24,   24,   24,   21, 8215,   24,16407,   24,   24,
+
+     8208, 8215,   24, 8208, 8215,   24, 8208,   24, 8208, 8215,
+       22, 8215,   24,   22, 8215,   24,   22,   24,   22, 8215,
+     8207, 8215,   24, 8207, 8215,   24, 8207,   24, 8207, 8215,
+       24, 8210, 8215,   24, 8210, 8215,   24, 8210,   24, 8210,
+     8215,   24,   24,   10,   24,   19, 8215,   24,   19, 8215,
+       24,   19, 8215,   19,   24,   19,   24,    3,   24,   24,
+       24,   21, 8215,   24,   21, 8215,   24,   21,   24,   21,
+     8215,   24,   20, 8215,   24,16407, 8208, 8215,   24, 8208,
+     8215,   24, 8208, 8215, 8208,   24, 8208,   22, 8215,   24,
+       22, 8215,   24,   22, 8215,   22,   24,   22, 8207, 8215,
+
+       24, 8207, 8215,   24, 8207, 8215, 8207,   24, 8207,   24,
+     8210, 8215,   24, 8210, 8215,   24, 8210, 8215, 8210,   24,
+     8210,   24,   24,   10,   14,   10,    7,   24,   24,   24,
+       21, 8215,   24,   21, 8215,   24,   21, 8215,   21,   24,
+       21,    2,   20, 8215,   24,   20, 8215,   24,   20,   24,
+       20, 8215,   11,   24,   13,   10,   10,   14,    7,   14,
+        7,    8,   24,    6,   24,    2,   14,    2,   20, 8215,
+       24,   20, 8215,   24,   20, 8215,   20,   24,   20,   11,
+       14,   11,   17, 8215,   24,16407,   13,   14,   13,    7,
+        7,   14,    8,   14,    8,   24,    6,   14,    6,    6,
+
+       14,    6,   14,   24,    2,    2,   14,   11,   11,   14,
+       17, 8215,   24,   17, 8215,   24,   17,   24,   17, 8215,
+       13,   14,    8,    8,   14,   24,    6,    6,   14,    6,
+        6,   24,   17, 8215,   24,   17, 8215,   24,   17, 8215,
+       17,   24,   17,   24,    6,    6,   24,    9,    6,    5,
+        6,   24,    9,   14,    9,    4,    6,    5,    6,   24,
+        9,    9,   14,    4,    6,   12,   24,   12,   24
     } ;
 
-static yyconst flex_int16_t yy_accept[257] =
+static yyconst flex_int16_t yy_accept[271] =
     {   0,
         1,    1,    1,    2,    3,    4,    7,   12,   16,   19,
        21,   24,   27,   30,   33,   36,   39,   42,   45,   48,
        51,   54,   57,   60,   63,   66,   68,   69,   70,   71,
        73,   76,   78,   79,   80,   81,   84,   84,   85,   86,
        87,   88,   89,   90,   91,   92,   93,   94,   95,   96,
-       97,   98,   99,  100,  101,  102,  103,  104,  106,  108,
-      109,  111,  113,  114,  115,  116,  117,  118,  119,  120,
+       97,   98,   99,  100,  101,  102,  103,  104,  105,  107,
+      109,  110,  112,  114,  115,  116,  117,  118,  119,  120,
       121,  122,  123,  124,  125,  126,  127,  128,  129,  130,
-      131,  132,  133,  135,  137,  138,  139,  140,  144,  145,
-      146,  147,  148,  149,  150,  151,  156,  160,  161,  166,
-
-      167,  168,  173,  174,  175,  176,  177,  180,  183,  185,
-      187,  188,  190,  191,  195,  196,  197,  200,  203,  205,
-      207,  210,  213,  215,  217,  220,  223,  225,  227,  228,
-      231,  234,  236,  238,  239,  240,  241,  242,  245,  248,
-      250,  252,  253,  254,  256,  257,  260,  263,  265,  267,
-      268,  272,  275,  278,  280,  282,  283,  286,  289,  291,
-      293,  294,  297,  300,  302,  304,  305,  306,  309,  312,
-      314,  316,  317,  318,  319,  321,  322,  323,  324,  325,
-      328,  331,  333,  335,  336,  337,  340,  343,  345,  347,
-      348,  349,  350,  351,  353,  355,  356,  357,  358,  359,
-
-      361,  362,  365,  368,  370,  372,  373,  375,  376,  380,
-      382,  383,  384,  386,  388,  389,  390,  392,  393,  395,
-      397,  398,  400,  401,  403,  406,  409,  411,  413,  415,
-      416,  418,  419,  420,  422,  423,  424,  427,  430,  432,
-      434,  435,  436,  437,  438,  439,  440,  442,  444,  445,
-      447,  449,  450,  452,  454,  454
+      131,  132,  133,  134,  135,  137,  139,  140,  141,  142,
+      146,  147,  148,  149,  150,  151,  152,  153,  154,  159,
+
+      163,  164,  169,  170,  171,  176,  177,  178,  179,  180,
+      183,  186,  188,  190,  191,  193,  194,  195,  199,  200,
+      201,  204,  207,  209,  211,  214,  217,  219,  221,  224,
+      227,  229,  231,  232,  235,  238,  240,  242,  243,  244,
+      245,  246,  249,  252,  254,  256,  257,  258,  260,  261,
+      262,  265,  268,  270,  272,  273,  277,  280,  283,  285,
+      287,  288,  291,  294,  296,  298,  299,  302,  305,  307,
+      309,  310,  311,  314,  317,  319,  321,  322,  323,  324,
+      326,  327,  328,  329,  330,  331,  334,  337,  339,  341,
+      342,  343,  346,  349,  351,  353,  354,  355,  356,  357,
+
+      359,  361,  362,  363,  364,  365,  366,  368,  369,  372,
+      375,  377,  379,  380,  382,  383,  387,  389,  390,  391,
+      393,  395,  396,  397,  399,  400,  402,  404,  405,  406,
+      408,  409,  411,  414,  417,  419,  421,  423,  424,  426,
+      427,  428,  430,  431,  432,  433,  436,  439,  441,  443,
+      444,  445,  446,  447,  448,  449,  450,  452,  453,  455,
+      456,  458,  460,  461,  462,  464,  466,  468,  470,  470
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -496,244 +498,252 @@ static yyconst flex_int32_t yy_meta[34] =
         1,    1,    1
     } ;
 
-static yyconst flex_int16_t yy_base[315] =
+static yyconst flex_int16_t yy_base[329] =
     {   0,
-        0,    0,  563,  559,  558,  546,   32,   35,  665,  665,
-       44,   62,   30,   41,   50,   51,  532,   64,   47,   66,
-       67,  524,   68,  516,   72,    0,  665,  514,  665,   87,
-       91,    0,    0,  100,  500,  109,    0,   74,   95,   87,
-       32,   96,  105,  110,   77,   97,   40,  113,  116,  112,
-      118,  120,  121,  122,  123,  125,    0,  137,    0,    0,
-      147,    0,    0,  494,  129,  126,  134,  143,  145,  147,
-      148,  149,  151,  153,  156,  160,  155,  167,  162,  175,
-      168,  159,  188,    0,    0,  665,  166,  197,  179,  185,
-      176,  200,  460,  186,  193,  216,  225,  205,  234,  221,
-
-      237,  247,  204,  230,  244,  213,  254,    0,  256,    0,
-      251,  258,  254,  279,  256,  259,  267,    0,  269,    0,
-      286,    0,  288,    0,  290,    0,  297,    0,  267,  299,
-        0,  301,    0,  288,  297,  459,  302,  310,    0,    0,
-        0,    0,  305,  665,  307,  319,    0,  321,    0,  322,
-      332,  335,    0,    0,    0,    0,  339,    0,    0,    0,
-        0,  342,    0,    0,    0,    0,  340,  349,    0,    0,
-        0,    0,  337,  345,  450,  665,  442,  350,  352,  360,
-        0,    0,    0,    0,  424,  362,    0,  364,    0,  420,
-      319,  371,  419,  665,  418,  665,  417,  276,  368,  416,
-
-      665,  373,    0,    0,    0,    0,  415,  665,  382,  414,
-        0,  413,  665,  412,  665,  368,  411,  665,  384,  352,
-      410,  665,  409,  665,  391,    0,  395,    0,    0,  405,
-      665,  382,  316,  665,  385,  397,  399,    0,    0,    0,
-        0,  396,  403,  406,  271,  407,  228,  200,  665,  175,
-      665,   77,  665,  665,  665,  429,  433,  436,  440,  444,
-      448,  452,  456,  460,  464,  468,  472,  476,  480,  484,
-      488,  492,  496,  500,  504,  508,  512,  516,  520,  524,
-      528,  532,  536,  540,  544,  548,  552,  556,  560,  564,
-      568,  572,  576,  580,  584,  588,  592,  596,  600,  604,
-
-      608,  612,  616,  620,  624,  628,  632,  636,  640,  644,
-      648,  652,  656,  660
+        0,    0,  673,  657,  648,  616,   32,   35,  691,  691,
+       44,   62,   30,   41,   50,   51,  598,   64,   47,   66,
+       67,  586,   68,  582,   72,    0,  691,  584,  691,   87,
+       91,    0,    0,  100,  574,  109,    0,   74,   95,   87,
+       71,   96,   97,  105,  110,  112,  113,   40,  116,  119,
+      115,  120,  121,  124,  125,  127,  126,    0,  151,    0,
+        0,  153,    0,    0,  572,  128,  135,  139,  137,  136,
+      153,  156,  154,  148,  161,  162,  165,  166,  167,  170,
+      169,  178,  179,  171,  189,    0,    0,  691,  172,  202,
+      187,  174,  184,  202,  205,  558,  198,  206,  228,  237,
+
+      211,  246,  210,  215,  255,  216,  251,  234,  199,  263,
+        0,  265,    0,  252,  266,  261,  263,  292,  269,  270,
+      278,    0,  280,    0,  299,    0,  301,    0,  303,    0,
+      310,    0,  280,  312,    0,  314,    0,  301,  310,  556,
+      243,  321,    0,    0,    0,    0,  275,  691,  312,  322,
+      331,    0,  333,    0,  334,  344,  347,    0,    0,    0,
+        0,  351,    0,    0,    0,    0,  354,    0,    0,    0,
+        0,  352,  361,    0,    0,    0,    0,  318,  357,  548,
+      691,  540,  359,  362,  388,  370,    0,    0,    0,    0,
+      532,  372,    0,  374,    0,  520,  323,  381,  492,  691,
+
+      485,  691,  476,  349,  382,  369,  468,  691,  395,    0,
+        0,    0,    0,  449,  691,  406,  448,    0,  447,  691,
+      446,  691,  391,  444,  691,  399,  273,  395,  442,  691,
+      438,  691,  414,    0,  416,    0,    0,  398,  691,  412,
+      376,  691,  401,  417,  406,  426,    0,    0,    0,    0,
+      422,  423,  429,  426,  337,  433,  295,  423,  218,  691,
+       83,  691,  425,   38,  691,  691,  436,  691,  691,  455,
+      459,  462,  466,  470,  474,  478,  482,  486,  490,  494,
+      498,  502,  506,  510,  514,  518,  522,  526,  530,  534,
+      538,  542,  546,  550,  554,  558,  562,  566,  570,  574,
+
+      578,  582,  586,  590,  594,  598,  602,  606,  610,  614,
+      618,  622,  626,  630,  634,  638,  642,  646,  650,  654,
+      658,  662,  666,  670,  674,  678,  682,  686
     } ;
 
-static yyconst flex_int16_t yy_def[315] =
+static yyconst flex_int16_t yy_def[329] =
     {   0,
-      255,    1,  256,  256,  255,  257,  258,  258,  255,  255,
-      259,  259,   12,   12,   12,   12,   12,   12,   12,   12,
-       12,   12,   12,   12,   12,  260,  255,  257,  255,  261,
-      258,  262,  262,  263,   12,  257,  264,   12,   12,   12,
+      269,    1,  270,  270,  269,  271,  272,  272,  269,  269,
+      273,  273,   12,   12,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,  274,  269,  271,  269,  275,
+      272,  276,  276,  277,   12,  271,  278,   12,   12,   12,
        12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
-       12,   12,   12,   12,   12,   12,  260,  261,  262,  262,
-      265,  266,  266,  255,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,  274,  275,  276,
+      276,  279,  280,  280,  269,   12,   12,   12,   12,   12,
        12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
-       12,   12,  265,  266,  266,  255,   12,  267,   12,   12,
-       12,   12,   12,   12,   12,  268,  269,   12,  270,   12,
-
-       12,  271,   12,   12,   12,   12,  272,  273,  267,  273,
-       12,   12,   12,  274,   12,   12,  275,  276,  268,  276,
-      277,  278,  269,  278,  279,  280,  270,  280,   12,  281,
-      282,  271,  282,   12,   12,  283,   12,  272,  273,  273,
-      284,  284,   12,  255,   12,  285,  286,  274,  286,   12,
-      287,  275,  276,  276,  288,  288,  277,  278,  278,  289,
-      289,  279,  280,  280,  290,  290,   12,  281,  282,  282,
-      291,  291,   12,   12,  292,  255,  293,   12,   12,  285,
-      286,  286,  294,  294,  295,  296,  297,  287,  297,  298,
-       12,  299,  292,  255,  300,  255,  301,   12,  302,  303,
-
-      255,  296,  297,  297,  304,  304,  305,  255,  306,  307,
-      307,  300,  255,  308,  255,   12,  309,  255,  309,  309,
-      303,  255,  305,  255,  310,  311,  306,  311,  307,  308,
-      255,   12,  309,  255,  309,  309,  310,  311,  311,  312,
-      312,   12,  309,  309,  313,  309,  309,  314,  255,  309,
-      255,  314,  255,  255,    0,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255,  255,  255,
-
-      255,  255,  255,  255,  255,  255,  255,  255,  255,  255,
-      255,  255,  255,  255
+       12,   12,   12,   12,  279,  280,  280,  269,   12,  281,
+       12,   12,   12,   12,   12,   12,   12,   12,  282,  283,
+
+       12,  284,   12,   12,  285,   12,   12,   12,   12,  286,
+      287,  281,  287,   12,   12,   12,   12,  288,   12,   12,
+      289,  290,  282,  290,  291,  292,  283,  292,  293,  294,
+      284,  294,   12,  295,  296,  285,  296,   12,   12,  297,
+       12,  286,  287,  287,  298,  298,   12,  269,   12,   12,
+      299,  300,  288,  300,   12,  301,  289,  290,  290,  302,
+      302,  291,  292,  292,  303,  303,  293,  294,  294,  304,
+      304,   12,  295,  296,  296,  305,  305,   12,   12,  306,
+      269,  307,   12,   12,  277,  299,  300,  300,  308,  308,
+      309,  310,  311,  301,  311,  312,   12,  313,  306,  269,
+
+      314,  269,  315,   12,  316,  185,  317,  269,  310,  311,
+      311,  318,  318,  319,  269,  320,  321,  321,  314,  269,
+      322,  269,   12,  323,  269,  323,  323,  185,  317,  269,
+      319,  269,  324,  325,  320,  325,  321,  322,  269,   12,
+      323,  269,  323,  323,  185,  324,  325,  325,  326,  326,
+       12,  323,  323,  185,  327,  323,  323,  185,  328,  269,
+      323,  269,  185,  328,  269,  269,  185,  269,    0,  269,
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269,  269,  269,  269,  269
     } ;
 
-static yyconst flex_int16_t yy_nxt[699] =
+static yyconst flex_int16_t yy_nxt[725] =
     {   0,
         6,    7,    8,    9,    6,    6,    6,    6,   10,   11,
        12,   13,   14,   15,   16,   17,   17,   18,   17,   17,
        17,   17,   19,   17,   20,   21,   22,   23,   24,   17,
        25,   17,   17,   31,   31,   32,   31,   31,   32,   35,
-       33,   35,   41,   33,   28,   28,   28,   29,   34,   35,
-       35,   36,   37,   73,   42,   38,   35,   49,   68,   35,
-       35,   39,   28,   28,   28,   29,   34,   43,   45,   36,
-       37,   40,   44,   35,   46,   35,   35,   35,   51,   53,
-      249,   35,   50,   35,   55,   65,   35,   47,   56,   28,
-       59,   48,   31,   31,   32,   60,   35,   71,   67,   33,
-
-       28,   28,   28,   29,   35,   35,   35,   28,   37,   61,
-       61,   61,   62,   61,   35,   70,   61,   63,   66,   35,
-       49,   35,   35,   72,   74,   35,   69,   35,   75,   35,
-       35,   35,   35,   88,   35,   35,   82,   78,   35,   28,
-       59,   77,   87,   35,   76,   60,   80,   79,   81,   28,
-       84,   78,   35,   89,   35,   85,   35,   35,   35,   75,
-       35,   92,   35,   96,   35,   35,   90,   97,   35,   35,
-       93,   35,   94,   91,   99,   35,   35,   35,  254,  100,
-       95,  101,  102,  104,   35,   35,   98,  103,   35,  105,
-       28,   84,  111,  106,   35,   35,   85,  107,  107,   61,
-
-      108,  107,   35,  253,  107,  110,  112,  114,  113,   35,
-       75,   78,   99,   35,   35,  116,  117,  117,   61,  118,
-      117,  134,   35,  117,  120,  121,  121,   61,  122,  121,
-       35,  251,  121,  124,  125,  125,   61,  126,  125,   35,
-      137,  125,  128,  135,  102,  129,   35,  130,  130,   61,
-      131,  130,  136,   35,  130,  133,   28,  139,   28,  141,
-       35,  144,  140,   35,  142,   35,  151,   35,   35,   28,
-      153,   28,  155,  143,  249,  154,   35,  156,  145,  146,
-      146,   61,  147,  146,  150,   35,  146,  149,   28,  158,
-       28,  160,   28,  163,  159,  167,  161,   35,  164,   28,
-
-      165,   28,  169,   28,  171,  166,   35,  170,  216,  172,
-      177,   35,   28,  139,   35,  173,   35,  178,  140,  218,
-      179,   28,  181,   28,  183,  174,  209,  182,   35,  184,
-      185,   35,  186,  186,   61,  187,  186,   28,  153,  186,
-      189,   28,  158,  154,   28,  163,   35,  159,  190,   35,
-      164,   28,  169,  192,   35,  234,  191,  170,  197,   35,
-      199,   35,   28,  181,   28,  203,   28,  205,  182,  236,
-      204,  218,  206,   64,  211,   28,  203,   35,  198,  219,
-      220,  204,  225,  225,   61,  226,  225,  234,  218,  225,
-      228,   35,  232,   28,  238,  242,  235,   28,  240,  239,
-
-      218,   28,  238,  241,  245,   35,  218,  239,  215,  218,
-      218,  243,  208,  201,  234,  231,  196,  229,  224,  222,
-      215,  213,  176,  208,  244,  247,  246,  201,  250,   26,
-       26,   26,   26,   28,   28,   28,   30,   30,   30,   30,
-       35,   35,   35,   35,   57,  196,   57,   57,   58,   58,
-       58,   58,   60,  194,   60,   60,   34,   34,   34,   34,
-       64,   64,  176,   64,   83,   83,   83,   83,   85,  115,
-       85,   85,  109,  109,  109,  109,  119,  119,  119,  119,
-      123,  123,  123,  123,  127,  127,  127,  127,  132,  132,
-      132,  132,  138,  138,  138,  138,  140,   86,  140,  140,
-
-      148,  148,  148,  148,  152,  152,  152,  152,  154,   35,
-      154,  154,  157,  157,  157,  157,  159,   29,  159,  159,
-      162,  162,  162,  162,  164,   54,  164,  164,  168,  168,
-      168,  168,  170,   52,  170,  170,  175,  175,  175,  175,
-      142,   35,  142,  142,  180,  180,  180,  180,  182,   29,
-      182,  182,  188,  188,  188,  188,  156,  255,  156,  156,
-      161,   27,  161,  161,  166,   27,  166,  166,  172,  255,
-      172,  172,  193,  193,  193,  193,  195,  195,  195,  195,
-      184,  255,  184,  184,  200,  200,  200,  200,  202,  202,
-      202,  202,  204,  255,  204,  204,  207,  207,  207,  207,
-
-      210,  210,  210,  210,  212,  212,  212,  212,  214,  214,
-      214,  214,  217,  217,  217,  217,  221,  221,  221,  221,
-      206,  255,  206,  206,  223,  223,  223,  223,  227,  227,
-      227,  227,  211,  255,  211,  211,  230,  230,  230,  230,
-      233,  233,  233,  233,  237,  237,  237,  237,  239,  255,
-      239,  239,  241,  255,  241,  241,  248,  248,  248,  248,
-      252,  252,  252,  252,    5,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255
-
+       33,  260,   41,   33,   28,   28,   28,   29,   34,   35,
+       35,   36,   37,   75,   42,   38,   35,   50,   43,   35,
+       35,   39,   28,   28,   28,   29,   34,   44,   46,   36,
+       37,   40,   45,   35,   47,   35,   35,   35,   52,   54,
+       35,   35,   51,   35,   56,   66,  266,   48,   57,   28,
+       60,   49,   31,   31,   32,   61,   35,   69,   68,   33,
+
+       28,   28,   28,   29,   35,   35,   35,   28,   37,   62,
+       62,   62,   63,   62,   35,   72,   62,   64,   67,   35,
+       50,   35,   35,   71,   35,   35,   70,   76,   35,   35,
+       35,   77,   73,   35,   35,   35,   35,   35,   80,   74,
+       84,   89,   90,   79,   35,   35,   35,   78,   35,   82,
+       81,   83,   80,   28,   60,   28,   86,   35,   91,   61,
+       92,   87,   35,   35,   93,   35,   94,   95,   77,   96,
+       35,   35,   99,  100,   35,   35,   35,  102,   35,   35,
+       35,   35,   97,   35,  104,  105,  103,   35,   35,   98,
+      106,   28,   86,   35,  107,  115,   35,   87,  101,  109,
+
+      114,  108,  110,  110,   62,  111,  110,   35,   35,  110,
+      113,   35,  118,  117,   35,   35,  116,   80,  102,   35,
+       35,  265,  105,   77,   35,   35,  141,  120,  121,  121,
+       62,  122,  121,  138,  133,  121,  124,  125,  125,   62,
+      126,  125,  140,   35,  125,  128,  129,  129,   62,  130,
+      129,  182,   35,  129,  132,  134,  134,   62,  135,  134,
+       35,   35,  134,  137,  139,   28,  143,   28,  145,  148,
+       35,  144,   35,  146,  147,   35,  242,  156,   35,   35,
+       28,  158,   28,  160,   35,  149,  159,  183,  161,   35,
+      244,  150,  151,  151,   62,  152,  151,  155,  262,  151,
+
+      154,   28,  163,   28,  165,   28,  168,  164,  172,  166,
+       35,  169,   28,  170,   28,  174,   28,  176,  171,   35,
+      175,   35,  177,   28,  143,  184,  185,   35,  178,  144,
+      216,   35,   35,   28,  187,   28,  189,  197,  179,  188,
+      260,  190,  191,   35,  192,  192,   62,  193,  192,   28,
+      158,  192,  195,   28,  163,  159,   28,  168,   35,  164,
+      196,   35,  169,   28,  174,  198,   35,  203,   35,  175,
+      205,   35,   28,  187,   28,  210,   28,  212,  188,  225,
+      211,  223,  213,   65,  218,  225,   34,  204,   28,   28,
+       28,   29,  228,  226,  227,   28,   37,   28,  210,  245,
+
+       35,  222,  242,  211,  225,  206,  233,  233,   62,  234,
+      233,  243,   34,  233,  236,  240,   28,  247,   28,  249,
+      225,   35,  248,   34,  250,  251,  225,  252,   28,  247,
+      255,   35,  225,  254,  248,  258,  225,  263,  267,  268,
+       34,  215,   34,   34,  253,  208,  256,  242,  257,  239,
+      202,  237,  232,   34,  261,   26,   26,   26,   26,   28,
+       28,   28,   30,   30,   30,   30,   35,   35,   35,   35,
+       58,  230,   58,   58,   59,   59,   59,   59,   61,  222,
+       61,   61,   34,   34,   34,   34,   65,   65,  220,   65,
+       85,   85,   85,   85,   87,  181,   87,   87,  112,  112,
+
+      112,  112,  123,  123,  123,  123,  127,  127,  127,  127,
+      131,  131,  131,  131,  136,  136,  136,  136,  142,  142,
+      142,  142,  144,  215,  144,  144,  153,  153,  153,  153,
+      157,  157,  157,  157,  159,  208,  159,  159,  162,  162,
+      162,  162,  164,  202,  164,  164,  167,  167,  167,  167,
+      169,  200,  169,  169,  173,  173,  173,  173,  175,  181,
+      175,  175,  180,  180,  180,  180,  146,  119,  146,  146,
+      186,  186,  186,  186,  188,   88,  188,  188,  194,  194,
+      194,  194,  161,   35,  161,  161,  166,   29,  166,  166,
+      171,   55,  171,  171,  177,   53,  177,  177,  199,  199,
+
+      199,  199,  201,  201,  201,  201,  190,   35,  190,  190,
+      207,  207,  207,  207,  209,  209,  209,  209,  211,   29,
+      211,  211,  214,  214,  214,  214,  217,  217,  217,  217,
+      219,  219,  219,  219,  221,  221,  221,  221,  224,  224,
+      224,  224,  229,  229,  229,  229,  213,  269,  213,  213,
+      231,  231,  231,  231,  235,  235,  235,  235,  218,   27,
+      218,  218,  238,  238,  238,  238,  241,  241,  241,  241,
+      246,  246,  246,  246,  248,   27,  248,  248,  250,  269,
+      250,  250,  259,  259,  259,  259,  264,  264,  264,  264,
+        5,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269
     } ;
 
-static yyconst flex_int16_t yy_chk[699] =
+static yyconst flex_int16_t yy_chk[725] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    7,    7,    7,    8,    8,    8,   13,
-        7,   41,   13,    8,   11,   11,   11,   11,   11,   47,
-       14,   11,   11,   47,   14,   11,   19,   19,   41,   15,
+        7,  264,   13,    8,   11,   11,   11,   11,   11,   48,
+       14,   11,   11,   48,   14,   11,   19,   19,   14,   15,
        16,   11,   12,   12,   12,   12,   12,   14,   16,   12,
        12,   12,   15,   18,   16,   20,   21,   23,   21,   23,
-      252,   25,   20,   38,   25,   38,   45,   18,   25,   30,
-       30,   18,   31,   31,   31,   30,   40,   45,   40,   31,
-
-       34,   34,   34,   34,   39,   42,   46,   34,   34,   36,
-       36,   36,   36,   36,   43,   43,   36,   36,   39,   44,
-       44,   50,   48,   46,   48,   49,   42,   51,   49,   52,
-       53,   54,   55,   66,   56,   66,   55,   56,   65,   58,
-       58,   51,   65,   67,   50,   58,   54,   53,   54,   61,
-       61,   52,   68,   67,   69,   61,   70,   71,   72,   70,
-       73,   71,   74,   75,   77,   75,   68,   76,   82,   76,
-       72,   79,   73,   69,   78,   87,   78,   81,  250,   79,
-       74,   80,   80,   81,   80,   91,   77,   80,   89,   82,
-       83,   83,   89,   87,   90,   94,   83,   88,   88,   88,
-
-       88,   88,   95,  248,   88,   88,   90,   92,   91,   92,
-       95,   98,   98,  103,   98,   94,   96,   96,   96,   96,
-       96,  103,  106,   96,   96,   97,   97,   97,   97,   97,
-      100,  247,   97,   97,   99,   99,   99,   99,   99,  104,
-      106,   99,   99,  104,  101,  100,  101,  102,  102,  102,
-      102,  102,  105,  105,  102,  102,  107,  107,  109,  109,
-      111,  112,  107,  113,  109,  115,  116,  112,  116,  117,
-      117,  119,  119,  111,  245,  117,  129,  119,  113,  114,
-      114,  114,  114,  114,  115,  198,  114,  114,  121,  121,
-      123,  123,  125,  125,  121,  129,  123,  134,  125,  127,
-
-      127,  130,  130,  132,  132,  127,  135,  130,  198,  132,
-      137,  137,  138,  138,  143,  134,  145,  143,  138,  233,
-      145,  146,  146,  148,  148,  135,  191,  146,  191,  148,
-      150,  150,  151,  151,  151,  151,  151,  152,  152,  151,
-      151,  157,  157,  152,  162,  162,  173,  157,  167,  167,
-      162,  168,  168,  174,  174,  220,  173,  168,  178,  178,
-      179,  179,  180,  180,  186,  186,  188,  188,  180,  220,
-      186,  199,  188,  192,  192,  202,  202,  216,  178,  199,
-      199,  202,  209,  209,  209,  209,  209,  219,  235,  209,
-      209,  232,  216,  225,  225,  232,  219,  227,  227,  225,
-
-      236,  237,  237,  227,  242,  242,  243,  237,  230,  244,
-      246,  235,  223,  221,  217,  214,  212,  210,  207,  200,
-      197,  195,  193,  190,  236,  244,  243,  185,  246,  256,
-      256,  256,  256,  257,  257,  257,  258,  258,  258,  258,
-      259,  259,  259,  259,  260,  177,  260,  260,  261,  261,
-      261,  261,  262,  175,  262,  262,  263,  263,  263,  263,
-      264,  264,  136,  264,  265,  265,  265,  265,  266,   93,
-      266,  266,  267,  267,  267,  267,  268,  268,  268,  268,
-      269,  269,  269,  269,  270,  270,  270,  270,  271,  271,
-      271,  271,  272,  272,  272,  272,  273,   64,  273,  273,
-
-      274,  274,  274,  274,  275,  275,  275,  275,  276,   35,
-      276,  276,  277,  277,  277,  277,  278,   28,  278,  278,
-      279,  279,  279,  279,  280,   24,  280,  280,  281,  281,
-      281,  281,  282,   22,  282,  282,  283,  283,  283,  283,
-      284,   17,  284,  284,  285,  285,  285,  285,  286,    6,
-      286,  286,  287,  287,  287,  287,  288,    5,  288,  288,
-      289,    4,  289,  289,  290,    3,  290,  290,  291,    0,
-      291,  291,  292,  292,  292,  292,  293,  293,  293,  293,
-      294,    0,  294,  294,  295,  295,  295,  295,  296,  296,
-      296,  296,  297,    0,  297,  297,  298,  298,  298,  298,
-
-      299,  299,  299,  299,  300,  300,  300,  300,  301,  301,
-      301,  301,  302,  302,  302,  302,  303,  303,  303,  303,
-      304,    0,  304,  304,  305,  305,  305,  305,  306,  306,
-      306,  306,  307,    0,  307,  307,  308,  308,  308,  308,
-      309,  309,  309,  309,  310,  310,  310,  310,  311,    0,
-      311,  311,  312,    0,  312,  312,  313,  313,  313,  313,
-      314,  314,  314,  314,  255,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255,  255,  255,
-      255,  255,  255,  255,  255,  255,  255,  255
-
+       41,   25,   20,   38,   25,   38,  261,   18,   25,   30,
+       30,   18,   31,   31,   31,   30,   40,   41,   40,   31,
+
+       34,   34,   34,   34,   39,   42,   43,   34,   34,   36,
+       36,   36,   36,   36,   44,   44,   36,   36,   39,   45,
+       45,   46,   47,   43,   51,   49,   42,   49,   50,   52,
+       53,   50,   46,   54,   55,   57,   56,   66,   57,   47,
+       56,   66,   67,   52,   67,   70,   69,   51,   68,   55,
+       54,   55,   53,   59,   59,   62,   62,   74,   68,   59,
+       69,   62,   71,   73,   70,   72,   71,   73,   72,   74,
+       75,   76,   77,   78,   77,   78,   79,   80,   81,   80,
+       84,   89,   75,   92,   82,   82,   81,   82,   83,   76,
+       82,   85,   85,   93,   83,   92,   91,   85,   79,   89,
+
+       91,   84,   90,   90,   90,   90,   90,   97,  109,   90,
+       90,   94,   95,   94,   95,   98,   93,  101,  101,  103,
+      101,  259,  104,   98,  104,  106,  109,   97,   99,   99,
+       99,   99,   99,  106,  103,   99,   99,  100,  100,  100,
+      100,  100,  108,  108,  100,  100,  102,  102,  102,  102,
+      102,  141,  141,  102,  102,  105,  105,  105,  105,  105,
+      107,  114,  105,  105,  107,  110,  110,  112,  112,  115,
+      116,  110,  117,  112,  114,  115,  227,  120,  119,  120,
+      121,  121,  123,  123,  147,  116,  121,  147,  123,  133,
+      227,  117,  118,  118,  118,  118,  118,  119,  257,  118,
+
+      118,  125,  125,  127,  127,  129,  129,  125,  133,  127,
+      138,  129,  131,  131,  134,  134,  136,  136,  131,  139,
+      134,  149,  136,  142,  142,  149,  150,  178,  138,  142,
+      197,  150,  197,  151,  151,  153,  153,  178,  139,  151,
+      255,  153,  155,  155,  156,  156,  156,  156,  156,  157,
+      157,  156,  156,  162,  162,  157,  167,  167,  204,  162,
+      172,  172,  167,  173,  173,  179,  179,  183,  183,  173,
+      184,  184,  186,  186,  192,  192,  194,  194,  186,  241,
+      192,  204,  194,  198,  198,  205,  206,  183,  185,  185,
+      185,  185,  206,  205,  205,  185,  185,  209,  209,  228,
+
+      223,  238,  226,  209,  243,  185,  216,  216,  216,  216,
+      216,  226,  228,  216,  216,  223,  233,  233,  235,  235,
+      244,  240,  233,  245,  235,  240,  252,  243,  246,  246,
+      251,  251,  253,  245,  246,  254,  256,  258,  263,  267,
+      258,  231,  263,  254,  244,  229,  252,  224,  253,  221,
+      219,  217,  214,  267,  256,  270,  270,  270,  270,  271,
+      271,  271,  272,  272,  272,  272,  273,  273,  273,  273,
+      274,  207,  274,  274,  275,  275,  275,  275,  276,  203,
+      276,  276,  277,  277,  277,  277,  278,  278,  201,  278,
+      279,  279,  279,  279,  280,  199,  280,  280,  281,  281,
+
+      281,  281,  282,  282,  282,  282,  283,  283,  283,  283,
+      284,  284,  284,  284,  285,  285,  285,  285,  286,  286,
+      286,  286,  287,  196,  287,  287,  288,  288,  288,  288,
+      289,  289,  289,  289,  290,  191,  290,  290,  291,  291,
+      291,  291,  292,  182,  292,  292,  293,  293,  293,  293,
+      294,  180,  294,  294,  295,  295,  295,  295,  296,  140,
+      296,  296,  297,  297,  297,  297,  298,   96,  298,  298,
+      299,  299,  299,  299,  300,   65,  300,  300,  301,  301,
+      301,  301,  302,   35,  302,  302,  303,   28,  303,  303,
+      304,   24,  304,  304,  305,   22,  305,  305,  306,  306,
+
+      306,  306,  307,  307,  307,  307,  308,   17,  308,  308,
+      309,  309,  309,  309,  310,  310,  310,  310,  311,    6,
+      311,  311,  312,  312,  312,  312,  313,  313,  313,  313,
+      314,  314,  314,  314,  315,  315,  315,  315,  316,  316,
+      316,  316,  317,  317,  317,  317,  318,    5,  318,  318,
+      319,  319,  319,  319,  320,  320,  320,  320,  321,    4,
+      321,  321,  322,  322,  322,  322,  323,  323,  323,  323,
+      324,  324,  324,  324,  325,    3,  325,  325,  326,    0,
+      326,  326,  327,  327,  327,  327,  328,  328,  328,  328,
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  269,
+      269,  269,  269,  269
     } ;
 
 #define YY_TRAILING_MASK 0x2000
@@ -890,7 +900,7 @@ static int vdev_and_devtype(DiskParseContext *dpc, char 
*str) {
 #define DPC ((DiskParseContext*)yyextra)
 
 
-#line 894 "libxlu_disk_l.c"
+#line 904 "libxlu_disk_l.c"
 
 #define INITIAL 0
 #define LEXERR 1
@@ -1131,7 +1141,7 @@ YY_DECL
 
  /*----- the scanner rules which do the parsing -----*/
 
-#line 1135 "libxlu_disk_l.c"
+#line 1145 "libxlu_disk_l.c"
 
        if ( !yyg->yy_init )
                {
@@ -1195,14 +1205,14 @@ yy_match:
                        while ( yy_chk[yy_base[yy_current_state] + yy_c] != 
yy_current_state )
                                {
                                yy_current_state = (int) 
yy_def[yy_current_state];
-                               if ( yy_current_state >= 256 )
+                               if ( yy_current_state >= 270 )
                                        yy_c = yy_meta[(unsigned int) yy_c];
                                }
                        yy_current_state = yy_nxt[yy_base[yy_current_state] + 
(unsigned int) yy_c];
                        *yyg->yy_state_ptr++ = yy_current_state;
                        ++yy_cp;
                        }
-               while ( yy_current_state != 255 );
+               while ( yy_current_state != 269 );
 
 yy_find_action:
                yy_current_state = *--yyg->yy_state_ptr;
@@ -1313,34 +1323,39 @@ YY_RULE_SETUP
 #line 175 "libxlu_disk_l.l"
 { STRIP(','); SAVESTRING("script", script, FROMEQUALS); }
        YY_BREAK
-/* the target magic parameter, eats the rest of the string */
 case 12:
 YY_RULE_SETUP
-#line 179 "libxlu_disk_l.l"
+#line 176 "libxlu_disk_l.l"
+{ DPC->disk->direct_io_safe = 1; }
+       YY_BREAK
+/* the target magic parameter, eats the rest of the string */
+case 13:
+YY_RULE_SETUP
+#line 180 "libxlu_disk_l.l"
 { STRIP(','); SAVESTRING("target", pdev_path, FROMEQUALS); }
        YY_BREAK
 /* unknown parameters */
-case 13:
-/* rule 13 can match eol */
+case 14:
+/* rule 14 can match eol */
 YY_RULE_SETUP
-#line 183 "libxlu_disk_l.l"
+#line 184 "libxlu_disk_l.l"
 { xlu__disk_err(DPC,yytext,"unknown parameter"); }
        YY_BREAK
 /* deprecated prefixes */
 /* the "/.*" in these patterns ensures that they count as if they
    * matched the whole string, so these patterns take precedence */
-case 14:
+case 15:
 YY_RULE_SETUP
-#line 190 "libxlu_disk_l.l"
+#line 191 "libxlu_disk_l.l"
 {
                     STRIP(':');
                     DPC->had_depr_prefix=1; DEPRECATE("use `[format=]...,'");
                     setformat(DPC, yytext);
                  }
        YY_BREAK
-case 15:
+case 16:
 YY_RULE_SETUP
-#line 196 "libxlu_disk_l.l"
+#line 197 "libxlu_disk_l.l"
 {
                     char *newscript;
                     STRIP(':');
@@ -1354,30 +1369,22 @@ YY_RULE_SETUP
                     free(newscript);
                 }
        YY_BREAK
-case 16:
+case 17:
 *yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
 yyg->yy_c_buf_p = yy_cp = yy_bp + 8;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 209 "libxlu_disk_l.l"
-{ DPC->had_depr_prefix=1; DEPRECATE(0); }
-       YY_BREAK
-case 17:
-YY_RULE_SETUP
 #line 210 "libxlu_disk_l.l"
 { DPC->had_depr_prefix=1; DEPRECATE(0); }
        YY_BREAK
 case 18:
-*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
-yyg->yy_c_buf_p = yy_cp = yy_bp + 4;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 #line 211 "libxlu_disk_l.l"
 { DPC->had_depr_prefix=1; DEPRECATE(0); }
        YY_BREAK
 case 19:
 *yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
-yyg->yy_c_buf_p = yy_cp = yy_bp + 6;
+yyg->yy_c_buf_p = yy_cp = yy_bp + 4;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 #line 212 "libxlu_disk_l.l"
@@ -1385,7 +1392,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 20:
 *yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
-yyg->yy_c_buf_p = yy_cp = yy_bp + 5;
+yyg->yy_c_buf_p = yy_cp = yy_bp + 6;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 #line 213 "libxlu_disk_l.l"
@@ -1393,26 +1400,34 @@ YY_RULE_SETUP
        YY_BREAK
 case 21:
 *yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
-yyg->yy_c_buf_p = yy_cp = yy_bp + 4;
+yyg->yy_c_buf_p = yy_cp = yy_bp + 5;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
 #line 214 "libxlu_disk_l.l"
 { DPC->had_depr_prefix=1; DEPRECATE(0); }
        YY_BREAK
 case 22:
-/* rule 22 can match eol */
+*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */
+yyg->yy_c_buf_p = yy_cp = yy_bp + 4;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 215 "libxlu_disk_l.l"
+{ DPC->had_depr_prefix=1; DEPRECATE(0); }
+       YY_BREAK
+case 23:
+/* rule 23 can match eol */
 YY_RULE_SETUP
-#line 216 "libxlu_disk_l.l"
+#line 217 "libxlu_disk_l.l"
 {
                  xlu__disk_err(DPC,yytext,"unknown deprecated disk prefix");
                  return 0;
                }
        YY_BREAK
 /* positional parameters */
-case 23:
-/* rule 23 can match eol */
+case 24:
+/* rule 24 can match eol */
 YY_RULE_SETUP
-#line 223 "libxlu_disk_l.l"
+#line 224 "libxlu_disk_l.l"
 {
     STRIP(',');
 
@@ -1439,27 +1454,27 @@ YY_RULE_SETUP
     }
 }
        YY_BREAK
-case 24:
+case 25:
 YY_RULE_SETUP
-#line 249 "libxlu_disk_l.l"
+#line 250 "libxlu_disk_l.l"
 {
     BEGIN(LEXERR);
     yymore();
 }
        YY_BREAK
-case 25:
+case 26:
 YY_RULE_SETUP
-#line 253 "libxlu_disk_l.l"
+#line 254 "libxlu_disk_l.l"
 {
     xlu__disk_err(DPC,yytext,"bad disk syntax"); return 0;
 }
        YY_BREAK
-case 26:
+case 27:
 YY_RULE_SETUP
-#line 256 "libxlu_disk_l.l"
+#line 257 "libxlu_disk_l.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
-#line 1463 "libxlu_disk_l.c"
+#line 1478 "libxlu_disk_l.c"
                        case YY_STATE_EOF(INITIAL):
                        case YY_STATE_EOF(LEXERR):
                                yyterminate();
@@ -1723,7 +1738,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
                while ( yy_chk[yy_base[yy_current_state] + yy_c] != 
yy_current_state )
                        {
                        yy_current_state = (int) yy_def[yy_current_state];
-                       if ( yy_current_state >= 256 )
+                       if ( yy_current_state >= 270 )
                                yy_c = yy_meta[(unsigned int) yy_c];
                        }
                yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned 
int) yy_c];
@@ -1747,11 +1762,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
        while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
                {
                yy_current_state = (int) yy_def[yy_current_state];
-               if ( yy_current_state >= 256 )
+               if ( yy_current_state >= 270 )
                        yy_c = yy_meta[(unsigned int) yy_c];
                }
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) 
yy_c];
-       yy_is_jam = (yy_current_state == 255);
+       yy_is_jam = (yy_current_state == 269);
        if ( ! yy_is_jam )
                *yyg->yy_state_ptr++ = yy_current_state;
 
@@ -2551,4 +2566,4 @@ void xlu__disk_yyfree (void * ptr , yyscan_t yyscanner)
 
 #define YYTABLES_NAME "yytables"
 
-#line 256 "libxlu_disk_l.l"
+#line 257 "libxlu_disk_l.l"
diff --git a/tools/libxl/libxlu_disk_l.h b/tools/libxl/libxlu_disk_l.h
index 0176249..59ce7cf 100644
--- a/tools/libxl/libxlu_disk_l.h
+++ b/tools/libxl/libxlu_disk_l.h
@@ -344,7 +344,7 @@ extern int xlu__disk_yylex (yyscan_t yyscanner);
 #undef YY_DECL
 #endif
 
-#line 256 "libxlu_disk_l.l"
+#line 257 "libxlu_disk_l.l"
 
 #line 350 "libxlu_disk_l.h"
 #undef xlu__disk_yyIN_HEADER
diff --git a/tools/libxl/libxlu_disk_l.l b/tools/libxl/libxlu_disk_l.l
index 7c4e7f1..ba8577c 100644
--- a/tools/libxl/libxlu_disk_l.l
+++ b/tools/libxl/libxlu_disk_l.l
@@ -173,6 +173,7 @@ backendtype=[^,]*,? { STRIP(','); 
setbackendtype(DPC,FROMEQUALS); }
 
 vdev=[^,]*,?   { STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
 script=[^,]*,? { STRIP(','); SAVESTRING("script", script, FROMEQUALS); }
+direct-io-safe,? { DPC->disk->direct_io_safe = 1; }
 
  /* the target magic parameter, eats the rest of the string */
 
diff --git a/xen/include/public/io/blkif.h b/xen/include/public/io/blkif.h
index b9b9d98..2dbb12f 100644
--- a/xen/include/public/io/blkif.h
+++ b/xen/include/public/io/blkif.h
@@ -97,6 +97,28 @@
  *
  *      The type of the backing device/object.
  *
+ *
+ * direct-io-safe
+ *      Values:         0/1 (boolean)
+ *      Default Value:  0
+ *
+ *      The underlying storage is not affected by the direct IO memory
+ *      lifetime bug.  See:
+ *        http://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.html
+ *
+ *      Therefore this option gives the backend permission to use
+ *      O_DIRECT, notwithstanding that bug.
+ *
+ *      That is, if this option is enabled, use of O_DIRECT is safe,
+ *      in circumstances where we would normally have avoided it as a
+ *      workaround for that bug.  This option is not relevant for all
+ *      backends, and even not necessarily supported for those for
+ *      which it is relevant.  A backend which knows that it is not
+ *      affected by the bug can ignore this option.
+ *
+ *      This option doesn't require a backend to use O_DIRECT, so it
+ *      should not be used to try to control the caching behaviour.
+ *
  *--------------------------------- Features ---------------------------------
  *
  * feature-barrier
-- 
1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.