mtd: nandsim: convert pages_written[] to bitmap
authorAkinobu Mita <akinobu.mita@gmail.com>
Sun, 28 Jul 2013 02:21:53 +0000 (11:21 +0900)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Mon, 5 Aug 2013 20:05:21 +0000 (21:05 +0100)
nandsim.pages_written[] is the array of unsigned char which is indexed
by the page number and used for identifying which pages have been written
when cache_file is used.  Each entry holds 0 (not written) or 1 (written),
so it can be converted to bitmap.  This reduces the allocation size of
pages_written[] by 1/8.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/nandsim.c

index cb38f3d94218b2c977437062f8f402d07941fd6c..a73dce0208164450cd679cb3a7a2a641f3dafef4 100644 (file)
@@ -363,7 +363,7 @@ struct nandsim {
 
        /* Fields needed when using a cache file */
        struct file *cfile; /* Open file */
-       unsigned char *pages_written; /* Which pages have been written */
+       unsigned long *pages_written; /* Which pages have been written */
        void *file_buf;
        struct page *held_pages[NS_MAX_HELD_PAGES];
        int held_cnt;
@@ -586,7 +586,8 @@ static int alloc_device(struct nandsim *ns)
                        err = -EINVAL;
                        goto err_close;
                }
-               ns->pages_written = vzalloc(ns->geom.pgnum);
+               ns->pages_written = vzalloc(BITS_TO_LONGS(ns->geom.pgnum) *
+                                           sizeof(unsigned long));
                if (!ns->pages_written) {
                        NS_ERR("alloc_device: unable to allocate pages written array\n");
                        err = -ENOMEM;
@@ -1479,7 +1480,7 @@ static void read_page(struct nandsim *ns, int num)
        union ns_mem *mypage;
 
        if (ns->cfile) {
-               if (!ns->pages_written[ns->regs.row]) {
+               if (!test_bit(ns->regs.row, ns->pages_written)) {
                        NS_DBG("read_page: page %d not written\n", ns->regs.row);
                        memset(ns->buf.byte, 0xFF, num);
                } else {
@@ -1525,9 +1526,9 @@ static void erase_sector(struct nandsim *ns)
 
        if (ns->cfile) {
                for (i = 0; i < ns->geom.pgsec; i++)
-                       if (ns->pages_written[ns->regs.row + i]) {
+                       if (__test_and_clear_bit(ns->regs.row + i,
+                                                ns->pages_written)) {
                                NS_DBG("erase_sector: freeing page %d\n", ns->regs.row + i);
-                               ns->pages_written[ns->regs.row + i] = 0;
                        }
                return;
        }
@@ -1560,7 +1561,7 @@ static int prog_page(struct nandsim *ns, int num)
                NS_DBG("prog_page: writing page %d\n", ns->regs.row);
                pg_off = ns->file_buf + ns->regs.column + ns->regs.off;
                off = (loff_t)ns->regs.row * ns->geom.pgszoob + ns->regs.column + ns->regs.off;
-               if (!ns->pages_written[ns->regs.row]) {
+               if (!test_bit(ns->regs.row, ns->pages_written)) {
                        all = 1;
                        memset(ns->file_buf, 0xff, ns->geom.pgszoob);
                } else {
@@ -1580,7 +1581,7 @@ static int prog_page(struct nandsim *ns, int num)
                                NS_ERR("prog_page: write error for page %d ret %ld\n", ns->regs.row, (long)tx);
                                return -1;
                        }
-                       ns->pages_written[ns->regs.row] = 1;
+                       __set_bit(ns->regs.row, ns->pages_written);
                } else {
                        tx = write_file(ns, ns->cfile, pg_off, num, off);
                        if (tx != num) {