On Thu, Aug 25, 2011 at 1:25 AM, David Evensky <[email protected]> wrote:
> + if (*next == '\0')
> + p = next;
> + else
> + p = next + 1;
> + /* parse out size */
> + base = 10;
> + if (strcasestr(p, "0x"))
> + base = 16;
> + size = strtoll(p, &next, base);
> + if (next == p && size == 0) {
> + pr_info("shmem: no size specified, using default.");
> + size = default_size;
> + }
> + /* look for [KMGkmg][Bb]* uses base 2. */
> + int skip_B = 0;
> + if (strspn(next, "KMGkmg")) { /* might have a prefix */
> + if (*(next + 1) == 'B' || *(next + 1) == 'b')
> + skip_B = 1;
> + switch (*next) {
> + case 'K':
> + case 'k':
> + size = size << KB_SHIFT;
> + break;
> + case 'M':
> + case 'm':
> + size = size << MB_SHIFT;
> + break;
> + case 'G':
> + case 'g':
> + size = size << GB_SHIFT;
> + break;
> + default:
> + die("shmem: bug in detecting size prefix.");
> + break;
> + }
There's some nice code in perf to parse sizes like this. We could just
steal that.
> +inline void fill_mem(void *buf, size_t buf_size, char *fill, size_t fill_len)
> +{
> + size_t i;
> +
> + if (fill_len == 1) {
> + memset(buf, fill[0], buf_size);
> + } else {
> + if (buf_size > fill_len) {
> + for (i = 0; i < buf_size - fill_len; i += fill_len)
> + memcpy(((char *)buf) + i, fill, fill_len);
> + memcpy(buf + i, fill, buf_size - i);
> + } else {
> + memcpy(buf, fill, buf_size);
> + }
> + }
> +}
Can we do a memset_pattern4() type of interface instead? I think it's
mostly pointless to try to support arbitrary-length 'fill'.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html