[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 34/53] xen/drivers/passthrough/iommu.c: let custom parameter parsing routines return errno
Modify the custom parameter parsing routines in: xen/drivers/passthrough/iommu.c to indicate whether the parameter value was parsed successfully. This at once fixes a potential problem with multiple iommu=... parameters: before the change iommu=no iommu=yes would switch iommu off. Cc: Jan Beulich <jbeulich@xxxxxxxx> Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- V4: - adapt parse_bool() call (Jan Beulich) V3: - dont modify option value in parsing function --- xen/drivers/passthrough/iommu.c | 52 +++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index f1aefc47ce..1aecf7cf34 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -21,7 +21,7 @@ #include <xen/keyhandler.h> #include <xsm/xsm.h> -static void parse_iommu_param(char *s); +static int parse_iommu_param(const char *s); static void iommu_dump_p2m_table(unsigned char key); unsigned int __read_mostly iommu_dev_iotlb_timeout = 1000; @@ -78,10 +78,10 @@ DEFINE_SPINLOCK(iommu_pt_cleanup_lock); PAGE_LIST_HEAD(iommu_pt_cleanup_list); static struct tasklet iommu_pt_cleanup_tasklet; -static void __init parse_iommu_param(char *s) +static int __init parse_iommu_param(const char *s) { - char *ss; - int val; + const char *ss; + int val, b, rc = 0; do { val = !!strncmp(s, "no-", 3); @@ -89,44 +89,50 @@ static void __init parse_iommu_param(char *s) s += 3; ss = strchr(s, ','); - if ( ss ) - *ss = '\0'; - - if ( !parse_bool(s, NULL) ) - iommu_enable = 0; - else if ( !strcmp(s, "force") || !strcmp(s, "required") ) + if ( !ss ) + ss = strchr(s, '\0'); + + b = parse_bool(s, ss); + if ( b >= 0 ) + iommu_enable = b; + else if ( !strncmp(s, "force", ss - s) || + !strncmp(s, "required", ss - s) ) force_iommu = val; - else if ( !strcmp(s, "workaround_bios_bug") ) + else if ( !strncmp(s, "workaround_bios_bug", ss - s) ) iommu_workaround_bios_bug = val; - else if ( !strcmp(s, "igfx") ) + else if ( !strncmp(s, "igfx", ss - s) ) iommu_igfx = val; - else if ( !strcmp(s, "verbose") ) + else if ( !strncmp(s, "verbose", ss - s) ) iommu_verbose = val; - else if ( !strcmp(s, "snoop") ) + else if ( !strncmp(s, "snoop", ss - s) ) iommu_snoop = val; - else if ( !strcmp(s, "qinval") ) + else if ( !strncmp(s, "qinval", ss - s) ) iommu_qinval = val; - else if ( !strcmp(s, "intremap") ) + else if ( !strncmp(s, "intremap", ss - s) ) iommu_intremap = val; - else if ( !strcmp(s, "intpost") ) + else if ( !strncmp(s, "intpost", ss - s) ) iommu_intpost = val; - else if ( !strcmp(s, "debug") ) + else if ( !strncmp(s, "debug", ss - s) ) { iommu_debug = val; if ( val ) iommu_verbose = 1; } - else if ( !strcmp(s, "amd-iommu-perdev-intremap") ) + else if ( !strncmp(s, "amd-iommu-perdev-intremap", ss - s) ) amd_iommu_perdev_intremap = val; - else if ( !strcmp(s, "dom0-passthrough") ) + else if ( !strncmp(s, "dom0-passthrough", ss - s) ) iommu_passthrough = val; - else if ( !strcmp(s, "dom0-strict") ) + else if ( !strncmp(s, "dom0-strict", ss - s) ) iommu_dom0_strict = val; - else if ( !strcmp(s, "sharept") ) + else if ( !strncmp(s, "sharept", ss - s) ) iommu_hap_pt_share = val; + else + rc = -EINVAL; s = ss + 1; - } while ( ss ); + } while ( *ss ); + + return rc; } int iommu_domain_init(struct domain *d) -- 2.12.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |