* Re: can not trace function (main) with perf-probe
From: Arnaldo Carvalho de Melo @ 2016-11-14 14:55 UTC (permalink / raw)
To: HOUSSEN Franck
Cc: peterz, mingo, alexander.shishkin, namhyung, jolsa, penberg,
linux-perf-users
In-Reply-To: <CABvthirHujJiKsYc_1Fq=sy9SoYzg0h9XyYGxe-LRf10YdXn8g@mail.gmail.com>
Em Sun, Nov 13, 2016 at 12:10:05PM +0100, HOUSSEN Franck escreveu:
> I can not trace the main function (hello world) with perf-probe.
You should send this to a list, like I'm doing now, not in private, I suggest
linux-perf-users@vger.kernel.org, info about it:
http://vger.kernel.org/vger-lists.html#linux-perf-users
> perf-report reports:
> # Overhead Trace output
> # ........ ............
> #
> 100.00% (563a994a56b
> Instead of the expected:
> # Overhead Trace output
> # ........ ............
> #
> 100.00% main
So, trying this:
[root@jouet c]# cat hello.c
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
return 0;
}
[root@jouet c]# make hello
cc hello.c -o hello
[root@jouet c]# perf probe -x ./hello main
Added new event:
probe_hello:main (on main in /home/acme/c/hello)
You can now use it in all perf tools, such as:
perf record -e probe_hello:main -aR sleep 1
[root@jouet c]# perf record -e probe_hello:main ./hello
hello, world
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.021 MB perf.data (1 samples) ]
[root@jouet c]# perf report --no-header --stdio
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 1 of event 'probe_hello:main'
# Event count (approx.): 1
#
# Overhead Trace output
# ........ ............
#
100.00% (400526)
#
# (Tip: Create an archive with symtabs to analyse on other machine: perf archive)
#
[root@jouet c]#
Reproduced, this ends up showing just the trace fields for this tracepoint:
[root@jouet c]# perf evlist --trace
probe_hello:main: trace_fields: __probe_ip
[root@jouet c]# perf script
hello 26213 [003] 174431.417607: probe_hello:main: (400526)
[root@jouet c]#
If we instead ask for dso,sym, as it is done for non-tracepoint events, we'd get:
[root@jouet c]# perf report --no-header --stdio -s dso,sym
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 1 of event 'probe_hello:main'
# Event count (approx.): 1
#
# Overhead Shared Object Symbol
# ........ ............. ........
#
100.00% hello [.] main
You can get both with:
[root@jouet c]# perf report --no-header --stdio -s dso,sym,trace
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 1 of event 'probe_hello:main'
# Event count (approx.): 1
#
# Overhead Shared Object Symbol Trace output
# ........ ............. ........ ............
#
100.00% hello [.] main (400526)
[root@jouet c]#
Please look at the --sort/-s docs for further information:
[root@jouet c]# perf report -h -s
Usage: perf report [<options>]
-s, --sort <key[,key2...]>
sort by key(s): pid, comm, dso, symbol, parent, cpu, srcline, ... Please refer the man page for the complete list.
[root@jouet c]#
Some other example:
[root@jouet c]# perf report --no-header --stdio -s dso,sym,pid,cpu
# To display the perf.data header info, please use
# --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 1 of event 'probe_hello:main'
# Event count (approx.): 1
#
# Overhead Shared Object Symbol Pid:Command CPU
# ........ ............. ........ ............... ...
#
100.00% hello [.] main 26213:hello 003
[root@jouet c]#
- Arnaldo
> I use perf record/report with other events and I get some reports with
> expected symbols (= name of functions instead of their memory
> address).
>
> Did I miss something when using perf-probe or perf-record / perf-report ?
>
> Franck
>
> /tmp> more main.cpp
> #include <unistd.h> // sleep
> int main(void) { sleep(10); return 0; }
>
> /tmp> gcc -g main.cpp -o main
>
> /tmp> sudo perf probe --exec ./main --add main
> Added new event:
> probe_main:main (on main in /tmp/main)
> You can now use it in all perf tools, such as:
> perf record -e probe_main:main -aR sleep 1
>
> /tmp> sudo perf record -e probe_main:main ./main
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.017 MB perf.data (1 samples) ]
>
> /tmp> sudo perf report --stdio
> # To display the perf.data header info, please use
> --header/--header-only options.
> #
> #
> # Total Lost Samples: 0
> #
> # Samples: 1 of event 'probe_main:main'
> # Event count (approx.): 1
> #
> # Overhead Trace output
> # ........ ............
> #
> 100.00% (563a994a56b
> #
> # (Tip: List events using substring match: perf list <keyword>)
> #
>
> ~> lsb_release -a
> No LSB modules are available.
> Distributor ID: Debian
> Description: Debian GNU/Linux testing (stretch)
> Release: testing
> Codename: stretch
>
> ~> cat /proc/sys/kernel/perf_event_paranoid
> -1
>
> ~> cat /proc/sys/kernel/kptr_restrict
> 0
>
> ~> gcc --version
> gcc (Debian 6.2.0-10) 6.2.0 20161027
>
> ~> perf --version
> perf version 4.7.8
>
> ~> uname -a
> Linux yoda 4.7.0-1-amd64 #1 SMP Debian 4.7.8-1 (2016-10-19) x86_64 GNU/Linux
^ permalink raw reply
* Re: [RFC] change mac80211_hwsim tx_rates to ieee80211_tx_rate
From: Johannes Berg @ 2016-11-14 14:56 UTC (permalink / raw)
To: Benjamin Beichler, linux-wireless
In-Reply-To: <838c443a-f8aa-ab21-61b0-9352f24442b1@uni-rostock.de>
> Mhh, I thought also some atheros drivers implement hardware multirate
> retry changes, which maps to this struct. Only one rate per frame
> would introduce a extreme additional communication overhead, which
> will make testing with standard wmediumd impractical. I think we need
> to keep such a structure, but we should align that with other
> mac80211 depended drivers.
Yeah, I was being imprecise. The driver interface is usually similar to
the mac80211 struct in one way or another (though it might also be a
more global table, like other drivers implement).
I was more thinking of the actual air interface. I'm not too worried
about the efficiency of this (we can push quite a few gbps over hwsim
today iirc), but it actually doesn't make sense because an accurate
simulation would require NAV/TXOP simulation, and that wouldn't be
possible with "software retry".
So I think our best bet remains to map this to new attributes - better
with properly formatted ones etc. than with the struct (keeping that
only for compatibility)
If you're worried about the overhead, we could consider converting
hwsim to use the rate_table API - see struct ieee80211_sta -> rates,
and maybe adding a signal to update that in the driver, send that to
userspace directly and work with that, rather than "serializing" the
table for every frame?
johannes
^ permalink raw reply
* [PATCH] libxl: QED disks support
From: Cédric Bosdonnat @ 2016-11-14 14:57 UTC (permalink / raw)
To: xen-devel; +Cc: Wei Liu, Ian Jackson, Cédric Bosdonnat
Qdisk supports qcow and qcow2, extend it to also support qed disk
format.
Signed-off-by: Cédric Bosdonnat <cbosdonnat@suse.com>
---
tools/libxl/libxl_device.c | 1 +
tools/libxl/libxl_dm.c | 1 +
tools/libxl/libxl_types.idl | 1 +
tools/libxl/libxl_utils.c | 2 +
tools/libxl/libxlu_disk_l.c | 1018 ++++++++++++++++++++++---------------------
tools/libxl/libxlu_disk_l.h | 53 +--
tools/libxl/libxlu_disk_l.l | 3 +-
7 files changed, 539 insertions(+), 540 deletions(-)
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 3e7a102..6c34141 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -411,6 +411,7 @@ char *libxl__device_disk_string_of_format(libxl_disk_format format)
case LIBXL_DISK_FORMAT_VHD: return "vhd";
case LIBXL_DISK_FORMAT_RAW:
case LIBXL_DISK_FORMAT_EMPTY: return "aio";
+ case LIBXL_DISK_FORMAT_QED: return "qed";
default: return NULL;
}
}
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index ad366a8..8b37342 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -677,6 +677,7 @@ static const char *qemu_disk_format_string(libxl_disk_format format)
case LIBXL_DISK_FORMAT_VHD: return "vpc";
case LIBXL_DISK_FORMAT_RAW: return "raw";
case LIBXL_DISK_FORMAT_EMPTY: return NULL;
+ case LIBXL_DISK_FORMAT_QED: return "qed";
default: return NULL;
}
}
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index a32c751..a612d1f 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -114,6 +114,7 @@ libxl_disk_format = Enumeration("disk_format", [
(3, "VHD"),
(4, "RAW"),
(5, "EMPTY"),
+ (6, "QED"),
])
libxl_disk_backend = Enumeration("disk_backend", [
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index 49cbaa5..507ee56 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -317,6 +317,8 @@ int libxl_string_to_backend(libxl_ctx *ctx, char *s, libxl_disk_backend *backend
*backend = LIBXL_DISK_BACKEND_QDISK;
} else if (!strcmp(p, "qcow2")) {
*backend = LIBXL_DISK_BACKEND_QDISK;
+ } else if (!strcmp(p, "qed")) {
+ *backend = LIBXL_DISK_BACKEND_QDISK;
}
}
out:
diff --git a/tools/libxl/libxlu_disk_l.c b/tools/libxl/libxlu_disk_l.c
index 54160ca..fa09a69 100644
--- a/tools/libxl/libxlu_disk_l.c
+++ b/tools/libxl/libxlu_disk_l.c
@@ -1,10 +1,7 @@
#line 2 "libxlu_disk_l.c"
-#line 31 "libxlu_disk_l.l"
#include "libxl_osdeps.h" /* must come before any other headers */
-
-
-#line 8 "libxlu_disk_l.c"
+#line 5 "libxlu_disk_l.c"
#define YY_INT_ALIGNED short int
@@ -12,8 +9,8 @@
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 39
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 1
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
@@ -92,25 +89,13 @@ typedef unsigned int flex_uint32_t;
#endif /* ! FLEXINT_H */
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif /* defined (__STDC__) */
-#endif /* ! __cplusplus */
-
-#ifdef YY_USE_CONST
+/* TODO: this is always defined, so inline it */
#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
#else
-#define yyconst
+#define yynoreturn
#endif
/* Returned upon end-of-file. */
@@ -223,12 +208,12 @@ struct yy_buffer_state
/* Size of input buffer in bytes, not including room for EOB
* characters.
*/
- yy_size_t yy_buf_size;
+ int yy_buf_size;
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
- yy_size_t yy_n_chars;
+ int yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
@@ -307,7 +292,7 @@ static void xlu__disk_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yys
YY_BUFFER_STATE xlu__disk_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
YY_BUFFER_STATE xlu__disk_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
-YY_BUFFER_STATE xlu__disk_yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );
+YY_BUFFER_STATE xlu__disk_yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
void *xlu__disk_yyalloc (yy_size_t ,yyscan_t yyscanner );
void *xlu__disk_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
@@ -337,7 +322,7 @@ void xlu__disk_yyfree (void * ,yyscan_t yyscanner );
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-#define xlu__disk_yywrap(yyscanner) 1
+#define xlu__disk_yywrap(yyscanner) (/*CONSTCOND*/1)
#define YY_SKIP_YYWRAP
typedef unsigned char YY_CHAR;
@@ -349,7 +334,7 @@ typedef int yy_state_type;
static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner);
static int yy_get_next_buffer (yyscan_t yyscanner );
-static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
+static void yynoreturn yy_fatal_error (yyconst char* msg ,yyscan_t yyscanner );
/* Done after the current pattern has been matched and before the
* corresponding action - sets up yytext.
@@ -357,7 +342,7 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
#define YY_DO_BEFORE_ACTION \
yyg->yytext_ptr = yy_bp; \
yyg->yytext_ptr -= yyg->yy_more_len; \
- yyleng = (size_t) (yy_cp - yyg->yytext_ptr); \
+ yyleng = (int) (yy_cp - yyg->yytext_ptr); \
yyg->yy_hold_char = *yy_cp; \
*yy_cp = '\0'; \
yyg->yy_c_buf_p = yy_cp;
@@ -371,7 +356,7 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_acclist[575] =
+static yyconst flex_int16_t yy_acclist[576] =
{ 0,
35, 35, 37, 33, 34, 36, 8193, 33, 34, 36,
16385, 8193, 33, 36,16385, 33, 34, 36, 34, 36,
@@ -384,61 +369,61 @@ static yyconst flex_int16_t yy_acclist[575] =
8193, 33, 33, 8224, 33,16416, 33, 33, 33, 33,
33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 35,
- 8193, 33, 8193, 33, 8193, 8224, 33, 8224, 33, 8224,
- 23, 33, 33, 33, 33, 33, 33, 33, 33, 33,
33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 8224, 33, 8224, 33, 8224,
- 23, 33, 33, 28, 8224, 33,16416, 33, 33, 15,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 8217,
- 8224, 33,16409,16416, 33, 33, 31, 8224, 33,16416,
- 33, 8216, 8224, 33,16408,16416, 33, 33, 8219, 8224,
- 33,16411,16416, 33, 33, 33, 33, 33, 28, 8224,
-
- 33, 28, 8224, 33, 28, 33, 28, 8224, 33, 3,
- 33, 15, 33, 33, 33, 33, 33, 30, 8224, 33,
- 16416, 33, 33, 33, 8217, 8224, 33, 8217, 8224, 33,
- 8217, 33, 8217, 8224, 33, 33, 31, 8224, 33, 31,
- 8224, 33, 31, 33, 31, 8224, 8216, 8224, 33, 8216,
- 8224, 33, 8216, 33, 8216, 8224, 33, 8219, 8224, 33,
- 8219, 8224, 33, 8219, 33, 8219, 8224, 33, 33, 10,
- 33, 33, 28, 8224, 33, 28, 8224, 33, 28, 8224,
- 28, 33, 28, 33, 3, 33, 33, 33, 33, 33,
- 33, 33, 30, 8224, 33, 30, 8224, 33, 30, 33,
-
- 30, 8224, 33, 33, 29, 8224, 33,16416, 8217, 8224,
- 33, 8217, 8224, 33, 8217, 8224, 8217, 33, 8217, 33,
- 33, 31, 8224, 33, 31, 8224, 33, 31, 8224, 31,
- 33, 31, 8216, 8224, 33, 8216, 8224, 33, 8216, 8224,
- 8216, 33, 8216, 33, 8219, 8224, 33, 8219, 8224, 33,
- 8219, 8224, 8219, 33, 8219, 33, 33, 10, 23, 10,
- 7, 33, 33, 33, 33, 33, 33, 33, 13, 33,
- 30, 8224, 33, 30, 8224, 33, 30, 8224, 30, 33,
- 30, 2, 33, 29, 8224, 33, 29, 8224, 33, 29,
- 33, 29, 8224, 16, 33, 33, 11, 33, 22, 10,
-
- 10, 23, 7, 23, 7, 33, 8, 33, 33, 33,
- 33, 6, 33, 13, 33, 2, 23, 2, 33, 29,
- 8224, 33, 29, 8224, 33, 29, 8224, 29, 33, 29,
- 16, 33, 33, 11, 23, 11, 26, 8224, 33,16416,
- 22, 23, 22, 7, 7, 23, 33, 8, 23, 8,
- 33, 33, 33, 33, 6, 23, 6, 6, 23, 6,
- 23, 33, 2, 2, 23, 33, 33, 11, 11, 23,
- 26, 8224, 33, 26, 8224, 33, 26, 33, 26, 8224,
- 22, 23, 33, 8, 8, 23, 33, 33, 17, 18,
- 6, 6, 23, 6, 6, 33, 33, 14, 33, 26,
-
- 8224, 33, 26, 8224, 33, 26, 8224, 26, 33, 26,
- 33, 33, 33, 17, 23, 17, 18, 23, 18, 6,
- 6, 33, 33, 14, 33, 20, 9, 19, 17, 17,
- 23, 18, 18, 23, 6, 5, 6, 33, 21, 20,
- 23, 20, 9, 23, 9, 19, 23, 19, 4, 6,
- 5, 6, 33, 21, 23, 21, 20, 20, 23, 9,
- 9, 23, 19, 19, 23, 4, 6, 12, 33, 21,
- 21, 23, 12, 33
+ 35, 8193, 33, 8193, 33, 8193, 8224, 33, 8224, 33,
+ 8224, 23, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 8224, 33, 8224, 33,
+ 8224, 23, 33, 33, 28, 8224, 33,16416, 33, 33,
+ 15, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 8217, 8224, 33,16409,16416, 33, 33, 31, 8224, 33,
+ 16416, 33, 8216, 8224, 33,16408,16416, 33, 33, 8219,
+ 8224, 33,16411,16416, 33, 33, 33, 33, 33, 28,
+
+ 8224, 33, 28, 8224, 33, 28, 33, 28, 8224, 33,
+ 3, 33, 15, 33, 33, 33, 33, 33, 30, 8224,
+ 33,16416, 33, 33, 33, 8217, 8224, 33, 8217, 8224,
+ 33, 8217, 33, 8217, 8224, 33, 33, 31, 8224, 33,
+ 31, 8224, 33, 31, 33, 31, 8224, 8216, 8224, 33,
+ 8216, 8224, 33, 8216, 33, 8216, 8224, 33, 8219, 8224,
+ 33, 8219, 8224, 33, 8219, 33, 8219, 8224, 33, 33,
+ 10, 33, 33, 28, 8224, 33, 28, 8224, 33, 28,
+ 8224, 28, 33, 28, 33, 3, 33, 33, 33, 33,
+ 33, 33, 33, 30, 8224, 33, 30, 8224, 33, 30,
+
+ 33, 30, 8224, 33, 33, 29, 8224, 33,16416, 8217,
+ 8224, 33, 8217, 8224, 33, 8217, 8224, 8217, 33, 8217,
+ 33, 33, 31, 8224, 33, 31, 8224, 33, 31, 8224,
+ 31, 33, 31, 8216, 8224, 33, 8216, 8224, 33, 8216,
+ 8224, 8216, 33, 8216, 33, 8219, 8224, 33, 8219, 8224,
+ 33, 8219, 8224, 8219, 33, 8219, 33, 33, 10, 23,
+ 10, 7, 33, 33, 33, 33, 33, 33, 33, 13,
+ 33, 30, 8224, 33, 30, 8224, 33, 30, 8224, 30,
+ 33, 30, 2, 33, 29, 8224, 33, 29, 8224, 33,
+ 29, 33, 29, 8224, 16, 33, 33, 11, 33, 22,
+
+ 10, 10, 23, 7, 23, 7, 33, 8, 33, 33,
+ 33, 33, 6, 33, 13, 33, 2, 23, 2, 33,
+ 29, 8224, 33, 29, 8224, 33, 29, 8224, 29, 33,
+ 29, 16, 33, 33, 11, 23, 11, 26, 8224, 33,
+ 16416, 22, 23, 22, 7, 7, 23, 33, 8, 23,
+ 8, 33, 33, 33, 33, 6, 23, 6, 6, 23,
+ 6, 23, 33, 2, 2, 23, 33, 33, 11, 11,
+ 23, 26, 8224, 33, 26, 8224, 33, 26, 33, 26,
+ 8224, 22, 23, 33, 8, 8, 23, 33, 33, 17,
+ 18, 6, 6, 23, 6, 6, 33, 33, 14, 33,
+
+ 26, 8224, 33, 26, 8224, 33, 26, 8224, 26, 33,
+ 26, 33, 33, 33, 17, 23, 17, 18, 23, 18,
+ 6, 6, 33, 33, 14, 33, 20, 9, 19, 17,
+ 17, 23, 18, 18, 23, 6, 5, 6, 33, 21,
+ 20, 23, 20, 9, 23, 9, 19, 23, 19, 4,
+ 6, 5, 6, 33, 21, 23, 21, 20, 20, 23,
+ 9, 9, 23, 19, 19, 23, 4, 6, 12, 33,
+ 21, 21, 23, 12, 33
} ;
-static yyconst flex_int16_t yy_accept[356] =
+static yyconst flex_int16_t yy_accept[357] =
{ 0,
1, 1, 1, 2, 3, 4, 7, 12, 16, 19,
21, 24, 27, 30, 33, 36, 39, 42, 45, 48,
@@ -446,42 +431,42 @@ static yyconst flex_int16_t yy_accept[356] =
74, 76, 79, 81, 82, 83, 84, 87, 87, 88,
89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
99, 100, 101, 102, 103, 104, 105, 106, 107, 108,
- 109, 110, 111, 113, 115, 116, 118, 120, 121, 122,
+ 109, 110, 111, 112, 114, 116, 117, 119, 121, 122,
123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
- 143, 144, 145, 146, 148, 150, 151, 152, 153, 154,
-
- 158, 159, 160, 162, 163, 164, 165, 166, 167, 168,
- 169, 170, 175, 176, 177, 181, 182, 187, 188, 189,
- 194, 195, 196, 197, 198, 199, 202, 205, 207, 209,
- 210, 212, 214, 215, 216, 217, 218, 222, 223, 224,
- 225, 228, 231, 233, 235, 236, 237, 240, 243, 245,
- 247, 250, 253, 255, 257, 258, 261, 264, 266, 268,
- 269, 270, 271, 272, 273, 276, 279, 281, 283, 284,
- 285, 287, 288, 289, 290, 291, 292, 293, 296, 299,
- 301, 303, 304, 305, 309, 312, 315, 317, 319, 320,
- 321, 322, 325, 328, 330, 332, 333, 336, 339, 341,
-
- 343, 344, 345, 348, 351, 353, 355, 356, 357, 358,
- 360, 361, 362, 363, 364, 365, 366, 367, 368, 369,
- 371, 374, 377, 379, 381, 382, 383, 384, 387, 390,
- 392, 394, 396, 397, 398, 399, 400, 401, 403, 405,
- 406, 407, 408, 409, 410, 411, 412, 413, 414, 416,
- 418, 419, 420, 423, 426, 428, 430, 431, 433, 434,
- 436, 437, 441, 443, 444, 445, 447, 448, 450, 451,
- 452, 453, 454, 455, 457, 458, 460, 462, 463, 464,
- 466, 467, 468, 469, 471, 474, 477, 479, 481, 483,
- 484, 485, 487, 488, 489, 490, 491, 492, 494, 495,
-
- 496, 497, 498, 500, 503, 506, 508, 510, 511, 512,
- 513, 514, 516, 517, 519, 520, 521, 522, 523, 524,
- 526, 527, 528, 529, 530, 532, 533, 535, 536, 538,
- 539, 540, 542, 543, 545, 546, 548, 549, 551, 553,
- 554, 556, 557, 558, 560, 561, 563, 564, 566, 568,
- 570, 571, 573, 575, 575
+ 143, 144, 145, 146, 147, 149, 151, 152, 153, 154,
+
+ 155, 159, 160, 161, 163, 164, 165, 166, 167, 168,
+ 169, 170, 171, 176, 177, 178, 182, 183, 188, 189,
+ 190, 195, 196, 197, 198, 199, 200, 203, 206, 208,
+ 210, 211, 213, 215, 216, 217, 218, 219, 223, 224,
+ 225, 226, 229, 232, 234, 236, 237, 238, 241, 244,
+ 246, 248, 251, 254, 256, 258, 259, 262, 265, 267,
+ 269, 270, 271, 272, 273, 274, 277, 280, 282, 284,
+ 285, 286, 288, 289, 290, 291, 292, 293, 294, 297,
+ 300, 302, 304, 305, 306, 310, 313, 316, 318, 320,
+ 321, 322, 323, 326, 329, 331, 333, 334, 337, 340,
+
+ 342, 344, 345, 346, 349, 352, 354, 356, 357, 358,
+ 359, 361, 362, 363, 364, 365, 366, 367, 368, 369,
+ 370, 372, 375, 378, 380, 382, 383, 384, 385, 388,
+ 391, 393, 395, 397, 398, 399, 400, 401, 402, 404,
+ 406, 407, 408, 409, 410, 411, 412, 413, 414, 415,
+ 417, 419, 420, 421, 424, 427, 429, 431, 432, 434,
+ 435, 437, 438, 442, 444, 445, 446, 448, 449, 451,
+ 452, 453, 454, 455, 456, 458, 459, 461, 463, 464,
+ 465, 467, 468, 469, 470, 472, 475, 478, 480, 482,
+ 484, 485, 486, 488, 489, 490, 491, 492, 493, 495,
+
+ 496, 497, 498, 499, 501, 504, 507, 509, 511, 512,
+ 513, 514, 515, 517, 518, 520, 521, 522, 523, 524,
+ 525, 527, 528, 529, 530, 531, 533, 534, 536, 537,
+ 539, 540, 541, 543, 544, 546, 547, 549, 550, 552,
+ 554, 555, 557, 558, 559, 561, 562, 564, 565, 567,
+ 569, 571, 572, 574, 576, 576
} ;
-static yyconst flex_int32_t yy_ec[256] =
+static yyconst YY_CHAR yy_ec[256] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -513,7 +498,7 @@ static yyconst flex_int32_t yy_ec[256] =
1, 1, 1, 1, 1
} ;
-static yyconst flex_int32_t yy_meta[35] =
+static yyconst YY_CHAR yy_meta[35] =
{ 0,
1, 1, 2, 3, 1, 1, 1, 1, 4, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -521,216 +506,217 @@ static yyconst flex_int32_t yy_meta[35] =
1, 1, 1, 1
} ;
-static yyconst flex_int16_t yy_base[424] =
+static yyconst flex_uint16_t yy_base[425] =
{ 0,
- 0, 0, 901, 900, 902, 897, 33, 36, 905, 905,
- 45, 63, 31, 42, 51, 52, 890, 33, 65, 67,
- 69, 70, 889, 71, 888, 75, 0, 905, 893, 905,
- 91, 94, 0, 0, 103, 886, 112, 0, 89, 98,
- 113, 92, 114, 99, 100, 48, 121, 116, 119, 74,
- 124, 129, 123, 135, 132, 133, 137, 134, 138, 139,
- 141, 0, 155, 0, 0, 164, 0, 0, 849, 142,
- 152, 164, 140, 161, 165, 166, 167, 168, 169, 173,
- 174, 178, 176, 180, 184, 208, 189, 183, 192, 195,
- 215, 191, 193, 223, 0, 0, 905, 208, 204, 236,
-
- 219, 209, 238, 196, 237, 831, 242, 815, 241, 224,
- 243, 261, 244, 259, 277, 266, 286, 250, 288, 298,
- 249, 283, 274, 282, 294, 308, 0, 310, 0, 295,
- 305, 905, 308, 306, 313, 314, 342, 319, 316, 320,
- 331, 0, 349, 0, 342, 344, 356, 0, 358, 0,
- 365, 0, 367, 0, 354, 375, 0, 377, 0, 363,
- 356, 809, 327, 322, 384, 0, 0, 0, 0, 379,
- 905, 382, 384, 386, 390, 372, 392, 403, 0, 410,
- 0, 407, 413, 423, 426, 0, 0, 0, 0, 409,
- 424, 435, 0, 0, 0, 0, 437, 0, 0, 0,
-
- 0, 433, 444, 0, 0, 0, 0, 391, 440, 781,
- 905, 769, 439, 445, 444, 447, 449, 454, 453, 399,
- 464, 0, 0, 0, 0, 757, 465, 476, 0, 478,
- 0, 479, 476, 753, 462, 490, 749, 905, 745, 905,
- 483, 737, 424, 485, 487, 490, 500, 493, 905, 729,
- 905, 502, 518, 0, 0, 0, 0, 905, 498, 721,
- 905, 527, 713, 0, 705, 905, 495, 697, 905, 365,
- 521, 528, 530, 685, 905, 534, 540, 540, 657, 905,
- 537, 542, 650, 905, 553, 0, 557, 0, 0, 551,
- 641, 905, 558, 557, 633, 614, 613, 905, 547, 555,
-
- 563, 565, 569, 584, 0, 0, 0, 0, 583, 570,
- 585, 612, 905, 601, 905, 522, 580, 589, 594, 905,
- 600, 585, 563, 520, 905, 514, 905, 586, 486, 597,
- 480, 441, 905, 416, 905, 345, 905, 334, 905, 601,
- 254, 905, 242, 905, 200, 905, 151, 905, 905, 607,
- 86, 905, 905, 905, 620, 624, 627, 631, 635, 639,
- 643, 647, 651, 655, 659, 663, 667, 671, 675, 679,
- 683, 687, 691, 695, 699, 703, 707, 711, 715, 719,
- 723, 727, 731, 735, 739, 743, 747, 751, 755, 759,
- 763, 767, 771, 775, 779, 783, 787, 791, 795, 799,
-
- 803, 807, 811, 815, 819, 823, 827, 831, 835, 839,
- 843, 847, 851, 855, 859, 863, 867, 871, 875, 879,
- 883, 887, 891
+ 0, 0, 904, 903, 905, 900, 33, 36, 908, 908,
+ 45, 63, 31, 42, 51, 52, 893, 33, 65, 67,
+ 69, 70, 892, 71, 891, 75, 0, 908, 896, 908,
+ 91, 94, 0, 0, 103, 889, 112, 0, 89, 98,
+ 113, 92, 114, 99, 100, 48, 121, 116, 119, 77,
+ 124, 129, 123, 135, 132, 133, 134, 138, 140, 144,
+ 139, 142, 0, 155, 0, 0, 159, 0, 0, 894,
+ 146, 155, 164, 141, 165, 166, 167, 168, 169, 170,
+ 174, 175, 181, 176, 177, 185, 205, 191, 190, 194,
+ 193, 213, 200, 202, 221, 0, 0, 908, 209, 205,
+
+ 237, 217, 222, 224, 225, 237, 887, 240, 886, 241,
+ 233, 242, 263, 245, 261, 279, 246, 288, 251, 267,
+ 297, 252, 293, 276, 284, 294, 306, 0, 310, 0,
+ 301, 312, 908, 313, 307, 308, 268, 338, 319, 310,
+ 313, 341, 0, 348, 0, 341, 343, 355, 0, 357,
+ 0, 364, 0, 366, 0, 353, 374, 0, 376, 0,
+ 321, 355, 849, 325, 371, 383, 0, 0, 0, 0,
+ 378, 908, 377, 381, 383, 387, 393, 389, 405, 0,
+ 408, 0, 406, 408, 418, 421, 0, 0, 0, 0,
+ 416, 419, 430, 0, 0, 0, 0, 432, 0, 0,
+
+ 0, 0, 428, 439, 0, 0, 0, 0, 434, 436,
+ 837, 908, 821, 437, 442, 443, 445, 447, 452, 451,
+ 396, 463, 0, 0, 0, 0, 809, 463, 474, 0,
+ 476, 0, 477, 474, 781, 364, 488, 769, 908, 757,
+ 908, 481, 753, 472, 483, 485, 488, 498, 491, 908,
+ 749, 908, 500, 516, 0, 0, 0, 0, 908, 496,
+ 745, 908, 525, 737, 0, 729, 908, 509, 721, 908,
+ 506, 523, 529, 531, 713, 908, 535, 528, 540, 705,
+ 908, 542, 544, 697, 908, 555, 0, 557, 0, 0,
+ 555, 685, 908, 537, 550, 657, 650, 641, 908, 443,
+
+ 545, 559, 564, 570, 577, 0, 0, 0, 0, 576,
+ 581, 583, 633, 908, 614, 908, 574, 589, 587, 592,
+ 908, 613, 612, 602, 599, 908, 598, 908, 590, 565,
+ 595, 561, 520, 908, 501, 908, 484, 908, 461, 908,
+ 601, 449, 908, 400, 908, 332, 908, 324, 908, 908,
+ 607, 188, 908, 908, 908, 620, 624, 627, 631, 635,
+ 639, 643, 647, 651, 655, 659, 663, 667, 671, 675,
+ 679, 683, 687, 691, 695, 699, 703, 707, 711, 715,
+ 719, 723, 727, 731, 735, 739, 743, 747, 751, 755,
+ 759, 763, 767, 771, 775, 779, 783, 787, 791, 795,
+
+ 799, 803, 807, 811, 815, 819, 823, 827, 831, 835,
+ 839, 843, 847, 851, 855, 859, 863, 867, 871, 875,
+ 879, 883, 887, 891
} ;
-static yyconst flex_int16_t yy_def[424] =
+static yyconst flex_int16_t yy_def[425] =
{ 0,
- 354, 1, 355, 355, 354, 356, 357, 357, 354, 354,
- 358, 358, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 12, 359, 354, 356, 354,
- 360, 357, 361, 361, 362, 12, 356, 363, 12, 12,
+ 355, 1, 356, 356, 355, 357, 358, 358, 355, 355,
+ 359, 359, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 360, 355, 357, 355,
+ 361, 358, 362, 362, 363, 12, 357, 364, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 359, 360, 361, 361, 364, 365, 365, 354, 12,
- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 12, 12, 12, 12, 362, 12, 12, 12, 12,
- 12, 12, 12, 364, 365, 365, 354, 12, 12, 366,
-
+ 12, 12, 360, 361, 362, 362, 365, 366, 366, 355,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
- 12, 367, 86, 86, 368, 12, 369, 12, 12, 370,
- 12, 12, 12, 12, 12, 371, 372, 366, 372, 12,
- 12, 354, 86, 12, 12, 12, 373, 12, 12, 12,
- 374, 375, 367, 375, 86, 86, 376, 377, 368, 377,
- 378, 379, 369, 379, 12, 380, 381, 370, 381, 12,
- 12, 382, 12, 12, 371, 372, 372, 383, 383, 12,
- 354, 86, 86, 86, 12, 12, 12, 384, 385, 373,
- 385, 12, 12, 386, 374, 375, 375, 387, 387, 86,
- 86, 376, 377, 377, 388, 388, 378, 379, 379, 389,
-
- 389, 12, 380, 381, 381, 390, 390, 12, 12, 391,
- 354, 392, 86, 12, 86, 86, 86, 12, 86, 12,
- 384, 385, 385, 393, 393, 394, 86, 395, 396, 386,
- 396, 86, 86, 397, 12, 398, 391, 354, 399, 354,
- 86, 400, 12, 86, 86, 86, 401, 86, 354, 402,
- 354, 86, 395, 396, 396, 403, 403, 354, 86, 404,
- 354, 405, 406, 406, 399, 354, 86, 407, 354, 12,
- 86, 86, 86, 408, 354, 408, 408, 86, 402, 354,
- 86, 86, 404, 354, 409, 410, 405, 410, 406, 86,
- 407, 354, 12, 86, 411, 412, 408, 354, 408, 408,
-
- 86, 86, 86, 409, 410, 410, 413, 413, 86, 12,
- 86, 414, 354, 415, 354, 408, 408, 86, 86, 354,
- 416, 417, 418, 414, 354, 415, 354, 408, 408, 86,
- 419, 420, 354, 421, 354, 422, 354, 408, 354, 86,
- 423, 354, 420, 354, 421, 354, 422, 354, 354, 86,
- 423, 354, 354, 0, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
-
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354
+ 12, 12, 12, 12, 12, 12, 363, 12, 12, 12,
+ 12, 12, 12, 12, 365, 366, 366, 355, 12, 12,
+
+ 367, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 368, 87, 87, 369, 12, 370, 12, 12,
+ 371, 12, 12, 12, 12, 12, 372, 373, 367, 373,
+ 12, 12, 355, 87, 12, 12, 12, 374, 12, 12,
+ 12, 375, 376, 368, 376, 87, 87, 377, 378, 369,
+ 378, 379, 380, 370, 380, 12, 381, 382, 371, 382,
+ 12, 12, 383, 12, 12, 372, 373, 373, 384, 384,
+ 12, 355, 87, 87, 87, 12, 12, 12, 385, 386,
+ 374, 386, 12, 12, 387, 375, 376, 376, 388, 388,
+ 87, 87, 377, 378, 378, 389, 389, 379, 380, 380,
+
+ 390, 390, 12, 381, 382, 382, 391, 391, 12, 12,
+ 392, 355, 393, 87, 12, 87, 87, 87, 12, 87,
+ 12, 385, 386, 386, 394, 394, 395, 87, 396, 397,
+ 387, 397, 87, 87, 398, 12, 399, 392, 355, 400,
+ 355, 87, 401, 12, 87, 87, 87, 402, 87, 355,
+ 403, 355, 87, 396, 397, 397, 404, 404, 355, 87,
+ 405, 355, 406, 407, 407, 400, 355, 87, 408, 355,
+ 12, 87, 87, 87, 409, 355, 409, 409, 87, 403,
+ 355, 87, 87, 405, 355, 410, 411, 406, 411, 407,
+ 87, 408, 355, 12, 87, 412, 413, 409, 355, 409,
+
+ 409, 87, 87, 87, 410, 411, 411, 414, 414, 87,
+ 12, 87, 415, 355, 416, 355, 409, 409, 87, 87,
+ 355, 417, 418, 419, 415, 355, 416, 355, 409, 409,
+ 87, 420, 421, 355, 422, 355, 423, 355, 409, 355,
+ 87, 424, 355, 421, 355, 422, 355, 423, 355, 355,
+ 87, 424, 355, 355, 0, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355
} ;
-static yyconst flex_int16_t yy_nxt[940] =
+static yyconst flex_uint16_t yy_nxt[943] =
{ 0,
6, 7, 8, 9, 6, 6, 6, 6, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 17, 17,
17, 17, 20, 17, 21, 22, 23, 24, 25, 17,
26, 17, 17, 17, 32, 32, 33, 32, 32, 33,
36, 34, 36, 42, 34, 29, 29, 29, 30, 35,
- 50, 36, 37, 38, 43, 44, 39, 36, 79, 45,
+ 50, 36, 37, 38, 43, 44, 39, 36, 80, 45,
36, 36, 40, 29, 29, 29, 30, 35, 46, 48,
37, 38, 41, 47, 36, 49, 36, 53, 36, 36,
- 36, 56, 58, 36, 36, 55, 82, 60, 51, 342,
- 54, 61, 52, 29, 64, 32, 32, 33, 36, 65,
-
- 70, 36, 34, 29, 29, 29, 30, 36, 36, 36,
- 29, 38, 66, 66, 66, 67, 66, 71, 74, 66,
- 68, 72, 36, 36, 73, 36, 77, 78, 36, 76,
- 36, 53, 36, 36, 75, 85, 80, 83, 36, 86,
- 84, 36, 36, 36, 36, 81, 36, 36, 36, 36,
- 36, 36, 93, 89, 337, 98, 88, 29, 64, 101,
- 90, 36, 91, 65, 92, 87, 29, 95, 89, 99,
- 36, 100, 96, 36, 36, 36, 36, 36, 36, 106,
- 105, 85, 36, 36, 102, 36, 107, 36, 103, 36,
- 109, 112, 36, 36, 104, 108, 115, 110, 36, 117,
-
- 36, 36, 36, 335, 36, 36, 122, 111, 29, 29,
- 29, 30, 118, 36, 116, 29, 38, 36, 36, 113,
- 114, 119, 120, 123, 36, 29, 95, 121, 36, 134,
- 131, 96, 130, 36, 125, 124, 126, 126, 66, 127,
- 126, 132, 133, 126, 129, 333, 36, 36, 135, 137,
- 36, 36, 36, 140, 139, 35, 35, 352, 36, 36,
- 85, 141, 141, 66, 142, 141, 160, 145, 141, 144,
- 35, 35, 89, 117, 155, 36, 146, 147, 147, 66,
- 148, 147, 162, 36, 147, 150, 151, 151, 66, 152,
- 151, 36, 36, 151, 154, 120, 161, 36, 156, 156,
-
- 66, 157, 156, 36, 36, 156, 159, 164, 171, 163,
- 29, 166, 29, 168, 36, 36, 167, 170, 169, 35,
- 35, 172, 36, 36, 173, 36, 213, 184, 36, 36,
- 175, 36, 174, 29, 186, 212, 36, 349, 183, 187,
- 177, 176, 178, 178, 66, 179, 178, 182, 348, 178,
- 181, 29, 188, 35, 35, 35, 35, 189, 29, 193,
- 29, 195, 190, 36, 194, 36, 196, 29, 198, 29,
- 200, 191, 36, 199, 36, 201, 219, 29, 204, 29,
- 206, 36, 202, 205, 209, 207, 29, 166, 36, 293,
- 208, 214, 167, 35, 35, 35, 35, 35, 35, 36,
-
- 36, 36, 249, 218, 220, 29, 222, 216, 36, 217,
- 235, 223, 29, 224, 215, 226, 36, 227, 225, 346,
- 35, 35, 36, 228, 228, 66, 229, 228, 29, 186,
- 228, 231, 232, 36, 187, 233, 35, 29, 193, 29,
- 198, 234, 36, 194, 344, 199, 29, 204, 236, 36,
- 35, 241, 205, 242, 36, 35, 35, 270, 35, 35,
- 35, 35, 247, 36, 35, 35, 29, 222, 244, 262,
- 248, 36, 223, 243, 245, 246, 35, 252, 29, 254,
- 29, 256, 258, 342, 255, 259, 257, 35, 35, 339,
- 35, 35, 69, 264, 35, 35, 35, 35, 35, 35,
-
- 267, 35, 35, 275, 35, 35, 35, 35, 271, 35,
- 35, 276, 277, 35, 35, 272, 278, 315, 273, 281,
- 29, 254, 290, 313, 282, 275, 255, 285, 285, 66,
- 286, 285, 35, 35, 285, 288, 295, 298, 296, 35,
- 35, 35, 35, 298, 301, 328, 299, 294, 35, 35,
- 275, 35, 35, 35, 303, 29, 305, 300, 275, 29,
- 307, 306, 35, 35, 302, 308, 337, 36, 35, 35,
- 309, 310, 320, 316, 35, 35, 35, 35, 322, 36,
- 35, 35, 317, 275, 319, 311, 29, 305, 335, 275,
- 318, 321, 306, 323, 35, 35, 35, 35, 330, 329,
-
- 35, 35, 331, 333, 327, 35, 35, 338, 35, 35,
- 353, 340, 35, 35, 350, 325, 275, 315, 35, 35,
+ 36, 56, 59, 57, 36, 55, 36, 61, 51, 83,
+ 54, 62, 52, 29, 65, 32, 32, 33, 36, 66,
+
+ 71, 36, 34, 29, 29, 29, 30, 36, 36, 36,
+ 29, 38, 67, 67, 67, 68, 67, 72, 75, 67,
+ 69, 73, 36, 36, 74, 36, 78, 79, 36, 77,
+ 36, 53, 36, 36, 76, 86, 81, 84, 36, 87,
+ 85, 36, 36, 36, 36, 82, 90, 36, 36, 36,
+ 36, 36, 94, 36, 90, 36, 89, 29, 65, 99,
+ 102, 29, 96, 66, 36, 88, 91, 97, 92, 90,
+ 93, 101, 100, 36, 36, 36, 36, 36, 36, 36,
+ 107, 106, 86, 36, 36, 36, 36, 108, 103, 104,
+ 36, 343, 113, 110, 36, 105, 109, 111, 116, 36,
+
+ 36, 118, 36, 36, 112, 29, 29, 29, 30, 36,
+ 119, 36, 29, 38, 36, 123, 114, 115, 36, 120,
+ 121, 117, 36, 29, 96, 122, 36, 133, 134, 97,
+ 131, 36, 124, 36, 36, 126, 125, 127, 127, 67,
+ 128, 127, 36, 132, 127, 130, 36, 138, 136, 36,
+ 36, 36, 90, 118, 140, 36, 35, 35, 135, 86,
+ 36, 36, 141, 142, 142, 67, 143, 142, 146, 161,
+ 142, 145, 35, 35, 121, 156, 36, 36, 147, 148,
+ 148, 67, 149, 148, 163, 36, 148, 151, 152, 152,
+ 67, 153, 152, 36, 178, 152, 155, 157, 157, 67,
+
+ 158, 157, 36, 36, 157, 160, 162, 165, 29, 167,
+ 36, 164, 29, 169, 168, 172, 36, 36, 170, 36,
+ 185, 36, 36, 171, 35, 35, 173, 338, 36, 174,
+ 36, 176, 184, 213, 36, 336, 177, 175, 179, 179,
+ 67, 180, 179, 29, 187, 179, 182, 183, 209, 188,
+ 29, 189, 35, 35, 35, 35, 190, 29, 194, 29,
+ 196, 191, 36, 195, 36, 197, 29, 199, 29, 201,
+ 192, 263, 200, 36, 202, 214, 29, 205, 29, 207,
+ 36, 203, 206, 210, 208, 29, 167, 36, 35, 35,
+ 215, 168, 35, 35, 35, 35, 36, 220, 36, 250,
+
+ 219, 221, 36, 334, 217, 36, 218, 29, 223, 216,
+ 29, 225, 228, 224, 227, 36, 226, 36, 229, 229,
+ 67, 230, 229, 29, 187, 229, 232, 35, 35, 188,
+ 234, 35, 29, 194, 29, 199, 235, 36, 195, 233,
+ 200, 29, 205, 36, 237, 36, 276, 206, 35, 242,
+ 243, 36, 353, 236, 35, 35, 35, 35, 35, 35,
+ 248, 36, 35, 35, 350, 29, 223, 245, 249, 317,
+ 244, 224, 246, 247, 35, 253, 29, 255, 29, 257,
+ 259, 36, 256, 260, 258, 35, 35, 349, 35, 35,
+ 70, 265, 35, 35, 35, 35, 35, 35, 268, 35,
+
+ 35, 276, 35, 35, 347, 271, 272, 35, 35, 277,
+ 278, 35, 35, 273, 279, 36, 274, 282, 29, 255,
+ 35, 35, 283, 345, 256, 286, 286, 67, 287, 286,
+ 294, 299, 286, 289, 35, 35, 291, 296, 299, 297,
+ 35, 35, 35, 35, 302, 301, 36, 300, 276, 295,
+ 311, 35, 35, 35, 35, 35, 304, 29, 306, 29,
+ 308, 35, 35, 307, 343, 309, 35, 35, 340, 303,
+ 35, 35, 318, 321, 310, 35, 35, 276, 312, 29,
+ 306, 35, 35, 320, 322, 307, 319, 35, 35, 323,
+ 36, 324, 276, 276, 35, 35, 331, 329, 35, 35,
+
+ 332, 316, 314, 35, 35, 338, 35, 35, 330, 341,
+ 354, 339, 35, 35, 351, 336, 334, 328, 35, 35,
27, 27, 27, 27, 29, 29, 29, 31, 31, 31,
- 31, 36, 36, 36, 36, 62, 313, 62, 62, 63,
- 63, 63, 63, 65, 269, 65, 65, 35, 35, 35,
- 35, 69, 69, 261, 69, 94, 94, 94, 94, 96,
- 251, 96, 96, 128, 128, 128, 128, 143, 143, 143,
- 143, 149, 149, 149, 149, 153, 153, 153, 153, 158,
- 158, 158, 158, 165, 165, 165, 165, 167, 298, 167,
- 167, 180, 180, 180, 180, 185, 185, 185, 185, 187,
-
- 292, 187, 187, 192, 192, 192, 192, 194, 240, 194,
- 194, 197, 197, 197, 197, 199, 289, 199, 199, 203,
- 203, 203, 203, 205, 284, 205, 205, 210, 210, 210,
- 210, 169, 280, 169, 169, 221, 221, 221, 221, 223,
- 269, 223, 223, 230, 230, 230, 230, 189, 266, 189,
- 189, 196, 211, 196, 196, 201, 261, 201, 201, 207,
- 251, 207, 207, 237, 237, 237, 237, 239, 239, 239,
- 239, 225, 240, 225, 225, 250, 250, 250, 250, 253,
- 253, 253, 253, 255, 238, 255, 255, 260, 260, 260,
- 260, 263, 263, 263, 263, 265, 265, 265, 265, 268,
-
- 268, 268, 268, 274, 274, 274, 274, 279, 279, 279,
- 279, 257, 211, 257, 257, 283, 283, 283, 283, 287,
- 287, 287, 287, 264, 138, 264, 264, 291, 291, 291,
- 291, 297, 297, 297, 297, 304, 304, 304, 304, 306,
- 136, 306, 306, 312, 312, 312, 312, 314, 314, 314,
- 314, 308, 97, 308, 308, 324, 324, 324, 324, 326,
- 326, 326, 326, 332, 332, 332, 332, 334, 334, 334,
- 334, 336, 336, 336, 336, 341, 341, 341, 341, 343,
- 343, 343, 343, 345, 345, 345, 345, 347, 347, 347,
- 347, 351, 351, 351, 351, 36, 30, 59, 57, 36,
-
- 30, 354, 28, 28, 5, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354
+ 31, 36, 36, 36, 36, 63, 326, 63, 63, 64,
+ 64, 64, 64, 66, 276, 66, 66, 35, 35, 35,
+ 35, 70, 70, 316, 70, 95, 95, 95, 95, 97,
+ 314, 97, 97, 129, 129, 129, 129, 144, 144, 144,
+ 144, 150, 150, 150, 150, 154, 154, 154, 154, 159,
+ 159, 159, 159, 166, 166, 166, 166, 168, 270, 168,
+ 168, 181, 181, 181, 181, 186, 186, 186, 186, 188,
+
+ 262, 188, 188, 193, 193, 193, 193, 195, 252, 195,
+ 195, 198, 198, 198, 198, 200, 299, 200, 200, 204,
+ 204, 204, 204, 206, 293, 206, 206, 211, 211, 211,
+ 211, 170, 241, 170, 170, 222, 222, 222, 222, 224,
+ 290, 224, 224, 231, 231, 231, 231, 190, 285, 190,
+ 190, 197, 281, 197, 197, 202, 270, 202, 202, 208,
+ 267, 208, 208, 238, 238, 238, 238, 240, 240, 240,
+ 240, 226, 212, 226, 226, 251, 251, 251, 251, 254,
+ 254, 254, 254, 256, 262, 256, 256, 261, 261, 261,
+ 261, 264, 264, 264, 264, 266, 266, 266, 266, 269,
+
+ 269, 269, 269, 275, 275, 275, 275, 280, 280, 280,
+ 280, 258, 252, 258, 258, 284, 284, 284, 284, 288,
+ 288, 288, 288, 265, 241, 265, 265, 292, 292, 292,
+ 292, 298, 298, 298, 298, 305, 305, 305, 305, 307,
+ 239, 307, 307, 313, 313, 313, 313, 315, 315, 315,
+ 315, 309, 212, 309, 309, 325, 325, 325, 325, 327,
+ 327, 327, 327, 333, 333, 333, 333, 335, 335, 335,
+ 335, 337, 337, 337, 337, 342, 342, 342, 342, 344,
+ 344, 344, 344, 346, 346, 346, 346, 348, 348, 348,
+ 348, 352, 352, 352, 352, 139, 137, 98, 36, 30,
+
+ 60, 58, 36, 30, 355, 28, 28, 5, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355
} ;
-static yyconst flex_int16_t yy_chk[940] =
+static yyconst flex_int16_t yy_chk[943] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -740,101 +726,102 @@ static yyconst flex_int16_t yy_chk[940] =
18, 14, 11, 11, 13, 14, 11, 46, 46, 14,
15, 16, 11, 12, 12, 12, 12, 12, 14, 16,
12, 12, 12, 15, 19, 16, 20, 20, 21, 22,
- 24, 22, 24, 50, 26, 21, 50, 26, 19, 351,
+ 24, 22, 24, 22, 26, 21, 50, 26, 19, 50,
20, 26, 19, 31, 31, 32, 32, 32, 39, 31,
39, 42, 32, 35, 35, 35, 35, 40, 44, 45,
35, 35, 37, 37, 37, 37, 37, 39, 42, 37,
37, 40, 41, 43, 41, 48, 45, 45, 49, 44,
47, 47, 53, 51, 43, 53, 48, 51, 52, 54,
- 52, 55, 56, 58, 54, 49, 57, 59, 60, 73,
- 61, 70, 60, 61, 347, 70, 56, 63, 63, 73,
- 58, 71, 59, 63, 59, 55, 66, 66, 57, 71,
- 74, 72, 66, 72, 75, 76, 77, 78, 79, 78,
- 77, 79, 80, 81, 74, 83, 80, 82, 75, 84,
- 82, 85, 88, 85, 76, 81, 87, 83, 87, 89,
-
- 92, 89, 93, 345, 90, 104, 92, 84, 86, 86,
- 86, 86, 90, 99, 88, 86, 86, 98, 102, 86,
- 86, 91, 91, 93, 91, 94, 94, 91, 101, 104,
- 102, 94, 101, 110, 99, 98, 100, 100, 100, 100,
- 100, 103, 103, 100, 100, 343, 105, 103, 105, 107,
- 109, 107, 111, 110, 109, 113, 113, 341, 121, 118,
- 111, 112, 112, 112, 112, 112, 121, 113, 112, 112,
- 114, 114, 116, 116, 118, 116, 114, 115, 115, 115,
- 115, 115, 123, 123, 115, 115, 117, 117, 117, 117,
- 117, 124, 122, 117, 117, 119, 122, 119, 120, 120,
-
- 120, 120, 120, 125, 130, 120, 120, 125, 131, 124,
- 126, 126, 128, 128, 131, 134, 126, 130, 128, 133,
- 133, 133, 135, 136, 133, 139, 164, 140, 138, 140,
- 134, 164, 133, 141, 141, 163, 163, 338, 139, 141,
- 136, 135, 137, 137, 137, 137, 137, 138, 336, 137,
- 137, 143, 143, 145, 145, 146, 146, 143, 147, 147,
- 149, 149, 145, 155, 147, 161, 149, 151, 151, 153,
- 153, 146, 160, 151, 270, 153, 176, 156, 156, 158,
- 158, 176, 155, 156, 161, 158, 165, 165, 170, 270,
- 160, 170, 165, 172, 172, 173, 173, 174, 174, 175,
-
- 208, 177, 220, 175, 177, 178, 178, 173, 220, 174,
- 208, 178, 180, 180, 172, 182, 182, 183, 180, 334,
- 190, 190, 183, 184, 184, 184, 184, 184, 185, 185,
- 184, 184, 190, 243, 185, 191, 191, 192, 192, 197,
- 197, 202, 202, 192, 332, 197, 203, 203, 209, 209,
- 213, 213, 203, 214, 214, 215, 215, 243, 216, 216,
- 217, 217, 218, 218, 219, 219, 221, 221, 215, 235,
- 219, 235, 221, 214, 216, 217, 227, 227, 228, 228,
- 230, 230, 232, 331, 228, 233, 230, 233, 233, 329,
- 232, 232, 236, 236, 241, 241, 244, 244, 245, 245,
-
- 241, 246, 246, 247, 248, 248, 267, 267, 244, 259,
- 259, 247, 247, 252, 252, 245, 248, 326, 246, 252,
- 253, 253, 267, 324, 259, 316, 253, 262, 262, 262,
- 262, 262, 271, 271, 262, 262, 272, 276, 273, 272,
- 272, 273, 273, 277, 278, 316, 276, 271, 281, 281,
- 299, 278, 278, 282, 282, 285, 285, 277, 300, 287,
- 287, 285, 290, 290, 281, 287, 323, 293, 294, 294,
- 290, 293, 303, 299, 301, 301, 302, 302, 310, 310,
- 303, 303, 300, 317, 302, 294, 304, 304, 322, 328,
- 301, 309, 304, 311, 309, 309, 311, 311, 318, 317,
-
- 318, 318, 319, 321, 314, 319, 319, 328, 330, 330,
- 350, 330, 340, 340, 340, 312, 297, 296, 350, 350,
- 355, 355, 355, 355, 356, 356, 356, 357, 357, 357,
- 357, 358, 358, 358, 358, 359, 295, 359, 359, 360,
- 360, 360, 360, 361, 291, 361, 361, 362, 362, 362,
- 362, 363, 363, 283, 363, 364, 364, 364, 364, 365,
- 279, 365, 365, 366, 366, 366, 366, 367, 367, 367,
- 367, 368, 368, 368, 368, 369, 369, 369, 369, 370,
- 370, 370, 370, 371, 371, 371, 371, 372, 274, 372,
- 372, 373, 373, 373, 373, 374, 374, 374, 374, 375,
-
- 268, 375, 375, 376, 376, 376, 376, 377, 265, 377,
- 377, 378, 378, 378, 378, 379, 263, 379, 379, 380,
- 380, 380, 380, 381, 260, 381, 381, 382, 382, 382,
- 382, 383, 250, 383, 383, 384, 384, 384, 384, 385,
- 242, 385, 385, 386, 386, 386, 386, 387, 239, 387,
- 387, 388, 237, 388, 388, 389, 234, 389, 389, 390,
- 226, 390, 390, 391, 391, 391, 391, 392, 392, 392,
- 392, 393, 212, 393, 393, 394, 394, 394, 394, 395,
- 395, 395, 395, 396, 210, 396, 396, 397, 397, 397,
- 397, 398, 398, 398, 398, 399, 399, 399, 399, 400,
-
- 400, 400, 400, 401, 401, 401, 401, 402, 402, 402,
- 402, 403, 162, 403, 403, 404, 404, 404, 404, 405,
- 405, 405, 405, 406, 108, 406, 406, 407, 407, 407,
- 407, 408, 408, 408, 408, 409, 409, 409, 409, 410,
- 106, 410, 410, 411, 411, 411, 411, 412, 412, 412,
- 412, 413, 69, 413, 413, 414, 414, 414, 414, 415,
- 415, 415, 415, 416, 416, 416, 416, 417, 417, 417,
- 417, 418, 418, 418, 418, 419, 419, 419, 419, 420,
- 420, 420, 420, 421, 421, 421, 421, 422, 422, 422,
- 422, 423, 423, 423, 423, 36, 29, 25, 23, 17,
-
- 6, 5, 4, 3, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354, 354,
- 354, 354, 354, 354, 354, 354, 354, 354, 354
+ 52, 55, 56, 57, 54, 49, 57, 58, 61, 59,
+ 74, 62, 61, 60, 62, 71, 56, 64, 64, 71,
+ 74, 67, 67, 64, 72, 55, 59, 67, 60, 58,
+ 60, 73, 72, 73, 75, 76, 77, 78, 79, 80,
+ 79, 78, 80, 81, 82, 84, 85, 81, 75, 76,
+ 83, 352, 86, 83, 86, 77, 82, 84, 88, 89,
+
+ 88, 90, 91, 90, 85, 87, 87, 87, 87, 93,
+ 91, 94, 87, 87, 100, 93, 87, 87, 99, 92,
+ 92, 89, 92, 95, 95, 92, 102, 104, 104, 95,
+ 102, 103, 94, 104, 105, 100, 99, 101, 101, 101,
+ 101, 101, 111, 103, 101, 101, 106, 108, 106, 108,
+ 110, 112, 117, 117, 110, 117, 114, 114, 105, 112,
+ 119, 122, 111, 113, 113, 113, 113, 113, 114, 122,
+ 113, 113, 115, 115, 120, 119, 120, 137, 115, 116,
+ 116, 116, 116, 116, 124, 124, 116, 116, 118, 118,
+ 118, 118, 118, 125, 137, 118, 118, 121, 121, 121,
+
+ 121, 121, 123, 126, 121, 121, 123, 126, 127, 127,
+ 131, 125, 129, 129, 127, 132, 135, 136, 129, 140,
+ 141, 132, 141, 131, 134, 134, 134, 348, 139, 134,
+ 161, 135, 140, 164, 164, 346, 136, 134, 138, 138,
+ 138, 138, 138, 142, 142, 138, 138, 139, 161, 142,
+ 144, 144, 146, 146, 147, 147, 144, 148, 148, 150,
+ 150, 146, 156, 148, 162, 150, 152, 152, 154, 154,
+ 147, 236, 152, 236, 154, 165, 157, 157, 159, 159,
+ 165, 156, 157, 162, 159, 166, 166, 171, 173, 173,
+ 171, 166, 174, 174, 175, 175, 176, 177, 178, 221,
+
+ 176, 178, 177, 344, 174, 221, 175, 179, 179, 173,
+ 181, 181, 184, 179, 183, 183, 181, 184, 185, 185,
+ 185, 185, 185, 186, 186, 185, 185, 191, 191, 186,
+ 192, 192, 193, 193, 198, 198, 203, 203, 193, 191,
+ 198, 204, 204, 209, 210, 210, 300, 204, 214, 214,
+ 215, 215, 342, 209, 216, 216, 217, 217, 218, 218,
+ 219, 219, 220, 220, 339, 222, 222, 216, 220, 300,
+ 215, 222, 217, 218, 228, 228, 229, 229, 231, 231,
+ 233, 244, 229, 234, 231, 234, 234, 337, 233, 233,
+ 237, 237, 242, 242, 245, 245, 246, 246, 242, 247,
+
+ 247, 248, 249, 249, 335, 244, 245, 260, 260, 248,
+ 248, 253, 253, 246, 249, 271, 247, 253, 254, 254,
+ 268, 268, 260, 333, 254, 263, 263, 263, 263, 263,
+ 271, 278, 263, 263, 272, 272, 268, 273, 277, 274,
+ 273, 273, 274, 274, 279, 278, 294, 277, 301, 272,
+ 294, 279, 279, 282, 282, 283, 283, 286, 286, 288,
+ 288, 295, 295, 286, 332, 288, 291, 291, 330, 282,
+ 302, 302, 301, 304, 291, 303, 303, 317, 295, 305,
+ 305, 304, 304, 303, 310, 305, 302, 310, 310, 311,
+ 311, 312, 318, 329, 312, 312, 319, 317, 319, 319,
+
+ 320, 327, 325, 320, 320, 324, 331, 331, 318, 331,
+ 351, 329, 341, 341, 341, 323, 322, 315, 351, 351,
+ 356, 356, 356, 356, 357, 357, 357, 358, 358, 358,
+ 358, 359, 359, 359, 359, 360, 313, 360, 360, 361,
+ 361, 361, 361, 362, 298, 362, 362, 363, 363, 363,
+ 363, 364, 364, 297, 364, 365, 365, 365, 365, 366,
+ 296, 366, 366, 367, 367, 367, 367, 368, 368, 368,
+ 368, 369, 369, 369, 369, 370, 370, 370, 370, 371,
+ 371, 371, 371, 372, 372, 372, 372, 373, 292, 373,
+ 373, 374, 374, 374, 374, 375, 375, 375, 375, 376,
+
+ 284, 376, 376, 377, 377, 377, 377, 378, 280, 378,
+ 378, 379, 379, 379, 379, 380, 275, 380, 380, 381,
+ 381, 381, 381, 382, 269, 382, 382, 383, 383, 383,
+ 383, 384, 266, 384, 384, 385, 385, 385, 385, 386,
+ 264, 386, 386, 387, 387, 387, 387, 388, 261, 388,
+ 388, 389, 251, 389, 389, 390, 243, 390, 390, 391,
+ 240, 391, 391, 392, 392, 392, 392, 393, 393, 393,
+ 393, 394, 238, 394, 394, 395, 395, 395, 395, 396,
+ 396, 396, 396, 397, 235, 397, 397, 398, 398, 398,
+ 398, 399, 399, 399, 399, 400, 400, 400, 400, 401,
+
+ 401, 401, 401, 402, 402, 402, 402, 403, 403, 403,
+ 403, 404, 227, 404, 404, 405, 405, 405, 405, 406,
+ 406, 406, 406, 407, 213, 407, 407, 408, 408, 408,
+ 408, 409, 409, 409, 409, 410, 410, 410, 410, 411,
+ 211, 411, 411, 412, 412, 412, 412, 413, 413, 413,
+ 413, 414, 163, 414, 414, 415, 415, 415, 415, 416,
+ 416, 416, 416, 417, 417, 417, 417, 418, 418, 418,
+ 418, 419, 419, 419, 419, 420, 420, 420, 420, 421,
+ 421, 421, 421, 422, 422, 422, 422, 423, 423, 423,
+ 423, 424, 424, 424, 424, 109, 107, 70, 36, 29,
+
+ 25, 23, 17, 6, 5, 4, 3, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355, 355, 355, 355, 355, 355, 355, 355, 355,
+ 355, 355
} ;
#define YY_TRAILING_MASK 0x2000
@@ -953,6 +940,7 @@ static void setformat(DiskParseContext *dpc, const char *str) {
else if (!strcmp(str,"qcow2")) DSET(dpc,format,FORMAT,str,QCOW2);
else if (!strcmp(str,"vhd")) DSET(dpc,format,FORMAT,str,VHD);
else if (!strcmp(str,"empty")) DSET(dpc,format,FORMAT,str,EMPTY);
+ else if (!strcmp(str,"qed")) DSET(dpc,format,FORMAT,str,QED);
else xlu__disk_err(dpc,str,"unknown value for format");
}
@@ -1001,7 +989,7 @@ static int vdev_and_devtype(DiskParseContext *dpc, char *str) {
#define DPC ((DiskParseContext*)yyextra)
-#line 1005 "libxlu_disk_l.c"
+#line 993 "libxlu_disk_l.c"
#define INITIAL 0
#define LEXERR 1
@@ -1031,8 +1019,8 @@ struct yyguts_t
size_t yy_buffer_stack_max; /**< capacity of stack. */
YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
char yy_hold_char;
- yy_size_t yy_n_chars;
- yy_size_t yyleng_r;
+ int yy_n_chars;
+ int yyleng_r;
char *yy_c_buf_p;
int yy_init;
int yy_start;
@@ -1084,23 +1072,23 @@ void xlu__disk_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
FILE *xlu__disk_yyget_in (yyscan_t yyscanner );
-void xlu__disk_yyset_in (FILE * in_str ,yyscan_t yyscanner );
+void xlu__disk_yyset_in (FILE * _in_str ,yyscan_t yyscanner );
FILE *xlu__disk_yyget_out (yyscan_t yyscanner );
-void xlu__disk_yyset_out (FILE * out_str ,yyscan_t yyscanner );
+void xlu__disk_yyset_out (FILE * _out_str ,yyscan_t yyscanner );
-yy_size_t xlu__disk_yyget_leng (yyscan_t yyscanner );
+ int xlu__disk_yyget_leng (yyscan_t yyscanner );
char *xlu__disk_yyget_text (yyscan_t yyscanner );
int xlu__disk_yyget_lineno (yyscan_t yyscanner );
-void xlu__disk_yyset_lineno (int line_number ,yyscan_t yyscanner );
+void xlu__disk_yyset_lineno (int _line_number ,yyscan_t yyscanner );
int xlu__disk_yyget_column (yyscan_t yyscanner );
-void xlu__disk_yyset_column (int column_no ,yyscan_t yyscanner );
+void xlu__disk_yyset_column (int _column_no ,yyscan_t yyscanner );
/* Macros after this point can all be overridden by user definitions in
* section 1.
@@ -1114,6 +1102,10 @@ extern int xlu__disk_yywrap (yyscan_t yyscanner );
#endif
#endif
+#ifndef YY_NO_UNPUT
+
+#endif
+
#ifndef yytext_ptr
static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
#endif
@@ -1147,7 +1139,7 @@ static int input (yyscan_t yyscanner );
/* This used to be an fputs(), but since the string might contain NUL's,
* we now use fwrite().
*/
-#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
#endif
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
@@ -1158,7 +1150,7 @@ static int input (yyscan_t yyscanner );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
- int n; \
+ size_t n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
@@ -1171,7 +1163,7 @@ static int input (yyscan_t yyscanner );
else \
{ \
errno=0; \
- while ( (result = fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
{ \
if( errno != EINTR) \
{ \
@@ -1226,7 +1218,7 @@ extern int xlu__disk_yylex (yyscan_t yyscanner);
/* Code executed at the end of each rule. */
#ifndef YY_BREAK
-#define YY_BREAK break;
+#define YY_BREAK /*LINTED*/break;
#endif
#define YY_RULE_SETUP \
@@ -1236,9 +1228,9 @@ extern int xlu__disk_yylex (yyscan_t yyscanner);
*/
YY_DECL
{
- register yy_state_type yy_current_state;
- register char *yy_cp, *yy_bp;
- register int yy_act;
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
if ( !yyg->yy_init )
@@ -1274,14 +1266,14 @@ YY_DECL
}
{
-#line 165 "libxlu_disk_l.l"
+#line 166 "libxlu_disk_l.l"
/*----- the scanner rules which do the parsing -----*/
-#line 1283 "libxlu_disk_l.c"
+#line 1275 "libxlu_disk_l.c"
- while ( 1 ) /* loops until end-of-file is reached */
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
yyg->yy_more_len = 0;
if ( yyg->yy_more_flag )
@@ -1307,18 +1299,18 @@ YY_DECL
yy_match:
do
{
- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+ YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
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 >= 355 )
+ if ( yy_current_state >= 356 )
yy_c = yy_meta[(unsigned int) yy_c];
}
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
*yyg->yy_state_ptr++ = yy_current_state;
++yy_cp;
}
- while ( yy_current_state != 354 );
+ while ( yy_current_state != 355 );
yy_find_action:
yy_current_state = *--yyg->yy_state_ptr;
@@ -1368,135 +1360,135 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
/* rule 1 can match eol */
YY_RULE_SETUP
-#line 169 "libxlu_disk_l.l"
+#line 170 "libxlu_disk_l.l"
{ /* ignore whitespace before parameters */ }
YY_BREAK
/* ordinary parameters setting enums or strings */
case 2:
/* rule 2 can match eol */
YY_RULE_SETUP
-#line 173 "libxlu_disk_l.l"
+#line 174 "libxlu_disk_l.l"
{ STRIP(','); setformat(DPC, FROMEQUALS); }
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 175 "libxlu_disk_l.l"
+#line 176 "libxlu_disk_l.l"
{ DPC->disk->is_cdrom = 1; }
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 176 "libxlu_disk_l.l"
+#line 177 "libxlu_disk_l.l"
{ DPC->disk->is_cdrom = 1; }
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 177 "libxlu_disk_l.l"
+#line 178 "libxlu_disk_l.l"
{ DPC->disk->is_cdrom = 0; }
YY_BREAK
case 6:
/* rule 6 can match eol */
YY_RULE_SETUP
-#line 178 "libxlu_disk_l.l"
+#line 179 "libxlu_disk_l.l"
{ xlu__disk_err(DPC,yytext,"unknown value for type"); }
YY_BREAK
case 7:
/* rule 7 can match eol */
YY_RULE_SETUP
-#line 180 "libxlu_disk_l.l"
+#line 181 "libxlu_disk_l.l"
{ STRIP(','); setaccess(DPC, FROMEQUALS); }
YY_BREAK
case 8:
/* rule 8 can match eol */
YY_RULE_SETUP
-#line 181 "libxlu_disk_l.l"
+#line 182 "libxlu_disk_l.l"
{ STRIP(','); SAVESTRING("backend", backend_domname, FROMEQUALS); }
YY_BREAK
case 9:
/* rule 9 can match eol */
YY_RULE_SETUP
-#line 182 "libxlu_disk_l.l"
+#line 183 "libxlu_disk_l.l"
{ STRIP(','); setbackendtype(DPC,FROMEQUALS); }
YY_BREAK
case 10:
/* rule 10 can match eol */
YY_RULE_SETUP
-#line 184 "libxlu_disk_l.l"
+#line 185 "libxlu_disk_l.l"
{ STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
YY_BREAK
case 11:
/* rule 11 can match eol */
YY_RULE_SETUP
-#line 185 "libxlu_disk_l.l"
+#line 186 "libxlu_disk_l.l"
{ STRIP(','); SAVESTRING("script", script, FROMEQUALS); }
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 186 "libxlu_disk_l.l"
+#line 187 "libxlu_disk_l.l"
{ DPC->disk->direct_io_safe = 1; }
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 187 "libxlu_disk_l.l"
+#line 188 "libxlu_disk_l.l"
{ libxl_defbool_set(&DPC->disk->discard_enable, true); }
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 188 "libxlu_disk_l.l"
+#line 189 "libxlu_disk_l.l"
{ libxl_defbool_set(&DPC->disk->discard_enable, false); }
YY_BREAK
/* Note that the COLO configuration settings should be considered unstable.
* They may change incompatibly in future versions of Xen. */
case 15:
YY_RULE_SETUP
-#line 191 "libxlu_disk_l.l"
+#line 192 "libxlu_disk_l.l"
{ libxl_defbool_set(&DPC->disk->colo_enable, true); }
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 192 "libxlu_disk_l.l"
+#line 193 "libxlu_disk_l.l"
{ libxl_defbool_set(&DPC->disk->colo_enable, false); }
YY_BREAK
case 17:
/* rule 17 can match eol */
YY_RULE_SETUP
-#line 193 "libxlu_disk_l.l"
+#line 194 "libxlu_disk_l.l"
{ STRIP(','); SAVESTRING("colo-host", colo_host, FROMEQUALS); }
YY_BREAK
case 18:
/* rule 18 can match eol */
YY_RULE_SETUP
-#line 194 "libxlu_disk_l.l"
+#line 195 "libxlu_disk_l.l"
{ STRIP(','); setcoloport(DPC, FROMEQUALS); }
YY_BREAK
case 19:
/* rule 19 can match eol */
YY_RULE_SETUP
-#line 195 "libxlu_disk_l.l"
+#line 196 "libxlu_disk_l.l"
{ STRIP(','); SAVESTRING("colo-export", colo_export, FROMEQUALS); }
YY_BREAK
case 20:
/* rule 20 can match eol */
YY_RULE_SETUP
-#line 196 "libxlu_disk_l.l"
+#line 197 "libxlu_disk_l.l"
{ STRIP(','); SAVESTRING("active-disk", active_disk, FROMEQUALS); }
YY_BREAK
case 21:
/* rule 21 can match eol */
YY_RULE_SETUP
-#line 197 "libxlu_disk_l.l"
+#line 198 "libxlu_disk_l.l"
{ STRIP(','); SAVESTRING("hidden-disk", hidden_disk, FROMEQUALS); }
YY_BREAK
/* the target magic parameter, eats the rest of the string */
case 22:
YY_RULE_SETUP
-#line 201 "libxlu_disk_l.l"
+#line 202 "libxlu_disk_l.l"
{ STRIP(','); SAVESTRING("target", pdev_path, FROMEQUALS); }
YY_BREAK
/* unknown parameters */
case 23:
/* rule 23 can match eol */
YY_RULE_SETUP
-#line 205 "libxlu_disk_l.l"
+#line 206 "libxlu_disk_l.l"
{ xlu__disk_err(DPC,yytext,"unknown parameter"); }
YY_BREAK
/* deprecated prefixes */
@@ -1504,7 +1496,7 @@ YY_RULE_SETUP
* matched the whole string, so these patterns take precedence */
case 24:
YY_RULE_SETUP
-#line 212 "libxlu_disk_l.l"
+#line 213 "libxlu_disk_l.l"
{
STRIP(':');
DPC->had_depr_prefix=1; DEPRECATE("use `[format=]...,'");
@@ -1513,7 +1505,7 @@ YY_RULE_SETUP
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 218 "libxlu_disk_l.l"
+#line 219 "libxlu_disk_l.l"
{
char *newscript;
STRIP(':');
@@ -1532,12 +1524,12 @@ case 26:
yyg->yy_c_buf_p = yy_cp = yy_bp + 8;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 231 "libxlu_disk_l.l"
+#line 232 "libxlu_disk_l.l"
{ DPC->had_depr_prefix=1; DEPRECATE(0); }
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 232 "libxlu_disk_l.l"
+#line 233 "libxlu_disk_l.l"
{ DPC->had_depr_prefix=1; DEPRECATE(0); }
YY_BREAK
case 28:
@@ -1545,7 +1537,7 @@ case 28:
yyg->yy_c_buf_p = yy_cp = yy_bp + 4;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 233 "libxlu_disk_l.l"
+#line 234 "libxlu_disk_l.l"
{ DPC->had_depr_prefix=1; DEPRECATE(0); }
YY_BREAK
case 29:
@@ -1553,7 +1545,7 @@ case 29:
yyg->yy_c_buf_p = yy_cp = yy_bp + 6;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 234 "libxlu_disk_l.l"
+#line 235 "libxlu_disk_l.l"
{ DPC->had_depr_prefix=1; DEPRECATE(0); }
YY_BREAK
case 30:
@@ -1561,7 +1553,7 @@ case 30:
yyg->yy_c_buf_p = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 235 "libxlu_disk_l.l"
+#line 236 "libxlu_disk_l.l"
{ DPC->had_depr_prefix=1; DEPRECATE(0); }
YY_BREAK
case 31:
@@ -1569,13 +1561,13 @@ case 31:
yyg->yy_c_buf_p = yy_cp = yy_bp + 4;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
-#line 236 "libxlu_disk_l.l"
+#line 237 "libxlu_disk_l.l"
{ DPC->had_depr_prefix=1; DEPRECATE(0); }
YY_BREAK
case 32:
/* rule 32 can match eol */
YY_RULE_SETUP
-#line 238 "libxlu_disk_l.l"
+#line 239 "libxlu_disk_l.l"
{
xlu__disk_err(DPC,yytext,"unknown deprecated disk prefix");
return 0;
@@ -1585,7 +1577,7 @@ YY_RULE_SETUP
case 33:
/* rule 33 can match eol */
YY_RULE_SETUP
-#line 245 "libxlu_disk_l.l"
+#line 246 "libxlu_disk_l.l"
{
STRIP(',');
@@ -1614,7 +1606,7 @@ YY_RULE_SETUP
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 271 "libxlu_disk_l.l"
+#line 272 "libxlu_disk_l.l"
{
BEGIN(LEXERR);
yymore();
@@ -1622,17 +1614,17 @@ YY_RULE_SETUP
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 275 "libxlu_disk_l.l"
+#line 276 "libxlu_disk_l.l"
{
xlu__disk_err(DPC,yytext,"bad disk syntax"); return 0;
}
YY_BREAK
case 36:
YY_RULE_SETUP
-#line 278 "libxlu_disk_l.l"
+#line 279 "libxlu_disk_l.l"
YY_FATAL_ERROR( "flex scanner jammed" );
YY_BREAK
-#line 1636 "libxlu_disk_l.c"
+#line 1628 "libxlu_disk_l.c"
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(LEXERR):
yyterminate();
@@ -1777,9 +1769,9 @@ YY_FATAL_ERROR( "flex scanner jammed" );
static int yy_get_next_buffer (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
- register char *source = yyg->yytext_ptr;
- register int number_to_move, i;
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = yyg->yytext_ptr;
+ yy_size_t number_to_move, i;
int ret_val;
if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
@@ -1808,7 +1800,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
/* Try to read more data. */
/* First move last chars to start of buffer. */
- number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
+ number_to_move = (yy_size_t) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
for ( i = 0; i < number_to_move; ++i )
*(dest++) = *(source++);
@@ -1861,9 +1853,9 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
else
ret_val = EOB_ACT_CONTINUE_SCAN;
- if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ if ((int) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
/* Extend the array by 50%, plus the number we really need. */
- yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) xlu__disk_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
@@ -1882,8 +1874,8 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
{
- register yy_state_type yy_current_state;
- register char *yy_cp;
+ yy_state_type yy_current_state;
+ char *yy_cp;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yy_current_state = yyg->yy_start;
@@ -1893,14 +1885,14 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
{
- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
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 >= 355 )
+ if ( yy_current_state >= 356 )
yy_c = yy_meta[(unsigned int) yy_c];
}
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
*yyg->yy_state_ptr++ = yy_current_state;
}
@@ -1914,18 +1906,18 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
*/
static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner)
{
- register int yy_is_jam;
+ int yy_is_jam;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
- register YY_CHAR yy_c = 1;
+ YY_CHAR yy_c = 1;
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 >= 355 )
+ if ( yy_current_state >= 356 )
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 == 354);
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c];
+ yy_is_jam = (yy_current_state == 355);
if ( ! yy_is_jam )
*yyg->yy_state_ptr++ = yy_current_state;
@@ -1933,6 +1925,10 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
return yy_is_jam ? 0 : yy_current_state;
}
+#ifndef YY_NO_UNPUT
+
+#endif
+
#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput (yyscan_t yyscanner)
@@ -1958,7 +1954,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
else
{ /* need more input */
- yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
+ int offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
++yyg->yy_c_buf_p;
switch ( yy_get_next_buffer( yyscanner ) )
@@ -1982,7 +1978,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
case EOB_ACT_END_OF_FILE:
{
if ( xlu__disk_yywrap(yyscanner ) )
- return EOF;
+ return 0;
if ( ! yyg->yy_did_buffer_switch_on_eof )
YY_NEW_FILE;
@@ -2086,7 +2082,7 @@ static void xlu__disk_yy_load_buffer_state (yyscan_t yyscanner)
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in xlu__disk_yy_create_buffer()" );
- b->yy_buf_size = size;
+ b->yy_buf_size = (yy_size_t)size;
/* yy_ch_buf has to be 2 characters longer than the size given because
* we need to put in 2 end-of-buffer characters.
@@ -2238,7 +2234,7 @@ void xlu__disk_yypop_buffer_state (yyscan_t yyscanner)
*/
static void xlu__disk_yyensure_buffer_stack (yyscan_t yyscanner)
{
- yy_size_t num_to_alloc;
+ int num_to_alloc;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
if (!yyg->yy_buffer_stack) {
@@ -2247,7 +2243,7 @@ static void xlu__disk_yyensure_buffer_stack (yyscan_t yyscanner)
* scanner will even need a stack. We use 2 instead of 1 to avoid an
* immediate realloc on the next call.
*/
- num_to_alloc = 1;
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
yyg->yy_buffer_stack = (struct yy_buffer_state**)xlu__disk_yyalloc
(num_to_alloc * sizeof(struct yy_buffer_state*)
, yyscanner);
@@ -2264,7 +2260,7 @@ static void xlu__disk_yyensure_buffer_stack (yyscan_t yyscanner)
if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
/* Increase the buffer to prepare for a possible push. */
- int grow_size = 8 /* arbitrary grow size */;
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
yyg->yy_buffer_stack = (struct yy_buffer_state**)xlu__disk_yyrealloc
@@ -2294,7 +2290,7 @@ YY_BUFFER_STATE xlu__disk_yy_scan_buffer (char * base, yy_size_t size , yyscan
base[size-2] != YY_END_OF_BUFFER_CHAR ||
base[size-1] != YY_END_OF_BUFFER_CHAR )
/* They forgot to leave room for the EOB's. */
- return 0;
+ return NULL;
b = (YY_BUFFER_STATE) xlu__disk_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
if ( ! b )
@@ -2303,7 +2299,7 @@ YY_BUFFER_STATE xlu__disk_yy_scan_buffer (char * base, yy_size_t size , yyscan
b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
b->yy_buf_pos = b->yy_ch_buf = base;
b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
+ b->yy_input_file = NULL;
b->yy_n_chars = b->yy_buf_size;
b->yy_is_interactive = 0;
b->yy_at_bol = 1;
@@ -2326,7 +2322,7 @@ YY_BUFFER_STATE xlu__disk_yy_scan_buffer (char * base, yy_size_t size , yyscan
YY_BUFFER_STATE xlu__disk_yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
{
- return xlu__disk_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner);
+ return xlu__disk_yy_scan_bytes(yystr,(int) strlen(yystr) ,yyscanner);
}
/** Setup the input buffer state to scan the given bytes. The next call to xlu__disk_yylex() will
@@ -2336,7 +2332,7 @@ YY_BUFFER_STATE xlu__disk_yy_scan_string (yyconst char * yystr , yyscan_t yyscan
* @param yyscanner The scanner object.
* @return the newly allocated buffer state object.
*/
-YY_BUFFER_STATE xlu__disk_yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner)
+YY_BUFFER_STATE xlu__disk_yy_scan_bytes (yyconst char * yybytes, int _yybytes_len , yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
char *buf;
@@ -2344,7 +2340,7 @@ YY_BUFFER_STATE xlu__disk_yy_scan_bytes (yyconst char * yybytes, yy_size_t _yy
yy_size_t i;
/* Get memory for full buffer, including space for trailing EOB's. */
- n = _yybytes_len + 2;
+ n = (yy_size_t) _yybytes_len + 2;
buf = (char *) xlu__disk_yyalloc(n ,yyscanner );
if ( ! buf )
YY_FATAL_ERROR( "out of dynamic memory in xlu__disk_yy_scan_bytes()" );
@@ -2370,9 +2366,11 @@ YY_BUFFER_STATE xlu__disk_yy_scan_bytes (yyconst char * yybytes, yy_size_t _yy
#define YY_EXIT_FAILURE 2
#endif
-static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
+static void yynoreturn yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
{
- (void) fprintf( stderr, "%s\n", msg );
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ (void) fprintf( stderr, "%s\n", msg );
exit( YY_EXIT_FAILURE );
}
@@ -2451,7 +2449,7 @@ FILE *xlu__disk_yyget_out (yyscan_t yyscanner)
/** Get the length of the current token.
* @param yyscanner The scanner object.
*/
-yy_size_t xlu__disk_yyget_leng (yyscan_t yyscanner)
+int xlu__disk_yyget_leng (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yyleng;
@@ -2478,10 +2476,10 @@ void xlu__disk_yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
}
/** Set the current line number.
- * @param line_number
+ * @param _line_number line number
* @param yyscanner The scanner object.
*/
-void xlu__disk_yyset_lineno (int line_number , yyscan_t yyscanner)
+void xlu__disk_yyset_lineno (int _line_number , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
@@ -2489,14 +2487,14 @@ void xlu__disk_yyset_lineno (int line_number , yyscan_t yyscanner)
if (! YY_CURRENT_BUFFER )
YY_FATAL_ERROR( "xlu__disk_yyset_lineno called with no buffer" );
- yylineno = line_number;
+ yylineno = _line_number;
}
/** Set the current column.
- * @param line_number
+ * @param _column_no column number
* @param yyscanner The scanner object.
*/
-void xlu__disk_yyset_column (int column_no , yyscan_t yyscanner)
+void xlu__disk_yyset_column (int _column_no , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
@@ -2504,25 +2502,25 @@ void xlu__disk_yyset_column (int column_no , yyscan_t yyscanner)
if (! YY_CURRENT_BUFFER )
YY_FATAL_ERROR( "xlu__disk_yyset_column called with no buffer" );
- yycolumn = column_no;
+ yycolumn = _column_no;
}
/** Set the input stream. This does not discard the current
* input buffer.
- * @param in_str A readable stream.
+ * @param _in_str A readable stream.
* @param yyscanner The scanner object.
* @see xlu__disk_yy_switch_to_buffer
*/
-void xlu__disk_yyset_in (FILE * in_str , yyscan_t yyscanner)
+void xlu__disk_yyset_in (FILE * _in_str , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- yyin = in_str ;
+ yyin = _in_str ;
}
-void xlu__disk_yyset_out (FILE * out_str , yyscan_t yyscanner)
+void xlu__disk_yyset_out (FILE * _out_str , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- yyout = out_str ;
+ yyout = _out_str ;
}
int xlu__disk_yyget_debug (yyscan_t yyscanner)
@@ -2531,10 +2529,10 @@ int xlu__disk_yyget_debug (yyscan_t yyscanner)
return yy_flex_debug;
}
-void xlu__disk_yyset_debug (int bdebug , yyscan_t yyscanner)
+void xlu__disk_yyset_debug (int _bdebug , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- yy_flex_debug = bdebug ;
+ yy_flex_debug = _bdebug ;
}
/* Accessor methods for yylval and yylloc */
@@ -2610,10 +2608,10 @@ static int yy_init_globals (yyscan_t yyscanner)
* This function is called from xlu__disk_yylex_destroy(), so don't allocate here.
*/
- yyg->yy_buffer_stack = 0;
+ yyg->yy_buffer_stack = NULL;
yyg->yy_buffer_stack_top = 0;
yyg->yy_buffer_stack_max = 0;
- yyg->yy_c_buf_p = (char *) 0;
+ yyg->yy_c_buf_p = NULL;
yyg->yy_init = 0;
yyg->yy_start = 0;
@@ -2631,8 +2629,8 @@ static int yy_init_globals (yyscan_t yyscanner)
yyin = stdin;
yyout = stdout;
#else
- yyin = (FILE *) 0;
- yyout = (FILE *) 0;
+ yyin = NULL;
+ yyout = NULL;
#endif
/* For future reference: Set errno on error, since we are called by
@@ -2681,7 +2679,10 @@ int xlu__disk_yylex_destroy (yyscan_t yyscanner)
#ifndef yytext_ptr
static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
{
- register int i;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
+ int i;
for ( i = 0; i < n; ++i )
s1[i] = s2[i];
}
@@ -2690,7 +2691,7 @@ static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yysca
#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
{
- register int n;
+ int n;
for ( n = 0; s[n]; ++n )
;
@@ -2700,11 +2701,16 @@ static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
void *xlu__disk_yyalloc (yy_size_t size , yyscan_t yyscanner)
{
- return (void *) malloc( size );
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ return malloc(size);
}
void *xlu__disk_yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
/* The cast to (char *) in the following accommodates both
* implementations that use char* generic pointers, and those
* that use void* generic pointers. It works with the latter
@@ -2712,14 +2718,16 @@ void *xlu__disk_yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
* any pointer type to void*, and deal with argument conversions
* as though doing an assignment.
*/
- return (void *) realloc( (char *) ptr, size );
+ return realloc(ptr, size);
}
void xlu__disk_yyfree (void * ptr , yyscan_t yyscanner)
{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
free( (char *) ptr ); /* see xlu__disk_yyrealloc() for (char *) cast */
}
#define YYTABLES_NAME "yytables"
-#line 277 "libxlu_disk_l.l"
+#line 279 "libxlu_disk_l.l"
diff --git a/tools/libxl/libxlu_disk_l.h b/tools/libxl/libxlu_disk_l.h
index 794274f..abeb9bd 100644
--- a/tools/libxl/libxlu_disk_l.h
+++ b/tools/libxl/libxlu_disk_l.h
@@ -3,12 +3,9 @@
#define xlu__disk_yyIN_HEADER 1
#line 6 "libxlu_disk_l.h"
-#line 31 "libxlu_disk_l.l"
#include "libxl_osdeps.h" /* must come before any other headers */
-
-
-#line 12 "libxlu_disk_l.h"
+#line 9 "libxlu_disk_l.h"
#define YY_INT_ALIGNED short int
@@ -16,8 +13,8 @@
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 39
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 1
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
@@ -96,25 +93,13 @@ typedef unsigned int flex_uint32_t;
#endif /* ! FLEXINT_H */
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif /* defined (__STDC__) */
-#endif /* ! __cplusplus */
-
-#ifdef YY_USE_CONST
+/* TODO: this is always defined, so inline it */
#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
#else
-#define yyconst
+#define yynoreturn
#endif
/* An opaque pointer. */
@@ -169,12 +154,12 @@ struct yy_buffer_state
/* Size of input buffer in bytes, not including room for EOB
* characters.
*/
- yy_size_t yy_buf_size;
+ int yy_buf_size;
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
- yy_size_t yy_n_chars;
+ int yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
@@ -218,13 +203,13 @@ void xlu__disk_yypop_buffer_state (yyscan_t yyscanner );
YY_BUFFER_STATE xlu__disk_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
YY_BUFFER_STATE xlu__disk_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
-YY_BUFFER_STATE xlu__disk_yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );
+YY_BUFFER_STATE xlu__disk_yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
void *xlu__disk_yyalloc (yy_size_t ,yyscan_t yyscanner );
void *xlu__disk_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
void xlu__disk_yyfree (void * ,yyscan_t yyscanner );
-#define xlu__disk_yywrap(yyscanner) 1
+#define xlu__disk_yywrap(yyscanner) (/*CONSTCOND*/1)
#define YY_SKIP_YYWRAP
#define yytext_ptr yytext_r
@@ -266,23 +251,23 @@ void xlu__disk_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
FILE *xlu__disk_yyget_in (yyscan_t yyscanner );
-void xlu__disk_yyset_in (FILE * in_str ,yyscan_t yyscanner );
+void xlu__disk_yyset_in (FILE * _in_str ,yyscan_t yyscanner );
FILE *xlu__disk_yyget_out (yyscan_t yyscanner );
-void xlu__disk_yyset_out (FILE * out_str ,yyscan_t yyscanner );
+void xlu__disk_yyset_out (FILE * _out_str ,yyscan_t yyscanner );
-yy_size_t xlu__disk_yyget_leng (yyscan_t yyscanner );
+ int xlu__disk_yyget_leng (yyscan_t yyscanner );
char *xlu__disk_yyget_text (yyscan_t yyscanner );
int xlu__disk_yyget_lineno (yyscan_t yyscanner );
-void xlu__disk_yyset_lineno (int line_number ,yyscan_t yyscanner );
+void xlu__disk_yyset_lineno (int _line_number ,yyscan_t yyscanner );
int xlu__disk_yyget_column (yyscan_t yyscanner );
-void xlu__disk_yyset_column (int column_no ,yyscan_t yyscanner );
+void xlu__disk_yyset_column (int _column_no ,yyscan_t yyscanner );
/* Macros after this point can all be overridden by user definitions in
* section 1.
@@ -348,8 +333,8 @@ extern int xlu__disk_yylex (yyscan_t yyscanner);
#undef YY_DECL
#endif
-#line 277 "libxlu_disk_l.l"
+#line 279 "libxlu_disk_l.l"
-#line 354 "libxlu_disk_l.h"
+#line 339 "libxlu_disk_l.h"
#undef xlu__disk_yyIN_HEADER
#endif /* xlu__disk_yyHEADER_H */
diff --git a/tools/libxl/libxlu_disk_l.l b/tools/libxl/libxlu_disk_l.l
index 5b6db22..f0e6a3b 100644
--- a/tools/libxl/libxlu_disk_l.l
+++ b/tools/libxl/libxlu_disk_l.l
@@ -102,6 +102,7 @@ static void setformat(DiskParseContext *dpc, const char *str) {
else if (!strcmp(str,"qcow2")) DSET(dpc,format,FORMAT,str,QCOW2);
else if (!strcmp(str,"vhd")) DSET(dpc,format,FORMAT,str,VHD);
else if (!strcmp(str,"empty")) DSET(dpc,format,FORMAT,str,EMPTY);
+ else if (!strcmp(str,"qed")) DSET(dpc,format,FORMAT,str,QED);
else xlu__disk_err(dpc,str,"unknown value for format");
}
@@ -209,7 +210,7 @@ target=.* { STRIP(','); SAVESTRING("target", pdev_path, FROMEQUALS); }
/* the "/.*" in these patterns ensures that they count as if they
* matched the whole string, so these patterns take precedence */
-(raw|qcow2?|vhd):/.* {
+(raw|qcow2?|vhd|qed):/.* {
STRIP(':');
DPC->had_depr_prefix=1; DEPRECATE("use `[format=]...,'");
setformat(DPC, yytext);
--
2.10.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
^ permalink raw reply related
* Re: [PATCH 1/3] idle: add support for tasks that inject idle
From: Peter Zijlstra @ 2016-11-14 14:57 UTC (permalink / raw)
To: Jacob Pan
Cc: LKML, Linux PM, Thomas Gleixner, Ingo Molnar, Zhang Rui,
Rafael Wysocki, Chen, Yu C, Sebastian Andrzej Siewior,
Petr Mladek, Srinivas Pandruvada, Arjan van de Ven
In-Reply-To: <1478718312-12847-2-git-send-email-jacob.jun.pan@linux.intel.com>
On Wed, Nov 09, 2016 at 11:05:10AM -0800, Jacob Pan wrote:
> static inline bool is_idle_task(const struct task_struct *p)
> {
> - return p->pid == 0;
> + return !!(p->flags & PF_IDLE);
> }
> +void play_idle()
> +{
> + /*
> + * Only FIFO tasks can disable the tick since they don't need the forced
> + * preemption.
> + */
> + WARN_ON_ONCE(current->policy != SCHED_FIFO);
> + WARN_ON_ONCE(current->nr_cpus_allowed != 1);
> + WARN_ON_ONCE(!(current->flags & PF_KTHREAD));
> + WARN_ON_ONCE(!(current->flags & PF_NO_SETAFFINITY));
> + rcu_sleep_check();
> +
> + preempt_disable();
> + current->flags |= PF_IDLE;
> + do_idle();
> + current->flags &= ~PF_IDLE;
Whoops, that will clear PF_IDLE from the idle thread. Maybe do something
like:
unsigned int idle_flag = (~current->flags & PF_IDLE)
current->flags |= PF_IDLE;
current->flags ^= idle_flag;
> +
> + preempt_fold_need_resched();
> + preempt_enable();
> +}
> +EXPORT_SYMBOL_GPL(play_idle);
> @@ -299,5 +313,7 @@ void cpu_startup_entry(enum cpuhp_state state)
> #endif
> arch_cpu_idle_prepare();
> cpuhp_online_idle(state);
> - cpu_idle_loop();
> + while (1)
> + do_idle();
> +
> }
^ permalink raw reply
* Re: [PATCH v10 3/3] drm/fence: add out-fences support
From: Brian Starkey @ 2016-11-14 14:57 UTC (permalink / raw)
To: Gustavo Padovan
Cc: marcheu, Daniel Stone, seanpaul, Daniel Vetter, linux-kernel,
dri-devel, m.chehab, Gustavo Padovan, John Harrison,
laurent.pinchart
In-Reply-To: <1479088796-3809-4-git-send-email-gustavo@padovan.org>
Hi Gustavo,
I was just writing some internal docs, and it occurred to me that the
out-fence implementation here doesn't seem to match what we discussed
with Ville a few weeks back (which had completely slipped my mind).
Did the idea of returning -1 fences for multiple commits within a
frame get dropped? I didn't see any discussion further than that
thread on v5 from October:
http://lkml.iu.edu/hypermail/linux/kernel/1610.2/04727.html
Cheers,
Brian
On Mon, Nov 14, 2016 at 10:59:56AM +0900, Gustavo Padovan wrote:
>From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
>
>Support DRM out-fences by creating a sync_file with a fence for each CRTC
>that sets the OUT_FENCE_PTR property.
>
>We use the out_fence pointer received in the OUT_FENCE_PTR prop to send
>the sync_file fd back to userspace.
>
>The sync_file and fd are allocated/created before commit, but the
>fd_install operation only happens after we know that commit succeed.
>
>v2: Comment by Rob Clark:
> - Squash commit that adds DRM_MODE_ATOMIC_OUT_FENCE flag here.
>
> Comment by Daniel Vetter:
> - Add clean up code for out_fences
>
>v3: Comments by Daniel Vetter:
> - create DRM_MODE_ATOMIC_EVENT_MASK
> - userspace should fill out_fences_ptr with the crtc_ids for which
> it wants fences back.
>
>v4: Create OUT_FENCE_PTR properties and remove old approach.
>
>v5: Comments by Brian Starkey:
> - Remove extra fence_get() in atomic_ioctl()
> - Check ret before iterating on the crtc_state
> - check ret before fd_install
> - set fence_state to NULL at the beginning
> - check fence_state->out_fence_ptr before put_user()
> - change order of fput() and put_unused_fd() on failure
>
> - Add access_ok() check to the out_fence_ptr received
> - Rebase after fence -> dma_fence rename
> - Store out_fence_ptr in the drm_atomic_state
> - Split crtc_setup_out_fence()
> - return -1 as out_fence with TEST_ONLY flag
>
>v6: Comments by Daniel Vetter
> - Add prepare/unprepare_crtc_signaling()
> - move struct drm_out_fence_state to drm_atomic.c
> - mark get_crtc_fence() as static
>
> Comments by Brian Starkey
> - proper set fence_ptr fence_state array
> - isolate fence_idx increment
>
> - improve error handling
>
>v7: Comments by Daniel Vetter
> - remove prefix from internal functions
> - make out_fence_ptr an s64 pointer
> - degrade DRM_INFO to DRM_DEBUG_ATOMIC when put_user fail
> - fix doc issues
> - filter out OUT_FENCE_PTR == NULL and do not fail in this case
> - add complete_crtc_signalling()
> - krealloc fence_state on demand
>
> Comment by Brian Starkey
> - remove unused crtc_state arg from get_out_fence()
>
>v8: Comment by Brian Starkey
> - cancel events before check for !fence_state
> - convert a few lefovers u64 types for out_fence_ptr
> - fix memleak by assign fence_state earlier after realloc
> - proper accout num_fences in case of error
>
>v9: Comment by Brian Starkey
> - memset last position of fence_state after krealloc
> Comments by Sean Paul
> - pass install_fds in complete_crtc_signaling() instead of ret
>
> - put_user(-1, fence_ptr) when decoding props
>
>Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
>---
> drivers/gpu/drm/drm_atomic.c | 241 +++++++++++++++++++++++++++++++++++--------
> drivers/gpu/drm/drm_crtc.c | 8 ++
> include/drm/drm_atomic.h | 1 +
> include/drm/drm_crtc.h | 6 ++
> 4 files changed, 211 insertions(+), 45 deletions(-)
>
>diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
>index 3ad780a..27e5c0a 100644
>--- a/drivers/gpu/drm/drm_atomic.c
>+++ b/drivers/gpu/drm/drm_atomic.c
>@@ -290,6 +290,23 @@ drm_atomic_get_crtc_state(struct drm_atomic_state *state,
> }
> EXPORT_SYMBOL(drm_atomic_get_crtc_state);
>
>+static void set_out_fence_for_crtc(struct drm_atomic_state *state,
>+ struct drm_crtc *crtc, s64 __user *fence_ptr)
>+{
>+ state->crtcs[drm_crtc_index(crtc)].out_fence_ptr = fence_ptr;
>+}
>+
>+static s64 __user * get_out_fence_for_crtc(struct drm_atomic_state *state,
>+ struct drm_crtc *crtc)
>+{
>+ s64 __user *fence_ptr;
>+
>+ fence_ptr = state->crtcs[drm_crtc_index(crtc)].out_fence_ptr;
>+ state->crtcs[drm_crtc_index(crtc)].out_fence_ptr = NULL;
>+
>+ return fence_ptr;
>+}
>+
> /**
> * drm_atomic_set_mode_for_crtc - set mode for CRTC
> * @state: the CRTC whose incoming state to update
>@@ -494,6 +511,16 @@ int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
> &replaced);
> state->color_mgmt_changed |= replaced;
> return ret;
>+ } else if (property == config->prop_out_fence_ptr) {
>+ s64 __user *fence_ptr = u64_to_user_ptr(val);
>+
>+ if (!fence_ptr)
>+ return 0;
>+
>+ if (put_user(-1, fence_ptr))
>+ return -EFAULT;
>+
>+ set_out_fence_for_crtc(state->state, crtc, fence_ptr);
> } else if (crtc->funcs->atomic_set_property)
> return crtc->funcs->atomic_set_property(crtc, state, property, val);
> else
>@@ -536,6 +563,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc,
> *val = (state->ctm) ? state->ctm->base.id : 0;
> else if (property == config->gamma_lut_property)
> *val = (state->gamma_lut) ? state->gamma_lut->base.id : 0;
>+ else if (property == config->prop_out_fence_ptr)
>+ *val = 0;
> else if (crtc->funcs->atomic_get_property)
> return crtc->funcs->atomic_get_property(crtc, state, property, val);
> else
>@@ -1664,11 +1693,9 @@ int drm_atomic_debugfs_init(struct drm_minor *minor)
> */
>
> static struct drm_pending_vblank_event *create_vblank_event(
>- struct drm_device *dev, struct drm_file *file_priv,
>- struct dma_fence *fence, uint64_t user_data)
>+ struct drm_device *dev, uint64_t user_data)
> {
> struct drm_pending_vblank_event *e = NULL;
>- int ret;
>
> e = kzalloc(sizeof *e, GFP_KERNEL);
> if (!e)
>@@ -1678,17 +1705,6 @@ static struct drm_pending_vblank_event *create_vblank_event(
> e->event.base.length = sizeof(e->event);
> e->event.user_data = user_data;
>
>- if (file_priv) {
>- ret = drm_event_reserve_init(dev, file_priv, &e->base,
>- &e->event.base);
>- if (ret) {
>- kfree(e);
>- return NULL;
>- }
>- }
>-
>- e->base.fence = fence;
>-
> return e;
> }
>
>@@ -1793,6 +1809,165 @@ void drm_atomic_clean_old_fb(struct drm_device *dev,
> }
> EXPORT_SYMBOL(drm_atomic_clean_old_fb);
>
>+static struct dma_fence *get_crtc_fence(struct drm_crtc *crtc)
>+{
>+ struct dma_fence *fence;
>+
>+ fence = kzalloc(sizeof(*fence), GFP_KERNEL);
>+ if (!fence)
>+ return NULL;
>+
>+ dma_fence_init(fence, &drm_crtc_fence_ops, &crtc->fence_lock,
>+ crtc->fence_context, ++crtc->fence_seqno);
>+
>+ return fence;
>+}
>+
>+struct drm_out_fence_state {
>+ s64 __user *out_fence_ptr;
>+ struct sync_file *sync_file;
>+ int fd;
>+};
>+
>+static int setup_out_fence(struct drm_out_fence_state *fence_state,
>+ struct dma_fence *fence)
>+{
>+ fence_state->fd = get_unused_fd_flags(O_CLOEXEC);
>+ if (fence_state->fd < 0)
>+ return fence_state->fd;
>+
>+ if (put_user(fence_state->fd, fence_state->out_fence_ptr))
>+ return -EFAULT;
>+
>+ fence_state->sync_file = sync_file_create(fence);
>+ if(!fence_state->sync_file)
>+ return -ENOMEM;
>+
>+ return 0;
>+}
>+
>+static int prepare_crtc_signaling(struct drm_device *dev,
>+ struct drm_atomic_state *state,
>+ struct drm_mode_atomic *arg,
>+ struct drm_file *file_priv,
>+ struct drm_out_fence_state **fence_state,
>+ unsigned int *num_fences)
>+{
>+ struct drm_crtc *crtc;
>+ struct drm_crtc_state *crtc_state;
>+ int i, ret;
>+
>+ if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY)
>+ return 0;
>+
>+ for_each_crtc_in_state(state, crtc, crtc_state, i) {
>+ u64 __user *fence_ptr;
>+
>+ fence_ptr = get_out_fence_for_crtc(crtc_state->state, crtc);
>+
>+ if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT || fence_ptr) {
>+ struct drm_pending_vblank_event *e;
>+
>+ e = create_vblank_event(dev, arg->user_data);
>+ if (!e)
>+ return -ENOMEM;
>+
>+ crtc_state->event = e;
>+ }
>+
>+ if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
>+ struct drm_pending_vblank_event *e = crtc_state->event;
>+
>+ if (!file_priv)
>+ continue;
>+
>+ ret = drm_event_reserve_init(dev, file_priv, &e->base,
>+ &e->event.base);
>+ if (ret) {
>+ kfree(e);
>+ crtc_state->event = NULL;
>+ return ret;
>+ }
>+ }
>+
>+ if (fence_ptr) {
>+ struct dma_fence *fence;
>+ struct drm_out_fence_state *f;
>+
>+ f = krealloc(*fence_state, sizeof(**fence_state) *
>+ (*num_fences + 1), GFP_KERNEL);
>+ if (!f)
>+ return -ENOMEM;
>+
>+ memset(&f[*num_fences], 0, sizeof(*f));
>+
>+ f[*num_fences].out_fence_ptr = fence_ptr;
>+ *fence_state = f;
>+
>+ fence = get_crtc_fence(crtc);
>+ if (!fence) {
>+ (*num_fences)++;
>+ return -ENOMEM;
>+ }
>+
>+ ret = setup_out_fence(&f[(*num_fences)++], fence);
>+ if (ret) {
>+ dma_fence_put(fence);
>+ return ret;
>+ }
>+
>+ crtc_state->event->base.fence = fence;
>+ }
>+ }
>+
>+ return 0;
>+}
>+
>+static void complete_crtc_signaling(struct drm_device *dev,
>+ struct drm_atomic_state *state,
>+ struct drm_out_fence_state *fence_state,
>+ unsigned int num_fences,
>+ bool install_fds)
>+{
>+ struct drm_crtc *crtc;
>+ struct drm_crtc_state *crtc_state;
>+ int i;
>+
>+ if (install_fds) {
>+ for (i = 0; i < num_fences; i++)
>+ fd_install(fence_state[i].fd,
>+ fence_state[i].sync_file->file);
>+ return;
>+ }
>+
>+ for_each_crtc_in_state(state, crtc, crtc_state, i) {
>+ /*
>+ * TEST_ONLY and PAGE_FLIP_EVENT are mutually
>+ * exclusive, if they weren't, this code should be
>+ * called on success for TEST_ONLY too.
>+ */
>+ if (crtc_state->event)
>+ drm_event_cancel_free(dev, &crtc_state->event->base);
>+ }
>+
>+ if (!fence_state)
>+ return;
>+
>+ for (i = 0; i < num_fences; i++) {
>+ if (fence_state[i].sync_file)
>+ fput(fence_state[i].sync_file->file);
>+ if (fence_state[i].fd >= 0)
>+ put_unused_fd(fence_state[i].fd);
>+
>+ /* If this fails log error to the user */
>+ if (fence_state[i].out_fence_ptr &&
>+ put_user(-1, fence_state[i].out_fence_ptr))
>+ DRM_DEBUG_ATOMIC("Couldn't clear out_fence_ptr\n");
>+ }
>+
>+ kfree(fence_state);
>+}
>+
> int drm_mode_atomic_ioctl(struct drm_device *dev,
> void *data, struct drm_file *file_priv)
> {
>@@ -1805,11 +1980,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
> struct drm_atomic_state *state;
> struct drm_modeset_acquire_ctx ctx;
> struct drm_plane *plane;
>- struct drm_crtc *crtc;
>- struct drm_crtc_state *crtc_state;
>+ struct drm_out_fence_state *fence_state = NULL;
> unsigned plane_mask;
> int ret = 0;
>- unsigned int i, j;
>+ unsigned int i, j, num_fences = 0;
>
> /* disallow for drivers not supporting atomic: */
> if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
>@@ -1924,20 +2098,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
> drm_mode_object_unreference(obj);
> }
>
>- if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
>- for_each_crtc_in_state(state, crtc, crtc_state, i) {
>- struct drm_pending_vblank_event *e;
>-
>- e = create_vblank_event(dev, file_priv, NULL,
>- arg->user_data);
>- if (!e) {
>- ret = -ENOMEM;
>- goto out;
>- }
>-
>- crtc_state->event = e;
>- }
>- }
>+ ret = prepare_crtc_signaling(dev, state, arg, file_priv, &fence_state,
>+ &num_fences);
>+ if (ret)
>+ goto out;
>
> if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) {
> /*
>@@ -1957,20 +2121,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
> out:
> drm_atomic_clean_old_fb(dev, plane_mask, ret);
>
>- if (ret && arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
>- /*
>- * TEST_ONLY and PAGE_FLIP_EVENT are mutually exclusive,
>- * if they weren't, this code should be called on success
>- * for TEST_ONLY too.
>- */
>-
>- for_each_crtc_in_state(state, crtc, crtc_state, i) {
>- if (!crtc_state->event)
>- continue;
>-
>- drm_event_cancel_free(dev, &crtc_state->event->base);
>- }
>- }
>+ complete_crtc_signaling(dev, state, fence_state, num_fences, !ret);
>
> if (ret == -EDEADLK) {
> drm_atomic_state_clear(state);
>diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
>index 20ddaff..cf2423d 100644
>--- a/drivers/gpu/drm/drm_crtc.c
>+++ b/drivers/gpu/drm/drm_crtc.c
>@@ -274,6 +274,8 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
> if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
> drm_object_attach_property(&crtc->base, config->prop_active, 0);
> drm_object_attach_property(&crtc->base, config->prop_mode_id, 0);
>+ drm_object_attach_property(&crtc->base,
>+ config->prop_out_fence_ptr, 0);
> }
>
> return 0;
>@@ -434,6 +436,12 @@ static int drm_mode_create_standard_properties(struct drm_device *dev)
> return -ENOMEM;
> dev->mode_config.prop_in_fence_fd = prop;
>
>+ prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
>+ "OUT_FENCE_PTR", 0, U64_MAX);
>+ if (!prop)
>+ return -ENOMEM;
>+ dev->mode_config.prop_out_fence_ptr = prop;
>+
> prop = drm_property_create_object(dev, DRM_MODE_PROP_ATOMIC,
> "CRTC_ID", DRM_MODE_OBJECT_CRTC);
> if (!prop)
>diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
>index 331bb10..c0eaec7 100644
>--- a/include/drm/drm_atomic.h
>+++ b/include/drm/drm_atomic.h
>@@ -144,6 +144,7 @@ struct __drm_crtcs_state {
> struct drm_crtc *ptr;
> struct drm_crtc_state *state;
> struct drm_crtc_commit *commit;
>+ s64 __user *out_fence_ptr;
> };
>
> struct __drm_connnectors_state {
>diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
>index 0870de1..44571bc 100644
>--- a/include/drm/drm_crtc.h
>+++ b/include/drm/drm_crtc.h
>@@ -1264,6 +1264,12 @@ struct drm_mode_config {
> */
> struct drm_property *prop_in_fence_fd;
> /**
>+ * @prop_out_fence_ptr: Sync File fd pointer representing the
>+ * outgoing fences for a CRTC. Userspace should provide a pointer to a
>+ * value of type s64, and then cast that pointer to u64.
>+ */
>+ struct drm_property *prop_out_fence_ptr;
>+ /**
> * @prop_crtc_id: Default atomic plane property to specify the
> * &drm_crtc.
> */
>--
>2.5.5
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply
* Re: [PATCH v10 3/3] drm/fence: add out-fences support
From: Brian Starkey @ 2016-11-14 14:57 UTC (permalink / raw)
To: Gustavo Padovan
Cc: dri-devel, linux-kernel, Daniel Stone, Daniel Vetter, Rob Clark,
Greg Hackmann, John Harrison, laurent.pinchart, seanpaul, marcheu,
m.chehab, Maarten Lankhorst, Gustavo Padovan, ville.syrjala
In-Reply-To: <1479088796-3809-4-git-send-email-gustavo@padovan.org>
Hi Gustavo,
I was just writing some internal docs, and it occurred to me that the
out-fence implementation here doesn't seem to match what we discussed
with Ville a few weeks back (which had completely slipped my mind).
Did the idea of returning -1 fences for multiple commits within a
frame get dropped? I didn't see any discussion further than that
thread on v5 from October:
http://lkml.iu.edu/hypermail/linux/kernel/1610.2/04727.html
Cheers,
Brian
On Mon, Nov 14, 2016 at 10:59:56AM +0900, Gustavo Padovan wrote:
>From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
>
>Support DRM out-fences by creating a sync_file with a fence for each CRTC
>that sets the OUT_FENCE_PTR property.
>
>We use the out_fence pointer received in the OUT_FENCE_PTR prop to send
>the sync_file fd back to userspace.
>
>The sync_file and fd are allocated/created before commit, but the
>fd_install operation only happens after we know that commit succeed.
>
>v2: Comment by Rob Clark:
> - Squash commit that adds DRM_MODE_ATOMIC_OUT_FENCE flag here.
>
> Comment by Daniel Vetter:
> - Add clean up code for out_fences
>
>v3: Comments by Daniel Vetter:
> - create DRM_MODE_ATOMIC_EVENT_MASK
> - userspace should fill out_fences_ptr with the crtc_ids for which
> it wants fences back.
>
>v4: Create OUT_FENCE_PTR properties and remove old approach.
>
>v5: Comments by Brian Starkey:
> - Remove extra fence_get() in atomic_ioctl()
> - Check ret before iterating on the crtc_state
> - check ret before fd_install
> - set fence_state to NULL at the beginning
> - check fence_state->out_fence_ptr before put_user()
> - change order of fput() and put_unused_fd() on failure
>
> - Add access_ok() check to the out_fence_ptr received
> - Rebase after fence -> dma_fence rename
> - Store out_fence_ptr in the drm_atomic_state
> - Split crtc_setup_out_fence()
> - return -1 as out_fence with TEST_ONLY flag
>
>v6: Comments by Daniel Vetter
> - Add prepare/unprepare_crtc_signaling()
> - move struct drm_out_fence_state to drm_atomic.c
> - mark get_crtc_fence() as static
>
> Comments by Brian Starkey
> - proper set fence_ptr fence_state array
> - isolate fence_idx increment
>
> - improve error handling
>
>v7: Comments by Daniel Vetter
> - remove prefix from internal functions
> - make out_fence_ptr an s64 pointer
> - degrade DRM_INFO to DRM_DEBUG_ATOMIC when put_user fail
> - fix doc issues
> - filter out OUT_FENCE_PTR == NULL and do not fail in this case
> - add complete_crtc_signalling()
> - krealloc fence_state on demand
>
> Comment by Brian Starkey
> - remove unused crtc_state arg from get_out_fence()
>
>v8: Comment by Brian Starkey
> - cancel events before check for !fence_state
> - convert a few lefovers u64 types for out_fence_ptr
> - fix memleak by assign fence_state earlier after realloc
> - proper accout num_fences in case of error
>
>v9: Comment by Brian Starkey
> - memset last position of fence_state after krealloc
> Comments by Sean Paul
> - pass install_fds in complete_crtc_signaling() instead of ret
>
> - put_user(-1, fence_ptr) when decoding props
>
>Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
>---
> drivers/gpu/drm/drm_atomic.c | 241 +++++++++++++++++++++++++++++++++++--------
> drivers/gpu/drm/drm_crtc.c | 8 ++
> include/drm/drm_atomic.h | 1 +
> include/drm/drm_crtc.h | 6 ++
> 4 files changed, 211 insertions(+), 45 deletions(-)
>
>diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
>index 3ad780a..27e5c0a 100644
>--- a/drivers/gpu/drm/drm_atomic.c
>+++ b/drivers/gpu/drm/drm_atomic.c
>@@ -290,6 +290,23 @@ drm_atomic_get_crtc_state(struct drm_atomic_state *state,
> }
> EXPORT_SYMBOL(drm_atomic_get_crtc_state);
>
>+static void set_out_fence_for_crtc(struct drm_atomic_state *state,
>+ struct drm_crtc *crtc, s64 __user *fence_ptr)
>+{
>+ state->crtcs[drm_crtc_index(crtc)].out_fence_ptr = fence_ptr;
>+}
>+
>+static s64 __user * get_out_fence_for_crtc(struct drm_atomic_state *state,
>+ struct drm_crtc *crtc)
>+{
>+ s64 __user *fence_ptr;
>+
>+ fence_ptr = state->crtcs[drm_crtc_index(crtc)].out_fence_ptr;
>+ state->crtcs[drm_crtc_index(crtc)].out_fence_ptr = NULL;
>+
>+ return fence_ptr;
>+}
>+
> /**
> * drm_atomic_set_mode_for_crtc - set mode for CRTC
> * @state: the CRTC whose incoming state to update
>@@ -494,6 +511,16 @@ int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
> &replaced);
> state->color_mgmt_changed |= replaced;
> return ret;
>+ } else if (property == config->prop_out_fence_ptr) {
>+ s64 __user *fence_ptr = u64_to_user_ptr(val);
>+
>+ if (!fence_ptr)
>+ return 0;
>+
>+ if (put_user(-1, fence_ptr))
>+ return -EFAULT;
>+
>+ set_out_fence_for_crtc(state->state, crtc, fence_ptr);
> } else if (crtc->funcs->atomic_set_property)
> return crtc->funcs->atomic_set_property(crtc, state, property, val);
> else
>@@ -536,6 +563,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc,
> *val = (state->ctm) ? state->ctm->base.id : 0;
> else if (property == config->gamma_lut_property)
> *val = (state->gamma_lut) ? state->gamma_lut->base.id : 0;
>+ else if (property == config->prop_out_fence_ptr)
>+ *val = 0;
> else if (crtc->funcs->atomic_get_property)
> return crtc->funcs->atomic_get_property(crtc, state, property, val);
> else
>@@ -1664,11 +1693,9 @@ int drm_atomic_debugfs_init(struct drm_minor *minor)
> */
>
> static struct drm_pending_vblank_event *create_vblank_event(
>- struct drm_device *dev, struct drm_file *file_priv,
>- struct dma_fence *fence, uint64_t user_data)
>+ struct drm_device *dev, uint64_t user_data)
> {
> struct drm_pending_vblank_event *e = NULL;
>- int ret;
>
> e = kzalloc(sizeof *e, GFP_KERNEL);
> if (!e)
>@@ -1678,17 +1705,6 @@ static struct drm_pending_vblank_event *create_vblank_event(
> e->event.base.length = sizeof(e->event);
> e->event.user_data = user_data;
>
>- if (file_priv) {
>- ret = drm_event_reserve_init(dev, file_priv, &e->base,
>- &e->event.base);
>- if (ret) {
>- kfree(e);
>- return NULL;
>- }
>- }
>-
>- e->base.fence = fence;
>-
> return e;
> }
>
>@@ -1793,6 +1809,165 @@ void drm_atomic_clean_old_fb(struct drm_device *dev,
> }
> EXPORT_SYMBOL(drm_atomic_clean_old_fb);
>
>+static struct dma_fence *get_crtc_fence(struct drm_crtc *crtc)
>+{
>+ struct dma_fence *fence;
>+
>+ fence = kzalloc(sizeof(*fence), GFP_KERNEL);
>+ if (!fence)
>+ return NULL;
>+
>+ dma_fence_init(fence, &drm_crtc_fence_ops, &crtc->fence_lock,
>+ crtc->fence_context, ++crtc->fence_seqno);
>+
>+ return fence;
>+}
>+
>+struct drm_out_fence_state {
>+ s64 __user *out_fence_ptr;
>+ struct sync_file *sync_file;
>+ int fd;
>+};
>+
>+static int setup_out_fence(struct drm_out_fence_state *fence_state,
>+ struct dma_fence *fence)
>+{
>+ fence_state->fd = get_unused_fd_flags(O_CLOEXEC);
>+ if (fence_state->fd < 0)
>+ return fence_state->fd;
>+
>+ if (put_user(fence_state->fd, fence_state->out_fence_ptr))
>+ return -EFAULT;
>+
>+ fence_state->sync_file = sync_file_create(fence);
>+ if(!fence_state->sync_file)
>+ return -ENOMEM;
>+
>+ return 0;
>+}
>+
>+static int prepare_crtc_signaling(struct drm_device *dev,
>+ struct drm_atomic_state *state,
>+ struct drm_mode_atomic *arg,
>+ struct drm_file *file_priv,
>+ struct drm_out_fence_state **fence_state,
>+ unsigned int *num_fences)
>+{
>+ struct drm_crtc *crtc;
>+ struct drm_crtc_state *crtc_state;
>+ int i, ret;
>+
>+ if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY)
>+ return 0;
>+
>+ for_each_crtc_in_state(state, crtc, crtc_state, i) {
>+ u64 __user *fence_ptr;
>+
>+ fence_ptr = get_out_fence_for_crtc(crtc_state->state, crtc);
>+
>+ if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT || fence_ptr) {
>+ struct drm_pending_vblank_event *e;
>+
>+ e = create_vblank_event(dev, arg->user_data);
>+ if (!e)
>+ return -ENOMEM;
>+
>+ crtc_state->event = e;
>+ }
>+
>+ if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
>+ struct drm_pending_vblank_event *e = crtc_state->event;
>+
>+ if (!file_priv)
>+ continue;
>+
>+ ret = drm_event_reserve_init(dev, file_priv, &e->base,
>+ &e->event.base);
>+ if (ret) {
>+ kfree(e);
>+ crtc_state->event = NULL;
>+ return ret;
>+ }
>+ }
>+
>+ if (fence_ptr) {
>+ struct dma_fence *fence;
>+ struct drm_out_fence_state *f;
>+
>+ f = krealloc(*fence_state, sizeof(**fence_state) *
>+ (*num_fences + 1), GFP_KERNEL);
>+ if (!f)
>+ return -ENOMEM;
>+
>+ memset(&f[*num_fences], 0, sizeof(*f));
>+
>+ f[*num_fences].out_fence_ptr = fence_ptr;
>+ *fence_state = f;
>+
>+ fence = get_crtc_fence(crtc);
>+ if (!fence) {
>+ (*num_fences)++;
>+ return -ENOMEM;
>+ }
>+
>+ ret = setup_out_fence(&f[(*num_fences)++], fence);
>+ if (ret) {
>+ dma_fence_put(fence);
>+ return ret;
>+ }
>+
>+ crtc_state->event->base.fence = fence;
>+ }
>+ }
>+
>+ return 0;
>+}
>+
>+static void complete_crtc_signaling(struct drm_device *dev,
>+ struct drm_atomic_state *state,
>+ struct drm_out_fence_state *fence_state,
>+ unsigned int num_fences,
>+ bool install_fds)
>+{
>+ struct drm_crtc *crtc;
>+ struct drm_crtc_state *crtc_state;
>+ int i;
>+
>+ if (install_fds) {
>+ for (i = 0; i < num_fences; i++)
>+ fd_install(fence_state[i].fd,
>+ fence_state[i].sync_file->file);
>+ return;
>+ }
>+
>+ for_each_crtc_in_state(state, crtc, crtc_state, i) {
>+ /*
>+ * TEST_ONLY and PAGE_FLIP_EVENT are mutually
>+ * exclusive, if they weren't, this code should be
>+ * called on success for TEST_ONLY too.
>+ */
>+ if (crtc_state->event)
>+ drm_event_cancel_free(dev, &crtc_state->event->base);
>+ }
>+
>+ if (!fence_state)
>+ return;
>+
>+ for (i = 0; i < num_fences; i++) {
>+ if (fence_state[i].sync_file)
>+ fput(fence_state[i].sync_file->file);
>+ if (fence_state[i].fd >= 0)
>+ put_unused_fd(fence_state[i].fd);
>+
>+ /* If this fails log error to the user */
>+ if (fence_state[i].out_fence_ptr &&
>+ put_user(-1, fence_state[i].out_fence_ptr))
>+ DRM_DEBUG_ATOMIC("Couldn't clear out_fence_ptr\n");
>+ }
>+
>+ kfree(fence_state);
>+}
>+
> int drm_mode_atomic_ioctl(struct drm_device *dev,
> void *data, struct drm_file *file_priv)
> {
>@@ -1805,11 +1980,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
> struct drm_atomic_state *state;
> struct drm_modeset_acquire_ctx ctx;
> struct drm_plane *plane;
>- struct drm_crtc *crtc;
>- struct drm_crtc_state *crtc_state;
>+ struct drm_out_fence_state *fence_state = NULL;
> unsigned plane_mask;
> int ret = 0;
>- unsigned int i, j;
>+ unsigned int i, j, num_fences = 0;
>
> /* disallow for drivers not supporting atomic: */
> if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
>@@ -1924,20 +2098,10 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
> drm_mode_object_unreference(obj);
> }
>
>- if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
>- for_each_crtc_in_state(state, crtc, crtc_state, i) {
>- struct drm_pending_vblank_event *e;
>-
>- e = create_vblank_event(dev, file_priv, NULL,
>- arg->user_data);
>- if (!e) {
>- ret = -ENOMEM;
>- goto out;
>- }
>-
>- crtc_state->event = e;
>- }
>- }
>+ ret = prepare_crtc_signaling(dev, state, arg, file_priv, &fence_state,
>+ &num_fences);
>+ if (ret)
>+ goto out;
>
> if (arg->flags & DRM_MODE_ATOMIC_TEST_ONLY) {
> /*
>@@ -1957,20 +2121,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
> out:
> drm_atomic_clean_old_fb(dev, plane_mask, ret);
>
>- if (ret && arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
>- /*
>- * TEST_ONLY and PAGE_FLIP_EVENT are mutually exclusive,
>- * if they weren't, this code should be called on success
>- * for TEST_ONLY too.
>- */
>-
>- for_each_crtc_in_state(state, crtc, crtc_state, i) {
>- if (!crtc_state->event)
>- continue;
>-
>- drm_event_cancel_free(dev, &crtc_state->event->base);
>- }
>- }
>+ complete_crtc_signaling(dev, state, fence_state, num_fences, !ret);
>
> if (ret == -EDEADLK) {
> drm_atomic_state_clear(state);
>diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
>index 20ddaff..cf2423d 100644
>--- a/drivers/gpu/drm/drm_crtc.c
>+++ b/drivers/gpu/drm/drm_crtc.c
>@@ -274,6 +274,8 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
> if (drm_core_check_feature(dev, DRIVER_ATOMIC)) {
> drm_object_attach_property(&crtc->base, config->prop_active, 0);
> drm_object_attach_property(&crtc->base, config->prop_mode_id, 0);
>+ drm_object_attach_property(&crtc->base,
>+ config->prop_out_fence_ptr, 0);
> }
>
> return 0;
>@@ -434,6 +436,12 @@ static int drm_mode_create_standard_properties(struct drm_device *dev)
> return -ENOMEM;
> dev->mode_config.prop_in_fence_fd = prop;
>
>+ prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC,
>+ "OUT_FENCE_PTR", 0, U64_MAX);
>+ if (!prop)
>+ return -ENOMEM;
>+ dev->mode_config.prop_out_fence_ptr = prop;
>+
> prop = drm_property_create_object(dev, DRM_MODE_PROP_ATOMIC,
> "CRTC_ID", DRM_MODE_OBJECT_CRTC);
> if (!prop)
>diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h
>index 331bb10..c0eaec7 100644
>--- a/include/drm/drm_atomic.h
>+++ b/include/drm/drm_atomic.h
>@@ -144,6 +144,7 @@ struct __drm_crtcs_state {
> struct drm_crtc *ptr;
> struct drm_crtc_state *state;
> struct drm_crtc_commit *commit;
>+ s64 __user *out_fence_ptr;
> };
>
> struct __drm_connnectors_state {
>diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
>index 0870de1..44571bc 100644
>--- a/include/drm/drm_crtc.h
>+++ b/include/drm/drm_crtc.h
>@@ -1264,6 +1264,12 @@ struct drm_mode_config {
> */
> struct drm_property *prop_in_fence_fd;
> /**
>+ * @prop_out_fence_ptr: Sync File fd pointer representing the
>+ * outgoing fences for a CRTC. Userspace should provide a pointer to a
>+ * value of type s64, and then cast that pointer to u64.
>+ */
>+ struct drm_property *prop_out_fence_ptr;
>+ /**
> * @prop_crtc_id: Default atomic plane property to specify the
> * &drm_crtc.
> */
>--
>2.5.5
>
^ permalink raw reply
* Re: A VM with 6 volumes - hangs
From: German Anders @ 2016-11-14 14:57 UTC (permalink / raw)
To: M Ranga Swami Reddy; +Cc: ceph-users, ceph-devel
In-Reply-To: <CANA9Uk62k74k5g3PcpxoL3cGARafQ9LvzH5Gj_FqtNm2RyuFqg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
[-- Attachment #1.1: Type: text/plain, Size: 878 bytes --]
Could you share some info about the ceph cluster? logs? did you see
anything different from normal op on the logs?
Best,
*German*
2016-11-14 11:46 GMT-03:00 M Ranga Swami Reddy <swamireddy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:
> +ceph-devel
>
> On Fri, Nov 11, 2016 at 5:09 PM, M Ranga Swami Reddy <swamireddy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
> > wrote:
>
>> Hello,
>> I am using the ceph volumes with a VM. Details are below:
>>
>> VM:
>> OS: Ubuntu 14.0.4
>> CPU: 12 Cores
>> RAM: 40 GB
>>
>> Volumes:
>> Size: 1 TB
>> No: 6 Volumes
>>
>>
>> With above, VM got hung without any read/write operation.
>>
>> Any suggestions..
>>
>> Thanks
>> Swami
>>
>
>
> _______________________________________________
> ceph-users mailing list
> ceph-users-idqoXFIVOFJgJs9I8MT0rw@public.gmane.org
> http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com
>
>
[-- Attachment #1.2: Type: text/html, Size: 2996 bytes --]
[-- Attachment #2: Type: text/plain, Size: 178 bytes --]
_______________________________________________
ceph-users mailing list
ceph-users-idqoXFIVOFJgJs9I8MT0rw@public.gmane.org
http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com
^ permalink raw reply
* Re: [PATCH 2/3] cpuidle: allow setting deepest idle
From: Peter Zijlstra @ 2016-11-14 14:58 UTC (permalink / raw)
To: Jacob Pan
Cc: LKML, Linux PM, Thomas Gleixner, Ingo Molnar, Zhang Rui,
Rafael Wysocki, Chen, Yu C, Sebastian Andrzej Siewior,
Petr Mladek, Srinivas Pandruvada, Arjan van de Ven
In-Reply-To: <1478718312-12847-3-git-send-email-jacob.jun.pan@linux.intel.com>
On Wed, Nov 09, 2016 at 11:05:11AM -0800, Jacob Pan wrote:
> --- a/kernel/sched/idle.c
> +++ b/kernel/sched/idle.c
> @@ -173,6 +173,9 @@ static void cpuidle_idle_call(void)
>
> next_state = cpuidle_find_deepest_state(drv, dev);
> call_cpuidle(drv, dev, next_state);
> + } else if (dev->use_deepest_state) {
> + next_state = cpuidle_find_deepest_state(drv, dev);
> + call_cpuidle(drv, dev, next_state);
looks like excessive indenting..
> } else {
> /*
> * Ask the cpuidle framework to choose a convenient idle state.
> --
> 1.9.1
>
^ permalink raw reply
* [PATCH nvme-cli v1 2/2] nvme.spec/debian: Auto generate host nqn as part of install
From: Gabriel Krisman Bertazi @ 2016-11-14 14:58 UTC (permalink / raw)
In-Reply-To: <1478602108-29571-3-git-send-email-sagi@grimberg.me>
Sagi Grimberg <sagi at grimberg.me> writes:
> The installation will generate a hostnqn and store it in
> /etc/nvme/hostnqn file (in case it doesn't exist).
> This file will be removed upon uninstallation (purge on for debian).
>
> Signed-off-by: Sagi Grimberg <sagi at grimberg.me>
> ---
> debian/postinst | 20 ++++++++++++++++++++
> debian/postrm | 5 +++++
> nvme.spec.in | 12 ++++++++++++
> 3 files changed, 37 insertions(+)
> create mode 100644 debian/postinst
> create mode 100644 debian/postrm
>
> diff --git a/debian/postinst b/debian/postinst
> new file mode 100644
> index 000000000000..b258cf569c3e
> --- /dev/null
> +++ b/debian/postinst
> @@ -0,0 +1,20 @@
> +#!/bin/sh
> +
> +set -e
> +
> +case "$1" in
> + configure|install)
> + if [ ! -f /etc/nvme/hostnqn ]; then
> + install -D /dev/null /etc/nvme/hostnqn
> + echo $(nvme gen-hostnqn) > /etc/nvme/hostnqn
> + fi
> + ;;
> +
> + upgrade|abort-upgrade)
> + ;;
> + *)
> + echo "postinst called with unknown argument \`$1'" >&2
> + exit 0
> + ;;
> +esac
> +exit 0
> diff --git a/debian/postrm b/debian/postrm
> new file mode 100644
> index 000000000000..d678fc8a90ac
> --- /dev/null
> +++ b/debian/postrm
> @@ -0,0 +1,5 @@
> +#!/bin/sh
> +
> +if [ "$1" = "purge" ]; then
> + rm -rf /etc/nvme
> +fi
Oh, here it is. Didn't see your v1 before responding to the rfc. :)
> diff --git a/nvme.spec.in b/nvme.spec.in
> index a4718773a962..8bda97d819ba 100644
> --- a/nvme.spec.in
> +++ b/nvme.spec.in
> @@ -33,6 +33,18 @@ make install DESTDIR=%{buildroot} PREFIX=/usr
> %clean
> rm -rf $RPM_BUILD_ROOT
>
> +%post
> +if [ $1 = 1 ]; then # 1 : This package is being installed for the first time
> + if [ ! -f /etc/nvme/hostnqn ]; then
> + install -D /dev/null /etc/nvme/hostnqn
> + echo $(nvme gen-hostnqn) > /etc/nvme/hostnqn
> + fi
> +fi
> +
> +%preun
> +if [ "$1" = "remove" ]; then
> + rm -rf /etc/nvme
> +fi
> %changelog
> * Thu Oct 15 2015 Keith Busch <keith.busch at intel.com>
> - Initial RPM spec
--
Gabriel Krisman Bertazi
^ permalink raw reply
* Re: Debugging Ethernet issues
From: Mason @ 2016-11-14 14:58 UTC (permalink / raw)
To: Andrew Lunn
Cc: Florian Fainelli, netdev, Mans Rullgard, Sergei Shtylyov,
Tom Lendacky, Zach Brown, Shaohui Xie, Tim Beale, Brian Hill,
Vince Bridgers, Balakumaran Kannan, David S. Miller,
Sebastian Frias, Kirill Kapranov
In-Reply-To: <20161114133428.GF26710@lunn.ch>
On 14/11/2016 14:34, Andrew Lunn wrote:
> Mason wrote:
>
>> How exactly does one use the generic PHY driver?
>
> If there is no specific driver available for the PHY, linux will fall
> back to the generic driver. So just don't compile the specific driver.
> You can see under /sys/bus/mdio_bus/devices which driver is being
> used.
I've removed the Atheros driver from the kernel config.
# ls /sys/bus/mdio_bus/drivers
Generic 10G PHY/ Generic PHY/
# ls -l "/sys/bus/mdio_bus/devices/26000.nb8800-mii:04/"
lrwxrwxrwx 1 root root 0 Jan 1 00:00 of_node -> ../../../../../../../firmware/devicetree/base/soc/ethernet@26000/ethernet-phy@4/
-r--r--r-- 1 root root 4096 Jan 1 00:00 phy_has_fixups
-r--r--r-- 1 root root 4096 Jan 1 00:00 phy_id
-r--r--r-- 1 root root 4096 Jan 1 00:00 phy_interface
lrwxrwxrwx 1 root root 0 Jan 1 00:00 subsystem -> ../../../../../../../bus/mdio_bus/
-rw-r--r-- 1 root root 4096 Jan 1 00:00 uevent
(I don't know why/how it finds so many ".." in the symlink path)
[ 1.170994] libphy: Fixed MDIO Bus: probed
[ 1.181794] libphy: nb8800-mii: probed
[ 1.192759] nb8800 26000.ethernet eth0: MAC address 00:16:e8:4b:b0:7d
# time udhcpc | while read LINE; do date; echo $LINE; done
Mon Nov 14 15:39:50 UTC 2016
udhcpc (v1.22.1) started
Mon Nov 14 15:39:50 UTC 2016
Sending discover...
[ 125.468634] nb8800_link_reconfigure from phy_state_machine
[ 126.475300] nb8800_link_reconfigure from phy_state_machine
Mon Nov 14 15:39:53 UTC 2016
Sending discover...
[ 126.682096] nb8800 26000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
Mon Nov 14 15:39:57 UTC 2016
Sending discover...
Mon Nov 14 15:40:20 UTC 2016
Sending discover...
Mon Nov 14 15:40:23 UTC 2016
Sending discover...
Mon Nov 14 15:40:26 UTC 2016
Sending discover...
Mon Nov 14 15:40:49 UTC 2016
Sending discover...
Mon Nov 14 15:40:52 UTC 2016
Sending discover...
Mon Nov 14 15:40:55 UTC 2016
Sending discover...
\x03^C
real 1m12.040s
user 0m0.067s
sys 0m0.057s
# tcpdump -n -i eth1-boards ether host 00:16:e8:4b:b0:7d
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1-boards, link-type EN10MB (Ethernet), capture size 262144 bytes
15:39:54.214574 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:39:55.215830 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
15:39:57.247862 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:39:57.248027 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
15:40:20.307556 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:40:20.307732 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
15:40:23.334155 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:40:23.334313 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
15:40:26.360807 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:40:26.360976 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
15:40:49.420473 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:40:49.420645 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
15:40:52.447121 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:40:52.447284 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
15:40:55.473721 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:40:55.473891 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
# ethtool -S eth0
NIC statistics:
rx_bytes_ok: 975
rx_frames_ok: 8
rx_undersize_frames: 0
rx_fragment_frames: 0
rx_64_byte_frames: 6
rx_127_byte_frames: 0
rx_255_byte_frames: 1
rx_511_byte_frames: 1
rx_1023_byte_frames: 0
rx_max_size_frames: 0
rx_oversize_frames: 0
rx_bad_fcs_frames: 0
rx_broadcast_frames: 4
rx_multicast_frames: 0
rx_control_frames: 0
rx_pause_frames: 0
rx_unsup_control_frames: 0
rx_align_error_frames: 0
rx_overrun_frames: 0
rx_jabber_frames: 0
rx_bytes: 975
rx_frames: 8
tx_bytes_ok: 2960
tx_frames_ok: 11
tx_64_byte_frames: 3
tx_127_byte_frames: 0
tx_255_byte_frames: 0
tx_511_byte_frames: 8
tx_1023_byte_frames: 0
tx_max_size_frames: 0
tx_oversize_frames: 0
tx_broadcast_frames: 8
tx_multicast_frames: 0
tx_control_frames: 0
tx_pause_frames: 0
tx_underrun_frames: 0
tx_single_collision_frames: 0
tx_multi_collision_frames: 0
tx_deferred_collision_frames: 0
tx_late_collision_frames: 0
tx_excessive_collision_frames: 0
tx_bytes: 2960
tx_frames: 11
tx_collisions: 0
EXPERIMENT #2
Now running the same test with fixed-phy (instead of generic phy driver)
# ls -l "/sys/bus/mdio_bus/devices/26000.nb8800-mii:04/"
lrwxrwxrwx 1 root root 0 Jan 1 00:01 of_node -> ../../../../../../../firmware/devicetree/base/soc/ethernet@26000/fixed-link/
-r--r--r-- 1 root root 4096 Jan 1 00:01 phy_has_fixups
-r--r--r-- 1 root root 4096 Jan 1 00:01 phy_id
-r--r--r-- 1 root root 4096 Jan 1 00:01 phy_interface
lrwxrwxrwx 1 root root 0 Jan 1 00:01 subsystem -> ../../../../../../../bus/mdio_bus/
-rw-r--r-- 1 root root 4096 Jan 1 00:00 uevent
[ 1.194170] libphy: Fixed MDIO Bus: probed
[ 1.208618] libphy: nb8800-mii: probed
[ 1.212422] mdio_bus 26000.nb8800-mii: /soc/ethernet@26000/fixed-link has invalid PHY address
[ 1.221025] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 0
[ 1.227788] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 1
[ 1.234551] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 2
[ 1.241310] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 3
[ 1.248071] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 4
[ 1.261077] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 5
[ 1.267857] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 6
[ 1.274623] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 7
[ 1.281386] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 8
[ 1.288144] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 9
[ 1.294906] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 10
[ 1.301750] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 11
[ 1.308599] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 12
[ 1.315444] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 13
[ 1.322291] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 14
[ 1.329142] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 15
[ 1.335992] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 16
[ 1.342839] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 17
[ 1.349752] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 18
[ 1.356652] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 19
[ 1.363503] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 20
[ 1.370352] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 21
[ 1.377200] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 22
[ 1.384048] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 23
[ 1.390895] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 24
[ 1.397742] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 25
[ 1.404590] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 26
[ 1.411437] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 27
[ 1.418284] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 28
[ 1.425132] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 29
[ 1.431979] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 30
[ 1.438826] mdio_bus 26000.nb8800-mii: scan phy fixed-link at address 31
[ 1.450432] nb8800 26000.ethernet eth0: MAC address 00:16:e8:4b:b0:7d
# time udhcpc | while read LINE; do date; echo $LINE; done
Mon Nov 14 15:49:05 UTC 2016
udhcpc (v1.22.1) started
Mon Nov 14 15:49:05 UTC 2016
Sending discover...
[ 179.748319] nb8800_link_reconfigure from phy_state_machine
[ 179.753888] nb8800 26000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
Mon Nov 14 15:49:08 UTC 2016
Sending discover...
Mon Nov 14 15:49:09 UTC 2016
Sending select for 172.27.64.58...
Mon Nov 14 15:49:10 UTC 2016
Lease of 172.27.64.58 obtained, lease time 604800
Mon Nov 14 15:49:10 UTC 2016
deleting routers
Mon Nov 14 15:49:10 UTC 2016
adding dns 172.27.0.17
real 0m4.359s
user 0m0.043s
sys 0m0.080s
# tcpdump -n -i eth1-boards ether host 00:16:e8:4b:b0:7d
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1-boards, link-type EN10MB (Ethernet), capture size 262144 bytes
15:49:09.054779 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:49:10.056055 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
15:49:10.071415 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:16:e8:4b:b0:7d, length 300
15:49:10.172012 IP 172.27.200.1.67 > 172.27.64.58.68: BOOTP/DHCP, Reply, length 391
15:49:11.054105 ARP, Reply 172.27.64.58 is-at 00:16:e8:4b:b0:7d, length 46
15:49:11.054116 IP 172.27.64.1 > 172.27.64.58: ICMP echo request, id 29883, seq 0, length 28
15:49:11.054304 IP 172.27.64.58 > 172.27.64.1: ICMP echo reply, id 29883, seq 0, length 28
15:49:16.057970 ARP, Request who-has 172.27.64.1 tell 172.27.64.58, length 46
15:49:16.057983 ARP, Reply 172.27.64.1 is-at 00:15:17:24:e0:81, length 28
# ethtool -S eth0
NIC statistics:
rx_bytes_ok: 1196
rx_frames_ok: 7
rx_undersize_frames: 0
rx_fragment_frames: 0
rx_64_byte_frames: 4
rx_127_byte_frames: 1
rx_255_byte_frames: 0
rx_511_byte_frames: 2
rx_1023_byte_frames: 0
rx_max_size_frames: 0
rx_oversize_frames: 0
rx_bad_fcs_frames: 0
rx_broadcast_frames: 3
rx_multicast_frames: 0
rx_control_frames: 0
rx_pause_frames: 0
rx_unsup_control_frames: 0
rx_align_error_frames: 0
rx_overrun_frames: 0
rx_jabber_frames: 0
rx_bytes: 1196
rx_frames: 7
tx_bytes_ok: 886
tx_frames_ok: 5
tx_64_byte_frames: 2
tx_127_byte_frames: 1
tx_255_byte_frames: 0
tx_511_byte_frames: 2
tx_1023_byte_frames: 0
tx_max_size_frames: 0
tx_oversize_frames: 0
tx_broadcast_frames: 2
tx_multicast_frames: 0
tx_control_frames: 0
tx_pause_frames: 0
tx_underrun_frames: 0
tx_single_collision_frames: 0
tx_multi_collision_frames: 0
tx_deferred_collision_frames: 0
tx_late_collision_frames: 0
tx_excessive_collision_frames: 0
tx_bytes: 886
tx_frames: 5
tx_collisions: 0
Hmmm...
[ 126.682096] nb8800 26000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
vs
[ 179.753888] nb8800 26000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
I'm not sure whether "flow control" is relevant...
Regards.
^ permalink raw reply
* Re: [PATCH] dma: cpp41: Fix handling of error path
From: Johan Hovold @ 2016-11-14 14:59 UTC (permalink / raw)
To: Tony Lindgren
Cc: Johan Hovold, Dan Williams, Vinod Koul, Bin Liu, Daniel Mack,
Felipe Balbi, George Cherian, Peter Ujfalusi,
Sebastian Andrzej Siewior, dmaengine-u79uwXL29TY76Z2rM5mHXA,
linux-usb-u79uwXL29TY76Z2rM5mHXA,
linux-omap-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <20161114144731.GQ7138-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
On Mon, Nov 14, 2016 at 06:47:31AM -0800, Tony Lindgren wrote:
> Hi,
>
> * Johan Hovold <johan-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> [161114 06:35]:
> > On Fri, Nov 11, 2016 at 11:28:52AM -0800, Tony Lindgren wrote:
> > > If we return early on pm_runtime_get() error, we need to also call
> > > pm_runtime_put_noidle() as pointed out in a musb related thread
> > > by Johan Hovold <johan-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>. This is to keep the PM runtime
> > > use counts happy.
> > >
> > > Fixes: fdea2d09b997 ("dmaengine: cppi41: Add basic PM runtime support")
> > > Cc: Johan Hovold <johan-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> > > Signed-off-by: Tony Lindgren <tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
> > > ---
> > > drivers/dma/cppi41.c | 11 +++++++++--
> > > 1 file changed, 9 insertions(+), 2 deletions(-)
> >
> > > @@ -466,6 +472,7 @@ static void cppi41_dma_issue_pending(struct dma_chan *chan)
> > >
> > > error = pm_runtime_get(cdd->ddev.dev);
> > > if ((error != -EINPROGRESS) && error < 0) {
> > > + pm_runtime_put_noidle(cdd->ddev.dev);
> > > dev_err(cdd->ddev.dev, "Failed to pm_runtime_get: %i\n",
> > > error);
> >
> > Will this chunk not introduce rather than fix an imbalance, though? An
> > error is never returned above, and the corresponding put is done
> > unconditionally as far as I can tell.
>
> There is already an early return in cppi41_dma_issue_pending() on
> error.
Indeed, but before
"dma: cppi41: Fix unpaired pm runtime when only a USB hub is
connected"
from last week, the corresponding put in cppi41_irq() was done
unconditionally and would have required an unconditional get here.
Thanks,
Johan
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH v3 0/9] Qualcomm video decoder/encoder driver
From: Stanimir Varbanov @ 2016-11-14 14:59 UTC (permalink / raw)
To: Javier Martinez Canillas, Hans Verkuil
Cc: Stanimir Varbanov, Mauro Carvalho Chehab, Andy Gross,
Bjorn Andersson, Stephen Boyd, Srinivas Kandagatla,
Linux Media Mailing List, Linux Kernel, linux-arm-msm
In-Reply-To: <CABxcv=nop8h5U0Kt5yjmSVX3ZZbUb7O6yVzOf5AxzsiWUucjwA@mail.gmail.com>
Hi,
On 11/11/2016 02:11 PM, Javier Martinez Canillas wrote:
> Hello Hans,
>
> On Fri, Nov 11, 2016 at 8:49 AM, Hans Verkuil <hverkuil@xs4all.nl> wrote:
>> Hi Stanimir,
>>
>> Overall it looks good. As you saw, I do have some comments but nothing major.
>>
>> One question: you use qcom as the directory name. How about using qualcomm?
>>
>> It's really not that much longer and a bit more obvious.
>>
>> Up to you, though.
>>
>
> It seems qcom is more consistent to the name used in most subsystems
> for Qualcomm:
>
> $ find -name *qcom
> ./arch/arm/mach-qcom
> ./arch/arm64/boot/dts/qcom
> ./Documentation/devicetree/bindings/soc/qcom
> ./sound/soc/qcom
> ./drivers/pinctrl/qcom
> ./drivers/soc/qcom
> ./drivers/clk/qcom
>
> $ find -name *qualcomm
> ./drivers/net/ethernet/qualcomm
Also qcom is the vendor prefix used in [1]
[1] Documentation/devicetree/bindings/vendor-prefixes.txt
--
regards,
Stan
^ permalink raw reply
* Re: [Qemu-devel] [RFC 0/3] aio: experimental virtio-blk polling mode
From: Christian Borntraeger @ 2016-11-14 14:59 UTC (permalink / raw)
To: Stefan Hajnoczi, qemu-devel; +Cc: Paolo Bonzini, Fam Zheng, Karl Rister
In-Reply-To: <1478711602-12620-1-git-send-email-stefanha@redhat.com>
On 11/09/2016 06:13 PM, Stefan Hajnoczi wrote:
> Recent performance investigation work done by Karl Rister shows that the
> guest->host notification takes around 20 us. This is more than the "overhead"
> of QEMU itself (e.g. block layer).
>
> One way to avoid the costly exit is to use polling instead of notification.
> The main drawback of polling is that it consumes CPU resources. In order to
> benefit performance the host must have extra CPU cycles available on physical
> CPUs that aren't used by the guest.
>
> This is an experimental AioContext polling implementation. It adds a polling
> callback into the event loop. Polling functions are implemented for virtio-blk
> virtqueue guest->host kick and Linux AIO completion.
>
> The QEMU_AIO_POLL_MAX_NS environment variable sets the number of nanoseconds to
> poll before entering the usual blocking poll(2) syscall. Try setting this
> variable to the time from old request completion to new virtqueue kick.
>
> By default no polling is done. The QEMU_AIO_POLL_MAX_NS must be set to get any
> polling!
>
> Karl: I hope you can try this patch series with several QEMU_AIO_POLL_MAX_NS
> values. If you don't find a good value we should double-check the tracing data
> to see if this experimental code can be improved.
>
> Stefan Hajnoczi (3):
> aio-posix: add aio_set_poll_handler()
> virtio: poll virtqueues for new buffers
> linux-aio: poll ring for completions
>
> aio-posix.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> block/linux-aio.c | 17 +++++++
> hw/virtio/virtio.c | 19 ++++++++
> include/block/aio.h | 16 +++++++
> 4 files changed, 185 insertions(+)
>
Another observation: With more iothreads than host CPUs the performance drops significantly.
^ permalink raw reply
* Re: [PATCH 31/35] staging: lustre: obdclass: add export for lprocfs_stats_alloc_one()
From: Greg Kroah-Hartman @ 2016-11-14 14:59 UTC (permalink / raw)
To: James Simmons
Cc: devel, Andreas Dilger, Oleg Drokin, Linux Kernel Mailing List,
Lustre Development List, Chennaiah Palla
In-Reply-To: <1478799065-24841-32-git-send-email-jsimmons@infradead.org>
On Thu, Nov 10, 2016 at 12:31:01PM -0500, James Simmons wrote:
> From: Chennaiah Palla <chennaiah.palla@seagate.com>
>
> When compiling the kernel without optimization, when using GCOV,
> the lprocfs_stats_alloc_one() symbol is not properly exported to
> other modules and causes the ptlrpc module to fail loading with
> an unknown symbol. Added EXPORT_SYMBOL(lprocfs_stats_alloc_one)
> so that this works properly.
No, let's fix this properly. Please get rid of lprocfs_stats_lock(), or
if you _really_ need it, move it to a .c file. Having it in a .h file
is just a mess, as this proves.
thanks,
greg k-h
^ permalink raw reply
* Re: [PATCH v2 01/11] x86/domctl: Add XEN_DOMCTL_set_avail_vcpus
From: Boris Ostrovsky @ 2016-11-14 14:59 UTC (permalink / raw)
To: Andrew Cooper, xen-devel; +Cc: wei.liu2, ian.jackson, jbeulich, roger.pau
In-Reply-To: <2c800659-3a47-fed7-0585-69d2aee36892@oracle.com>
On 11/09/2016 02:47 PM, Boris Ostrovsky wrote:
> On 11/09/2016 02:23 PM, Andrew Cooper wrote:
>> On 09/11/16 15:29, Boris Ostrovsky wrote:
>>> On 11/09/2016 10:04 AM, Andrew Cooper wrote:
>>>> On 09/11/16 14:39, Boris Ostrovsky wrote:
>>>>> This domctl is called when a VCPU is hot-(un)plugged to a guest (via
>>>>> 'xl vcpu-set'). While this currently is only intended to be needed by
>>>>> PVH guests we will call this domctl for all (x86) guests for consistency.
>>>>>
>>>>> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
>>>>> Acked-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>>>>> ---
>>>>> Changes in v2:
>>>>> * Added comment in arch_do_domctl() stating that the domctl is only required
>>>>> for PVH guests
>>>> I am not happy with this change until we understand why it is needed.
>>>>
>>>> Are we genuinely saying that there is no current enforcement in the
>>>> PV-hotplug mechanism?
>>> That's right. Don't call setup_cpu_watcher() in Linux and you will be
>>> running with maxvcpus.
>> /sigh - Quality engineering there...
>>
>> Yes - lets take the time to actually do this properly.
>>
>>>>> diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
>>>>> index 2a2fe04..b736d4c 100644
>>>>> --- a/xen/arch/x86/domctl.c
>>>>> +++ b/xen/arch/x86/domctl.c
>>>>> @@ -1430,6 +1430,23 @@ long arch_do_domctl(
>>>>> }
>>>>> break;
>>>>>
>>>>> + case XEN_DOMCTL_set_avail_vcpus:
>>>>> + {
>>>>> + unsigned int num = domctl->u.avail_vcpus.num;
>>>>> +
>>>>> + /*
>>>>> + * This is currently only needed by PVH guests (but
>>>>> + * any guest is free to make this call).
>>>>> + */
>>>>> + ret = -EINVAL;
>>>>> + if ( num > d->max_vcpus )
>>>>> + break;
>>>>> +
>>>>> + d->arch.avail_vcpus = num;
>>>>> + ret = 0;
>>>>> + break;
>>>>> + }
>>>> What do you actually mean by "avail_vcpus"? What happens if a vcpu
>>>> higher than the new number is currently online and running? What
>>>> happens to the already-existing vcpus-at-startup value?
>>> It shouldn't happen: we set avail_vcpus at domain creation time to
>>> vcpus-at-startup.
>>>
>>> The name is not great. It would have been better to have it online_vcpus
>>> but that usually means that VPF_down is set (which can happen, for
>>> example, when the guest offlines a VCPU).
>> How about an availability bitmap instead, which always has max_vcpus
>> bits in it? Xen should consult the bitmap before allowing a VM to
>> online a new vcpu.
> We could indeed use bitmap (and then it will actually be easier to
> handle io request as we can just copy appropriate bytes of the map
> instead of going bit-by-bit). This will still require the new domctl.
>
> I am not convinced though that we can start enforcing this new VCPU
> count, at least for PV guests. They expect to start all max VCPUs and
> then offline them. This, of course, can be fixed but all non-updated
> kernels will stop booting.
How about we don't clear _VPF_down if the bit in the availability bitmap
is not set?
-boris
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
^ permalink raw reply
* [lustre-devel] [PATCH 31/35] staging: lustre: obdclass: add export for lprocfs_stats_alloc_one()
From: Greg Kroah-Hartman @ 2016-11-14 14:59 UTC (permalink / raw)
To: James Simmons
Cc: devel, Andreas Dilger, Oleg Drokin, Linux Kernel Mailing List,
Lustre Development List, Chennaiah Palla
In-Reply-To: <1478799065-24841-32-git-send-email-jsimmons@infradead.org>
On Thu, Nov 10, 2016 at 12:31:01PM -0500, James Simmons wrote:
> From: Chennaiah Palla <chennaiah.palla@seagate.com>
>
> When compiling the kernel without optimization, when using GCOV,
> the lprocfs_stats_alloc_one() symbol is not properly exported to
> other modules and causes the ptlrpc module to fail loading with
> an unknown symbol. Added EXPORT_SYMBOL(lprocfs_stats_alloc_one)
> so that this works properly.
No, let's fix this properly. Please get rid of lprocfs_stats_lock(), or
if you _really_ need it, move it to a .c file. Having it in a .h file
is just a mess, as this proves.
thanks,
greg k-h
^ permalink raw reply
* [PATCH RFC] ARM: dts: add support for Turris Omnia
From: tomas.hlavacek at nic.cz @ 2016-11-14 14:59 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <20161114131010.GC26710@lunn.ch>
Hi Andrew!
(Sorry for re-posting the previous e-mail, that most likely didn't get
through.)
On Mon, Nov 14, 2016 at 2:10 PM, Andrew Lunn <andrew@lunn.ch> wrote:
>> Actually SFP is connected to SGMII interface of eth1, which is
>> routed through SERDES 5.
>
> You say eth1 here. Yet lower down you say got eth0 and eth1 are
> connected to the switch?
Oh sorry, this was a NIC name based on probing order derived from base
address of NIC registers:
eth1: ethernet at 30000 - probes as eth0
eth2: ethernet at 34000 - probes as eth1
eth0: ethernet at 70000 - probes as eth2
It is a bit confusing. I meant eth2 in DTS. Sorry.
>
>
>> We have our proprietary support hacked onto mvneta driver for
>> disconnecting PHY on the fly. It is a bit nasty, so I suggest to
>> ignore SFP in this DTS altogether and let's wait till "phylink based
>> SFP module support" or something alike hits upstream, so we can base
>> the SFP support on solid code;
>
> It would be great if you could work on getting the phylink patches
> into mainline. It is something i have wanted to do for a long time,
> but it is too low down on my priority list to get to. The code is high
> quality, so i don't think there will be too many issues. It probably
> just needs splitting up into smaller batches, submitting, and working
> on any comments.
That is exactly what I thought when I saw the patches for the first
time. I will try to merge the patches to the current kernel and see
what happens. I still need to learn a lot about PHY subsystem.
>
>
>> Actually eth0 and eth1 (both are RGMII) are connected to the 88E6176
>> switch. The problem is that from what I have read so far the switch
>> can not operate in DSA mode with two CPU ports.
>
> Again, this is something i wanted to do, and i did have a prototype at
> one point. But again, not enough time. If you have resources to work
> on this, i can find my code, explain my ideas, and let you complete
> it.
I am definitely interested, though I didn't have time to read and
absorb DSA yet, but I definitely want to try to hack 88E6176 support. I
would be really grateful if you can provide some pointers and/or code
to start from.
Thanks,
Tomas
^ permalink raw reply
* Re: [PATCH RFC] ARM: dts: add support for Turris Omnia
From: tomas.hlavacek @ 2016-11-14 14:59 UTC (permalink / raw)
To: Andrew Lunn
Cc: Mark Rutland, Martin Strba??ka, Jason Cooper,
Uwe Kleine-König, devicetree, Rob Herring, Gregory Clement,
linux-arm-kernel, Sebastian Hesselbarth
In-Reply-To: <20161114131010.GC26710@lunn.ch>
Hi Andrew!
(Sorry for re-posting the previous e-mail, that most likely didn't get
through.)
On Mon, Nov 14, 2016 at 2:10 PM, Andrew Lunn <andrew@lunn.ch> wrote:
>> Actually SFP is connected to SGMII interface of eth1, which is
>> routed through SERDES 5.
>
> You say eth1 here. Yet lower down you say got eth0 and eth1 are
> connected to the switch?
Oh sorry, this was a NIC name based on probing order derived from base
address of NIC registers:
eth1: ethernet@30000 - probes as eth0
eth2: ethernet@34000 - probes as eth1
eth0: ethernet@70000 - probes as eth2
It is a bit confusing. I meant eth2 in DTS. Sorry.
>
>
>> We have our proprietary support hacked onto mvneta driver for
>> disconnecting PHY on the fly. It is a bit nasty, so I suggest to
>> ignore SFP in this DTS altogether and let's wait till "phylink based
>> SFP module support" or something alike hits upstream, so we can base
>> the SFP support on solid code;
>
> It would be great if you could work on getting the phylink patches
> into mainline. It is something i have wanted to do for a long time,
> but it is too low down on my priority list to get to. The code is high
> quality, so i don't think there will be too many issues. It probably
> just needs splitting up into smaller batches, submitting, and working
> on any comments.
That is exactly what I thought when I saw the patches for the first
time. I will try to merge the patches to the current kernel and see
what happens. I still need to learn a lot about PHY subsystem.
>
>
>> Actually eth0 and eth1 (both are RGMII) are connected to the 88E6176
>> switch. The problem is that from what I have read so far the switch
>> can not operate in DSA mode with two CPU ports.
>
> Again, this is something i wanted to do, and i did have a prototype at
> one point. But again, not enough time. If you have resources to work
> on this, i can find my code, explain my ideas, and let you complete
> it.
I am definitely interested, though I didn't have time to read and
absorb DSA yet, but I definitely want to try to hack 88E6176 support. I
would be really grateful if you can provide some pointers and/or code
to start from.
Thanks,
Tomas
^ permalink raw reply
* Re: [PATCH v3 0/9] Qualcomm video decoder/encoder driver
From: Hans Verkuil @ 2016-11-14 14:59 UTC (permalink / raw)
To: Stanimir Varbanov, Javier Martinez Canillas
Cc: Mauro Carvalho Chehab, Andy Gross, Bjorn Andersson, Stephen Boyd,
Srinivas Kandagatla, Linux Media Mailing List, Linux Kernel,
linux-arm-msm
In-Reply-To: <2b178a80-2fa1-de90-a675-470150d07cf9@linaro.org>
On 11/14/2016 03:59 PM, Stanimir Varbanov wrote:
> Hi,
>
> On 11/11/2016 02:11 PM, Javier Martinez Canillas wrote:
>> Hello Hans,
>>
>> On Fri, Nov 11, 2016 at 8:49 AM, Hans Verkuil <hverkuil@xs4all.nl> wrote:
>>> Hi Stanimir,
>>>
>>> Overall it looks good. As you saw, I do have some comments but nothing major.
>>>
>>> One question: you use qcom as the directory name. How about using qualcomm?
>>>
>>> It's really not that much longer and a bit more obvious.
>>>
>>> Up to you, though.
>>>
>>
>> It seems qcom is more consistent to the name used in most subsystems
>> for Qualcomm:
>>
>> $ find -name *qcom
>> ./arch/arm/mach-qcom
>> ./arch/arm64/boot/dts/qcom
>> ./Documentation/devicetree/bindings/soc/qcom
>> ./sound/soc/qcom
>> ./drivers/pinctrl/qcom
>> ./drivers/soc/qcom
>> ./drivers/clk/qcom
>>
>> $ find -name *qualcomm
>> ./drivers/net/ethernet/qualcomm
>
> Also qcom is the vendor prefix used in [1]
>
> [1] Documentation/devicetree/bindings/vendor-prefixes.txt
>
qcom it is, then :-)
Hans
^ permalink raw reply
* Re: [PATCH] iommu/exynos: Add support for page access protection bits
From: Joerg Roedel @ 2016-11-14 15:00 UTC (permalink / raw)
To: Marek Szyprowski
Cc: iommu, linux-samsung-soc, Inki Dae, Kukjin Kim,
Krzysztof Kozlowski, Bartlomiej Zolnierkiewicz
In-Reply-To: <1478160285-14214-1-git-send-email-m.szyprowski@samsung.com>
On Thu, Nov 03, 2016 at 09:04:45AM +0100, Marek Szyprowski wrote:
> This patch add support for page access protection bits. Till now this
> feature was disabled and Exynos SYSMMU always mapped pages as read/write.
> Now page access bits are set according to the protection bits provided
> in iommu_map(), so Exynos SYSMMU is able to detect incorrect access to
> mapped pages. Exynos SYSMMU earlier than v5 doesn't support write-only
> mappings, so pages with such protection bits are mapped as read/write.
>
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
> ---
> drivers/iommu/exynos-iommu.c | 63 +++++++++++++++++++++++++++++++++++---------
> 1 file changed, 51 insertions(+), 12 deletions(-)
Applied, thanks Marek.
^ permalink raw reply
* Re: [qemu patch 2/2] kvmclock: reduce kvmclock difference on migration
From: Paolo Bonzini @ 2016-11-14 15:00 UTC (permalink / raw)
To: Marcelo Tosatti
Cc: Eduardo Habkost, kvm, Juan Quintela, Radim Krcmar, qemu-devel,
Dr. David Alan Gilbert
In-Reply-To: <20161114145054.GA28663@amt.cnet>
On 14/11/2016 15:50, Marcelo Tosatti wrote:
> Well, i didnt want to mix the meaning of the variables:
>
> + /* whether machine supports reliable KVM_GET_CLOCK */
> + bool mach_use_reliable_get_clock;
> +
> + /* whether source host supported reliable KVM_GET_CLOCK */
> + bool src_use_reliable_get_clock;
>
> See the comments on top (later if you look at the variable,
> then have to think: well it has one name, but its disabled
> by that other path as well, so its more than its
> name,etc...).
>
>> I'm thinking "mach_use_reliable_get_clock is just for migration,
>
> Thats whether the machine supports it. New machines have it enabled,
> olders don't.
Yes.
>> src_use_reliable_get_clock is the state".
>
> Thats whether the migration source supported it.
But it's not used only for migration. It's used on every vmstate change
(running->stop and stop->running, isn't it? I think that, apart from
the migration case, it's better to use s->clock if kvmclock is stable,
even on older machine types.
>>>>> +static bool kvmclock_src_use_reliable_get_clock(void *opaque)
>>>>> +{
>>>>> + KVMClockState *s = opaque;
>>>>> +
>>>>> + /*
>>>>> + * On machine types that support reliable KVM_GET_CLOCK,
>>>>> + * if host kernel does provide reliable KVM_GET_CLOCK,
>>>>> + * set src_use_reliable_get_clock=true so that destination
>>>>> + * avoids reading kvmclock from memory.
>>>>> + */
>>>>> + if (s->mach_use_reliable_get_clock && kvm_has_adjust_clock_stable()) {
>>>>> + s->src_use_reliable_get_clock = true;
>>>>> + }
>>>>> +
>>>>> + return s->src_use_reliable_get_clock;
>>>>> +}
>>>>
>>>> Here you can just return s->mach_use_reliable_get_clock.
>>>
>>> mach_use_reliable_get_clock can be true but host might not support it.
>>
>> Yes, but the "needed" function is only required to avoid breaking
>> pc-i440fx-2.7 and earlier.
>
> "needed" is required so that the migration between:
>
> SRC DEST BEHAVIOUR
> ~support supports on migration read from guest,
> on stop/cont use
> kvm_get_clock/kvm_set_clock
>
> Destination does not use KVM_GET_CLOCK value (which is
> broken and should not be used).
If needed returns false, the destination will see
src_use_reliable_get_clock = false anyway.
If needed returns true, the destination can still see
src_use_reliable_get_clock = false if that's the value.
needed src_use_reliable_get_clock effect
false false use kvmclock_current_nsec
false true use kvmclock_current_nsec
true false use kvmclock_current_nsec
true true use s->clock
So the idea is:
- set s->clock and s->reliable_get_clock on every KVM_GET_CLOCK
- on migration source, use subsections and
s->mach_use_reliable_get_clock to avoid breaking migration on pre-2.8
machine types
- on migration destination, use .pre_load so that s->reliable_get_clock
is initialized to false on older machine types
>> If you return true here, you can still
>> migrate a "false" value for src_use_reliable_get_clock.
>
> But the source only uses a reliable KVM_GET_CLOCK if
> both conditions are true.
>
> And the subsection is only needed if the source
> uses a reliable KVM_GET_CLOCK.
Yes, but the point of the subsection is just to avoid breaking migration
format.
>> It is the same as "is using masterclock", which is actually a stricter
>> condition than the KVM_CHECK_EXTENSION return value. The right check to
>> use is whether masterclock is in use,
>
> Actually its "has a reliable KVM_GET_CLOCK" (which returns
> get_kernel_clock() + (rdtsc() - tsc_timestamp),
>
> "broken KVM_GET_CLOCK" = get_kernel_clock()
Yes. And these end up being the same.
Paolo
^ permalink raw reply
* [patch net-next v2 0/8] Add support for offloading packet-sampling
From: Jiri Pirko @ 2016-11-14 15:00 UTC (permalink / raw)
To: netdev
Cc: davem, yotamg, idosch, eladr, nogahf, ogerlitz, jhs,
geert+renesas, stephen, xiyou.wangcong, linux, roopa,
john.fastabend, simon.horman
From: Jiri Pirko <jiri@mellanox.com>
Add the sample tc action, which allows to sample packet matching
a classifier. The sample action peeks randomly packets, duplicates them,
truncates them and adds informative metadata on the packet, for example,
the input interface and the original packet length. The sampled packets
are marked to allow matching them and redirecting them to a specific
collector device.
The sampled packets metadata is packed using ife encapsulation. To do
that, this patch-set extracts ife logics from the tc_ife action into an
independent ife module, and uses that functionality to pack the metadata.
To include all the needed metadata, this patch-set introduces some new
IFE_META tlv types.
In addition, Add the support for offloading the macthall-sample tc command
in the Mellanox mlxsw driver, for ingress qdiscs.
Userspace examples for that code can be found in:
- https://github.com/yotamgi/host-sflow: sflow client that uses the sample
with combination of tap device to sample packets and send to a
centralized sflow collector.
- https://github.com/yotamgi/libife: a library for manipulating ife
packets in userspace. The library is used in the host-sflow program to
parse the sampled packets.
---
v1->v2:
- Change the sampling to be random by default, other than sampling exactly
every n'th packet
- Change to use __be types in the ife module
rfc->v1:
- Change ifindex sampled packets metadatum to in_ifindex and out_ifindex
- Add sequence number metadatum to sampled packets
- Add sampler_id metadatum to sampled packets
- Make the user kernel interface extensible
- Move the sampling helper function to the ife module
- Fix ife header to be safe when CONFIG_NET_IFE is not set
- Made the sampled packets eth_type field mandatory other then optional
- Change the IFE_META* fields to be enum
- Remove the ife_packet_info struct and pass the parameters directly to
the ife_packet_ifo_pack function
- Couple of more styling and cosmetic issues
Yotam Gigi (8):
Introduce ife encapsulation module
act_ife: Change to use ife module
net: ife: Introduce new metadata tlv types
net: ife: Introduce packet info packing method
Introduce sample tc action
tc: sample: Add sequence number and sampler_id fields
mlxsw: reg: add the Monitoring Packet Sampling Configuration Register
mlxsw: packet sample: Add packet sample offloading support
MAINTAINERS | 7 +
drivers/net/ethernet/mellanox/mlxsw/reg.h | 38 ++++
drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 120 +++++++++-
drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 12 +
drivers/net/ethernet/mellanox/mlxsw/trap.h | 1 +
include/net/ife.h | 63 ++++++
include/net/tc_act/tc_ife.h | 3 -
include/net/tc_act/tc_sample.h | 73 +++++++
include/uapi/linux/Kbuild | 1 +
include/uapi/linux/ife.h | 24 ++
include/uapi/linux/tc_act/Kbuild | 1 +
include/uapi/linux/tc_act/tc_ife.h | 10 +-
include/uapi/linux/tc_act/tc_sample.h | 29 +++
net/Kconfig | 1 +
net/Makefile | 1 +
net/ife/Kconfig | 16 ++
net/ife/Makefile | 5 +
net/ife/ife.c | 199 +++++++++++++++++
net/sched/Kconfig | 14 ++
net/sched/Makefile | 1 +
net/sched/act_ife.c | 109 +++-------
net/sched/act_sample.c | 290 +++++++++++++++++++++++++
22 files changed, 921 insertions(+), 97 deletions(-)
create mode 100644 include/net/ife.h
create mode 100644 include/net/tc_act/tc_sample.h
create mode 100644 include/uapi/linux/ife.h
create mode 100644 include/uapi/linux/tc_act/tc_sample.h
create mode 100644 net/ife/Kconfig
create mode 100644 net/ife/Makefile
create mode 100644 net/ife/ife.c
create mode 100644 net/sched/act_sample.c
--
2.7.4
^ permalink raw reply
* [patch net-next v2 1/8] Introduce ife encapsulation module
From: Jiri Pirko @ 2016-11-14 15:00 UTC (permalink / raw)
To: netdev
Cc: davem, yotamg, idosch, eladr, nogahf, ogerlitz, jhs,
geert+renesas, stephen, xiyou.wangcong, linux, roopa,
john.fastabend, simon.horman
In-Reply-To: <1479135638-3580-1-git-send-email-jiri@resnulli.us>
From: Yotam Gigi <yotamg@mellanox.com>
This module is responsible for the ife encapsulation protocol
encode/decode logics. That module can:
- ife_encode: encode skb and reserve space for the ife meta header
- ife_decode: decode skb and extract the meta header size
- ife_tlv_meta_encode - encodes one tlv entry into the reserved ife
header space.
- ife_tlv_meta_decode - decodes one tlv entry from the packet
- ife_tlv_meta_next - advance to the next tlv
Signed-off-by: Yotam Gigi <yotamg@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
MAINTAINERS | 7 +++
include/net/ife.h | 52 +++++++++++++++++
include/uapi/linux/Kbuild | 1 +
include/uapi/linux/ife.h | 18 ++++++
net/Kconfig | 1 +
net/Makefile | 1 +
net/ife/Kconfig | 16 ++++++
net/ife/Makefile | 5 ++
net/ife/ife.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++
9 files changed, 245 insertions(+)
create mode 100644 include/net/ife.h
create mode 100644 include/uapi/linux/ife.h
create mode 100644 net/ife/Kconfig
create mode 100644 net/ife/Makefile
create mode 100644 net/ife/ife.c
diff --git a/MAINTAINERS b/MAINTAINERS
index e5c17a9..cc3e640 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -6114,6 +6114,13 @@ F: include/net/cfg802154.h
F: include/net/ieee802154_netdev.h
F: Documentation/networking/ieee802154.txt
+IFE PROTOCOL
+M: Yotam Gigi <yotamg@mellanox.com>
+M: Jamal Hadi Salim <jhs@mojatatu.com>
+F: net/ife
+F: include/net/ife.h
+F: include/uapi/linux/ife.h
+
IGORPLUG-USB IR RECEIVER
M: Sean Young <sean@mess.org>
L: linux-media@vger.kernel.org
diff --git a/include/net/ife.h b/include/net/ife.h
new file mode 100644
index 0000000..a75d4e0
--- /dev/null
+++ b/include/net/ife.h
@@ -0,0 +1,52 @@
+#ifndef __NET_IFE_H
+#define __NET_IFE_H
+
+#include <uapi/linux/ife.h>
+#include <linux/etherdevice.h>
+#include <linux/rtnetlink.h>
+#include <linux/module.h>
+#include <uapi/linux/ife.h>
+
+#if IS_ENABLED(CONFIG_NET_IFE)
+
+void *ife_encode(struct sk_buff *skb, u16 metalen);
+void *ife_decode(struct sk_buff *skb, u16 *metalen);
+
+void *ife_tlv_meta_decode(void *skbdata, u16 *attrtype, u16 *dlen, u16 *totlen);
+int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen,
+ const void *dval);
+
+void *ife_tlv_meta_next(void *skbdata);
+
+#else
+
+static inline void *ife_encode(struct sk_buff *skb, u16 metalen)
+{
+ return NULL;
+}
+
+static inline void *ife_decode(struct sk_buff *skb, u16 *metalen)
+{
+ return NULL;
+}
+
+static inline void *ife_tlv_meta_decode(void *skbdata, u16 *attrtype, u16 *dlen,
+ u16 *totlen)
+{
+ return NULL;
+}
+
+static inline int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen,
+ const void *dval)
+{
+ return 0;
+}
+
+static inline void *ife_tlv_meta_next(void *skbdata)
+{
+ return NULL;
+}
+
+#endif
+
+#endif /* __NET_IFE_H */
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild
index cd2be1c..eabf838 100644
--- a/include/uapi/linux/Kbuild
+++ b/include/uapi/linux/Kbuild
@@ -191,6 +191,7 @@ header-y += if_tun.h
header-y += if_tunnel.h
header-y += if_vlan.h
header-y += if_x25.h
+header-y += ife.h
header-y += igmp.h
header-y += ila.h
header-y += in6.h
diff --git a/include/uapi/linux/ife.h b/include/uapi/linux/ife.h
new file mode 100644
index 0000000..2954da3
--- /dev/null
+++ b/include/uapi/linux/ife.h
@@ -0,0 +1,18 @@
+#ifndef __UAPI_IFE_H
+#define __UAPI_IFE_H
+
+#define IFE_METAHDRLEN 2
+
+enum {
+ IFE_META_SKBMARK = 1,
+ IFE_META_HASHID,
+ IFE_META_PRIO,
+ IFE_META_QMAP,
+ IFE_META_TCINDEX,
+ __IFE_META_MAX
+};
+
+/*Can be overridden at runtime by module option*/
+#define IFE_META_MAX (__IFE_META_MAX - 1)
+
+#endif
diff --git a/net/Kconfig b/net/Kconfig
index 7b6cd34..3cf29b1 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -393,6 +393,7 @@ source "net/9p/Kconfig"
source "net/caif/Kconfig"
source "net/ceph/Kconfig"
source "net/nfc/Kconfig"
+source "net/ife/Kconfig"
config LWTUNNEL
bool "Network light weight tunnels"
diff --git a/net/Makefile b/net/Makefile
index 4cafaa2..4ddc67e 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -69,6 +69,7 @@ obj-$(CONFIG_DNS_RESOLVER) += dns_resolver/
obj-$(CONFIG_CEPH_LIB) += ceph/
obj-$(CONFIG_BATMAN_ADV) += batman-adv/
obj-$(CONFIG_NFC) += nfc/
+obj-$(CONFIG_NET_IFE) += ife/
obj-$(CONFIG_OPENVSWITCH) += openvswitch/
obj-$(CONFIG_VSOCKETS) += vmw_vsock/
obj-$(CONFIG_MPLS) += mpls/
diff --git a/net/ife/Kconfig b/net/ife/Kconfig
new file mode 100644
index 0000000..31e48b6
--- /dev/null
+++ b/net/ife/Kconfig
@@ -0,0 +1,16 @@
+#
+# IFE subsystem configuration
+#
+
+menuconfig NET_IFE
+ depends on NET
+ tristate "Inter-FE based on IETF ForCES InterFE LFB"
+ default n
+ help
+ Say Y here to add support of IFE encapsulation protocol
+ For details refer to netdev01 paper:
+ "Distributing Linux Traffic Control Classifier-Action Subsystem"
+ Authors: Jamal Hadi Salim and Damascene M. Joachimpillai
+
+ To compile this support as a module, choose M here: the module will
+ be called ife.
diff --git a/net/ife/Makefile b/net/ife/Makefile
new file mode 100644
index 0000000..2a90d97
--- /dev/null
+++ b/net/ife/Makefile
@@ -0,0 +1,5 @@
+#
+# Makefile for the IFE encapsulation protocol
+#
+
+obj-$(CONFIG_NET_IFE) += ife.o
diff --git a/net/ife/ife.c b/net/ife/ife.c
new file mode 100644
index 0000000..3642f43
--- /dev/null
+++ b/net/ife/ife.c
@@ -0,0 +1,144 @@
+/*
+ * net/ife/ife.c - Inter-FE protocol based on ForCES WG InterFE LFB
+ * Copyright (c) 2015 Jamal Hadi Salim <jhs@mojatatu.com>
+ * Copyright (c) 2016 Yotam Gigi <yotamg@mellanox.com>
+ *
+ * Refer to: draft-ietf-forces-interfelfb-03 and netdev01 paper:
+ * "Distributing Linux Traffic Control Classifier-Action Subsystem"
+ * Authors: Jamal Hadi Salim and Damascene M. Joachimpillai
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation.
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/skbuff.h>
+#include <linux/rtnetlink.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <net/net_namespace.h>
+#include <net/netlink.h>
+#include <net/pkt_sched.h>
+#include <linux/etherdevice.h>
+#include <net/ife.h>
+
+struct ifeheadr {
+ __be16 metalen;
+ u8 tlv_data[];
+};
+
+void *ife_encode(struct sk_buff *skb, u16 metalen)
+{
+ /* OUTERHDR:TOTMETALEN:{TLVHDR:Metadatum:TLVHDR..}:ORIGDATA
+ * where ORIGDATA = original ethernet header ...
+ */
+ int hdrm = metalen + IFE_METAHDRLEN;
+ int total_push = hdrm + skb->dev->hard_header_len;
+ struct ifeheadr *ifehdr;
+ struct ethhdr *iethh; /* inner ether header */
+ int skboff = 0;
+ int err;
+
+ err = skb_cow_head(skb, total_push);
+ if (unlikely(err))
+ return NULL;
+
+ iethh = (struct ethhdr *) skb->data;
+
+ __skb_push(skb, total_push);
+ memcpy(skb->data, iethh, skb->dev->hard_header_len);
+ skb_reset_mac_header(skb);
+ skboff += skb->dev->hard_header_len;
+
+ /* total metadata length */
+ ifehdr = (struct ifeheadr *) (skb->data + skboff);
+ metalen += IFE_METAHDRLEN;
+ ifehdr->metalen = htons(metalen);
+
+ return ifehdr->tlv_data;
+}
+EXPORT_SYMBOL_GPL(ife_encode);
+
+void *ife_decode(struct sk_buff *skb, u16 *metalen)
+{
+ struct ifeheadr *ifehdr;
+ int total_pull;
+ u16 ifehdrln;
+
+ ifehdr = (struct ifeheadr *) (skb->data + skb->dev->hard_header_len);
+ ifehdrln = ifehdr->metalen;
+ ifehdrln = ntohs(ifehdrln);
+ total_pull = skb->dev->hard_header_len + ifehdrln;
+
+ if (unlikely(ifehdrln < 2))
+ return NULL;
+
+ if (unlikely(!pskb_may_pull(skb, total_pull)))
+ return NULL;
+
+ skb_set_mac_header(skb, total_pull);
+ __skb_pull(skb, total_pull);
+ *metalen = ifehdrln - IFE_METAHDRLEN;
+
+ return &ifehdr->tlv_data;
+}
+EXPORT_SYMBOL_GPL(ife_decode);
+
+struct meta_tlvhdr {
+ __be16 type;
+ __be16 len;
+};
+
+/* Caller takes care of presenting data in network order
+ */
+void *ife_tlv_meta_decode(void *skbdata, u16 *attrtype, u16 *dlen, u16 *totlen)
+{
+ struct meta_tlvhdr *tlv = (struct meta_tlvhdr *) skbdata;
+
+ *dlen = ntohs(tlv->len) - NLA_HDRLEN;
+ *attrtype = ntohs(tlv->type);
+
+ if (totlen)
+ *totlen = nla_total_size(*dlen);
+
+ return skbdata + sizeof(struct meta_tlvhdr);
+}
+EXPORT_SYMBOL_GPL(ife_tlv_meta_decode);
+
+void *ife_tlv_meta_next(void *skbdata)
+{
+ struct meta_tlvhdr *tlv = (struct meta_tlvhdr *) skbdata;
+ u16 tlvlen = tlv->len;
+
+ tlvlen = ntohs(tlvlen);
+ tlvlen = NLA_ALIGN(tlvlen);
+
+ return skbdata + tlvlen;
+}
+EXPORT_SYMBOL_GPL(ife_tlv_meta_next);
+
+/* Caller takes care of presenting data in network order
+ */
+int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, const void *dval)
+{
+ __be32 *tlv = (u32 *) (skbdata);
+ u16 totlen = nla_total_size(dlen); /*alignment + hdr */
+ char *dptr = (char *) tlv + NLA_HDRLEN;
+ u32 htlv = attrtype << 16 | (dlen + NLA_HDRLEN);
+
+ *tlv = htonl(htlv);
+ memset(dptr, 0, totlen - NLA_HDRLEN);
+ memcpy(dptr, dval, dlen);
+
+ return totlen;
+}
+EXPORT_SYMBOL_GPL(ife_tlv_meta_encode);
+
+MODULE_AUTHOR("Jamal Hadi Salim <jhs@mojatatu.com>");
+MODULE_AUTHOR("Yotam Gigi <yotamg@mellanox.com>");
+MODULE_DESCRIPTION("Inter-FE LFB action");
+MODULE_LICENSE("GPL");
--
2.7.4
^ permalink raw reply related
* [patch net-next v2 2/8] act_ife: Change to use ife module
From: Jiri Pirko @ 2016-11-14 15:00 UTC (permalink / raw)
To: netdev
Cc: davem, yotamg, idosch, eladr, nogahf, ogerlitz, jhs,
geert+renesas, stephen, xiyou.wangcong, linux, roopa,
john.fastabend, simon.horman
In-Reply-To: <1479135638-3580-1-git-send-email-jiri@resnulli.us>
From: Yotam Gigi <yotamg@mellanox.com>
Use the encode/decode functionality from the ife module instead of using
implementation inside the act_ife.
Signed-off-by: Yotam Gigi <yotamg@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
include/net/tc_act/tc_ife.h | 3 -
include/uapi/linux/tc_act/tc_ife.h | 10 +---
net/sched/Kconfig | 1 +
net/sched/act_ife.c | 109 +++++++++++--------------------------
4 files changed, 34 insertions(+), 89 deletions(-)
diff --git a/include/net/tc_act/tc_ife.h b/include/net/tc_act/tc_ife.h
index 9fd2bea0..30ba459 100644
--- a/include/net/tc_act/tc_ife.h
+++ b/include/net/tc_act/tc_ife.h
@@ -6,7 +6,6 @@
#include <linux/rtnetlink.h>
#include <linux/module.h>
-#define IFE_METAHDRLEN 2
struct tcf_ife_info {
struct tc_action common;
u8 eth_dst[ETH_ALEN];
@@ -45,8 +44,6 @@ struct tcf_meta_ops {
int ife_get_meta_u32(struct sk_buff *skb, struct tcf_meta_info *mi);
int ife_get_meta_u16(struct sk_buff *skb, struct tcf_meta_info *mi);
-int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen,
- const void *dval);
int ife_alloc_meta_u32(struct tcf_meta_info *mi, void *metaval, gfp_t gfp);
int ife_alloc_meta_u16(struct tcf_meta_info *mi, void *metaval, gfp_t gfp);
int ife_check_meta_u32(u32 metaval, struct tcf_meta_info *mi);
diff --git a/include/uapi/linux/tc_act/tc_ife.h b/include/uapi/linux/tc_act/tc_ife.h
index cd18360..7c28178 100644
--- a/include/uapi/linux/tc_act/tc_ife.h
+++ b/include/uapi/linux/tc_act/tc_ife.h
@@ -3,6 +3,7 @@
#include <linux/types.h>
#include <linux/pkt_cls.h>
+#include <linux/ife.h>
#define TCA_ACT_IFE 25
/* Flag bits for now just encoding/decoding; mutually exclusive */
@@ -28,13 +29,4 @@ enum {
};
#define TCA_IFE_MAX (__TCA_IFE_MAX - 1)
-#define IFE_META_SKBMARK 1
-#define IFE_META_HASHID 2
-#define IFE_META_PRIO 3
-#define IFE_META_QMAP 4
-#define IFE_META_TCINDEX 5
-/*Can be overridden at runtime by module option*/
-#define __IFE_META_MAX 6
-#define IFE_META_MAX (__IFE_META_MAX - 1)
-
#endif
diff --git a/net/sched/Kconfig b/net/sched/Kconfig
index 87956a7..24f7cac 100644
--- a/net/sched/Kconfig
+++ b/net/sched/Kconfig
@@ -763,6 +763,7 @@ config NET_ACT_SKBMOD
config NET_ACT_IFE
tristate "Inter-FE action based on IETF ForCES InterFE LFB"
depends on NET_CLS_ACT
+ select NET_IFE
---help---
Say Y here to allow for sourcing and terminating metadata
For details refer to netdev01 paper:
diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c
index 95c463c..5c2478a 100644
--- a/net/sched/act_ife.c
+++ b/net/sched/act_ife.c
@@ -32,6 +32,7 @@
#include <uapi/linux/tc_act/tc_ife.h>
#include <net/tc_act/tc_ife.h>
#include <linux/etherdevice.h>
+#include <net/ife.h>
#define IFE_TAB_MASK 15
@@ -46,23 +47,6 @@ static const struct nla_policy ife_policy[TCA_IFE_MAX + 1] = {
[TCA_IFE_TYPE] = { .type = NLA_U16},
};
-/* Caller takes care of presenting data in network order
-*/
-int ife_tlv_meta_encode(void *skbdata, u16 attrtype, u16 dlen, const void *dval)
-{
- u32 *tlv = (u32 *)(skbdata);
- u16 totlen = nla_total_size(dlen); /*alignment + hdr */
- char *dptr = (char *)tlv + NLA_HDRLEN;
- u32 htlv = attrtype << 16 | (dlen + NLA_HDRLEN);
-
- *tlv = htonl(htlv);
- memset(dptr, 0, totlen - NLA_HDRLEN);
- memcpy(dptr, dval, dlen);
-
- return totlen;
-}
-EXPORT_SYMBOL_GPL(ife_tlv_meta_encode);
-
int ife_encode_meta_u16(u16 metaval, void *skbdata, struct tcf_meta_info *mi)
{
u16 edata = 0;
@@ -637,69 +621,60 @@ int find_decode_metaid(struct sk_buff *skb, struct tcf_ife_info *ife,
return 0;
}
-struct ifeheadr {
- __be16 metalen;
- u8 tlv_data[];
-};
-
-struct meta_tlvhdr {
- __be16 type;
- __be16 len;
-};
-
static int tcf_ife_decode(struct sk_buff *skb, const struct tc_action *a,
struct tcf_result *res)
{
struct tcf_ife_info *ife = to_ife(a);
+ u32 at = G_TC_AT(skb->tc_verd);
int action = ife->tcf_action;
- struct ifeheadr *ifehdr = (struct ifeheadr *)skb->data;
- int ifehdrln = (int)ifehdr->metalen;
- struct meta_tlvhdr *tlv = (struct meta_tlvhdr *)(ifehdr->tlv_data);
+ u8 *ifehdr_end;
+ u8 *tlv_data;
+ u16 metalen;
spin_lock(&ife->tcf_lock);
bstats_update(&ife->tcf_bstats, skb);
tcf_lastuse_update(&ife->tcf_tm);
spin_unlock(&ife->tcf_lock);
- ifehdrln = ntohs(ifehdrln);
- if (unlikely(!pskb_may_pull(skb, ifehdrln))) {
+ if (!(at & AT_EGRESS))
+ skb_push(skb, skb->dev->hard_header_len);
+
+ tlv_data = ife_decode(skb, &metalen);
+ if (unlikely(!tlv_data)) {
spin_lock(&ife->tcf_lock);
ife->tcf_qstats.drops++;
spin_unlock(&ife->tcf_lock);
return TC_ACT_SHOT;
}
- skb_set_mac_header(skb, ifehdrln);
- __skb_pull(skb, ifehdrln);
- skb->protocol = eth_type_trans(skb, skb->dev);
- ifehdrln -= IFE_METAHDRLEN;
-
- while (ifehdrln > 0) {
- u8 *tlvdata = (u8 *)tlv;
- u16 mtype = tlv->type;
- u16 mlen = tlv->len;
- u16 alen;
+ ifehdr_end = tlv_data + metalen;
+ for (; tlv_data < ifehdr_end; tlv_data = ife_tlv_meta_next(tlv_data)) {
+ u8 *curr_data;
+ u16 mtype;
+ u16 dlen;
- mtype = ntohs(mtype);
- mlen = ntohs(mlen);
- alen = NLA_ALIGN(mlen);
+ curr_data = ife_tlv_meta_decode(tlv_data, &mtype, &dlen, NULL);
- if (find_decode_metaid(skb, ife, mtype, (mlen - NLA_HDRLEN),
- (void *)(tlvdata + NLA_HDRLEN))) {
+ if (find_decode_metaid(skb, ife, mtype, dlen, curr_data)) {
/* abuse overlimits to count when we receive metadata
* but dont have an ops for it
*/
- pr_info_ratelimited("Unknown metaid %d alnlen %d\n",
- mtype, mlen);
+ pr_info_ratelimited("Unknown metaid %d dlen %d\n",
+ mtype, dlen);
ife->tcf_qstats.overlimits++;
}
+ }
- tlvdata += alen;
- ifehdrln -= alen;
- tlv = (struct meta_tlvhdr *)tlvdata;
+ if (WARN_ON(tlv_data != ifehdr_end)) {
+ spin_lock(&ife->tcf_lock);
+ ife->tcf_qstats.drops++;
+ spin_unlock(&ife->tcf_lock);
+ return TC_ACT_SHOT;
}
+ skb->protocol = eth_type_trans(skb, skb->dev);
skb_reset_network_header(skb);
+
return action;
}
@@ -727,7 +702,6 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a,
struct tcf_ife_info *ife = to_ife(a);
int action = ife->tcf_action;
struct ethhdr *oethh; /* outer ether header */
- struct ethhdr *iethh; /* inner eth header */
struct tcf_meta_info *e;
/*
OUTERHDR:TOTMETALEN:{TLVHDR:Metadatum:TLVHDR..}:ORIGDATA
@@ -735,10 +709,11 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a,
*/
u16 metalen = ife_get_sz(skb, ife);
int hdrm = metalen + skb->dev->hard_header_len + IFE_METAHDRLEN;
- unsigned int skboff = skb->dev->hard_header_len;
+ unsigned int skboff = 0;
u32 at = G_TC_AT(skb->tc_verd);
int new_len = skb->len + hdrm;
bool exceed_mtu = false;
+ void *ife_meta;
int err;
if (at & AT_EGRESS) {
@@ -766,27 +741,10 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a,
return TC_ACT_SHOT;
}
- err = skb_cow_head(skb, hdrm);
- if (unlikely(err)) {
- ife->tcf_qstats.drops++;
- spin_unlock(&ife->tcf_lock);
- return TC_ACT_SHOT;
- }
-
if (!(at & AT_EGRESS))
skb_push(skb, skb->dev->hard_header_len);
- iethh = (struct ethhdr *)skb->data;
- __skb_push(skb, hdrm);
- memcpy(skb->data, iethh, skb->mac_len);
- skb_reset_mac_header(skb);
- oethh = eth_hdr(skb);
-
- /*total metadata length */
- metalen += IFE_METAHDRLEN;
- metalen = htons(metalen);
- memcpy((skb->data + skboff), &metalen, IFE_METAHDRLEN);
- skboff += IFE_METAHDRLEN;
+ ife_meta = ife_encode(skb, metalen);
/* XXX: we dont have a clever way of telling encode to
* not repeat some of the computations that are done by
@@ -794,7 +752,7 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a,
*/
list_for_each_entry(e, &ife->metalist, metalist) {
if (e->ops->encode) {
- err = e->ops->encode(skb, (void *)(skb->data + skboff),
+ err = e->ops->encode(skb, (void *)(ife_meta + skboff),
e);
}
if (err < 0) {
@@ -805,15 +763,12 @@ static int tcf_ife_encode(struct sk_buff *skb, const struct tc_action *a,
}
skboff += err;
}
+ oethh = (struct ethhdr *)skb->data;
if (!is_zero_ether_addr(ife->eth_src))
ether_addr_copy(oethh->h_source, ife->eth_src);
- else
- ether_addr_copy(oethh->h_source, iethh->h_source);
if (!is_zero_ether_addr(ife->eth_dst))
ether_addr_copy(oethh->h_dest, ife->eth_dst);
- else
- ether_addr_copy(oethh->h_dest, iethh->h_dest);
oethh->h_proto = htons(ife->eth_type);
if (!(at & AT_EGRESS))
--
2.7.4
^ permalink raw reply related
* [patch net-next v2 3/8] net: ife: Introduce new metadata tlv types
From: Jiri Pirko @ 2016-11-14 15:00 UTC (permalink / raw)
To: netdev
Cc: davem, yotamg, idosch, eladr, nogahf, ogerlitz, jhs,
geert+renesas, stephen, xiyou.wangcong, linux, roopa,
john.fastabend, simon.horman
In-Reply-To: <1479135638-3580-1-git-send-email-jiri@resnulli.us>
From: Yotam Gigi <yotamg@mellanox.com>
IFE_META_IN_IFINDEX: Allow to pass input ifindex value as part of the
ife metadata
IFE_META_OUT_IFINDEX: Allow to pass output ifindex value as part of the
ife metadata
IFE_META_ORIG_SIZE: Allow to pass the original packet size as part of
the ife metadata. Can be used in case that the packet is truncated
IFE_META_SIZE: Allow to pass the size of the encapsulated packet as
part of the ife metadata
Signed-off-by: Yotam Gigi <yotamg@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
include/uapi/linux/ife.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/include/uapi/linux/ife.h b/include/uapi/linux/ife.h
index 2954da3..ebdd785 100644
--- a/include/uapi/linux/ife.h
+++ b/include/uapi/linux/ife.h
@@ -9,6 +9,10 @@ enum {
IFE_META_PRIO,
IFE_META_QMAP,
IFE_META_TCINDEX,
+ IFE_META_IN_IFINDEX,
+ IFE_META_OUT_IFINDEX,
+ IFE_META_ORIGSIZE,
+ IFE_META_SIZE,
__IFE_META_MAX
};
--
2.7.4
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.