On Wed, 23 Nov 2011 18:08:52 +0000, Pawel Moll <pawel.moll@xxxxxxx> wrote: > On Tue, 2011-11-22 at 00:44 +0000, Rusty Russell wrote: > > Or would it be simpler to enhance sscanf() with some weird format option > > for suffixing? I haven't looked for similar cases, but I'd suspect a > > big win in general. > > > > This would be neater than anything else we've got: > > if (sscanf(device, "%llu@%llu[KMG]:%u", ...) != 3 > > && sscanf(device, "%llu@%llu[KMG]:%u:%u", ...) != 4) > > return -EINVAL; > > sscanf was a good hint! Thanks, why haven't I thought of it myself? ;-) > > That's what I came up with: > > static int vm_cmdline_set(const char *device, > const struct kernel_param *kp) > { > struct resource resources[2] = {}; > char *str; > long long int base; > int processed, consumed = 0; > struct platform_device *pdev; > > resources[0].flags = IORESOURCE_MEM; > resources[1].flags = IORESOURCE_IRQ; > > resources[0].end = memparse(device, &str) - 1; > > processed = sscanf(str, "@%lli:%u%n:%d%n", > &base, &resources[1].start, &consumed, > &vm_cmdline_id, &consumed); > > if (processed < 2 || processed > 3 || str[consumed]) > return -EINVAL; > > resources[0].start = base; > resources[0].end += base; > resources[1].end = resources[1].start; > > The only bit missing from sscanf() would be some sort of "%m" format, > which behaved like memparse and also processed unsigned number with "0 > base" (hard to believe but the only "universal" - as in octal, dec and > hex - format is %i, which is signed). But still, looks quite neat > already :-) Yeah, something like %pK for kernel pointers in printk; you need a suffix so that gcc won't get upset. The "[KMG]" suffix hack was my poor suggestion... > I'll try to have a look at the "late parameters" idea tomorrow. Any > early warnings? Off the top of my head, this makes me think of the way initcalls are ordered. We could put a parameter parsing initcall at the start of each initcall level in include/asm-generic/vmlinux.lds.h's INITCALLS macro. Then we steal four bits from struct kernel_param's flags to indicate the level of the initcall (-1 == existing ones, otherwise N == before level N initcalls). Good luck! Rusty. _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization