From owner-freebsd-embedded@FreeBSD.ORG Mon Nov 18 11:06:47 2013 Return-Path: Delivered-To: freebsd-embedded@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id C2C38974 for ; Mon, 18 Nov 2013 11:06:47 +0000 (UTC) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B1DA6207E for ; Mon, 18 Nov 2013 11:06:47 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.7/8.14.7) with ESMTP id rAIB6l8P009000 for ; Mon, 18 Nov 2013 11:06:47 GMT (envelope-from owner-bugmaster@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.7/8.14.7/Submit) id rAIB6lgq008998 for freebsd-embedded@FreeBSD.org; Mon, 18 Nov 2013 11:06:47 GMT (envelope-from owner-bugmaster@FreeBSD.org) Date: Mon, 18 Nov 2013 11:06:47 GMT Message-Id: <201311181106.rAIB6lgq008998@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: gnats set sender to owner-bugmaster@FreeBSD.org using -f From: FreeBSD bugmaster To: freebsd-embedded@FreeBSD.org Subject: Current problem reports assigned to freebsd-embedded@FreeBSD.org X-BeenThere: freebsd-embedded@freebsd.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: Dedicated and Embedded Systems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Nov 2013 11:06:47 -0000 Note: to view an individual PR, use: http://www.freebsd.org/cgi/query-pr.cgi?pr=(number). The following is a listing of current problems submitted by FreeBSD users. These represent problem reports covering all versions including experimental development code and obsolete releases. S Tracker Resp. Description -------------------------------------------------------------------------------- o misc/52256 embedded [picobsd] picobsd build script does not read in user/s o kern/42728 embedded [picobsd] many problems in src/usr.sbin/ppp/* after c 2 problems total. From owner-freebsd-embedded@FreeBSD.ORG Mon Nov 18 15:14:37 2013 Return-Path: Delivered-To: freebsd-embedded@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id DC12ACD9 for ; Mon, 18 Nov 2013 15:14:37 +0000 (UTC) Received: from mail-ee0-f51.google.com (mail-ee0-f51.google.com [74.125.83.51]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 65A81212C for ; Mon, 18 Nov 2013 15:14:37 +0000 (UTC) Received: by mail-ee0-f51.google.com with SMTP id d41so1875371eek.10 for ; Mon, 18 Nov 2013 07:14:29 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:subject:from:to:date:content-type :mime-version; bh=bcq2TskCecjovJP6XAJ4V2wccjm6+GeVNmTtvE9lCTw=; b=KTVCCNQlk+rr/ZAk9krnU6hall1sXYOwD2HFzTImCy8QXU2Rgwujbcs7Lt95lY0cE0 iLH1anI3nnI2UUKj0jITgF+pq7+a2OV6AlzXto2wsGpD4XLgJurPkhBi7irQHeqbBm7b AfBG4BG9V85QnAQ6ZhMLW1jQe02RUVF3TFkqIHILubRZJKtVbK5OtbgQienhvlV7Ka3K xwMlboB2L9u+fcurJn4ytpXvnBuE3aBNBX/V6AkpaR42qXS09rdpFtpfAx7WymR1BNp7 LflI5HR3O6patZJiIqyHLV4CsOXHS6f8mWtbMWnFm3B3quL+Jjw/c9A71ANjpjhV6GGV aNbw== X-Gm-Message-State: ALoCoQklDoZwxXyHY2YEaP6I3DWzHY07iYAX3LerTZA0i94A/9q0K/HvR65Ue6pBh2zARTT6DiiI X-Received: by 10.14.115.8 with SMTP id d8mr196062eeh.135.1384787284570; Mon, 18 Nov 2013 07:08:04 -0800 (PST) Received: from [10.0.0.13] ([80.82.22.190]) by mx.google.com with ESMTPSA id h8sm38706056eew.16.2013.11.18.07.08.02 for (version=SSLv3 cipher=RC4-SHA bits=128/128); Mon, 18 Nov 2013 07:08:03 -0800 (PST) Message-ID: <1384787290.3934.14.camel@hp8.semihalf.com> Subject: nand_geom and nand_cdev fixes From: Grzegorz Bernacki To: freebsd-embedded@FreeBSD.org Date: Mon, 18 Nov 2013 16:08:10 +0100 Content-Type: multipart/mixed; boundary="=-Q0PV2kEuZ1OV08CGBS/Z" X-Mailer: Evolution 3.4.4-3 Mime-Version: 1.0 X-BeenThere: freebsd-embedded@freebsd.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: Dedicated and Embedded Systems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Nov 2013 15:14:37 -0000 --=-Q0PV2kEuZ1OV08CGBS/Z Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Hi, I've made two fixes in nand_geom.c and nand_cdev.c. First one is related to allocating internal buffer for reading/programming data. To avoid allocation of memory which is too big, I allocate buffer which has size of 16 pages and read/program data in ten-pages chunks. Second change is to skip copyout() when nand_read_pages_raw() fails. I've attached patch with these changes. Can I ask for test/review of these changes? thanks, grzesiek --=-Q0PV2kEuZ1OV08CGBS/Z Content-Disposition: attachment; filename="nand.diff" Content-Type: text/x-patch; name="nand.diff"; charset="UTF-8" Content-Transfer-Encoding: 7bit Index: sys/dev/nand/nand_cdev.c =================================================================== --- sys/dev/nand/nand_cdev.c (wersja 258161) +++ sys/dev/nand/nand_cdev.c (kopia robocza) @@ -294,19 +294,39 @@ struct thread *td) { struct nand_chip *chip; + struct chip_geom *cg; struct nand_oob_rw *oob_rw = NULL; struct nand_raw_rw *raw_rw = NULL; device_t nandbus; + size_t bufsize, len, raw_size; + off_t off; uint8_t *buf = NULL; int ret = 0; uint8_t status; chip = (struct nand_chip *)dev->si_drv1; + cg = &chip->chip_geom; nandbus = device_get_parent(chip->dev); if ((cmd == NAND_IO_RAW_READ) || (cmd == NAND_IO_RAW_PROG)) { raw_rw = (struct nand_raw_rw *)data; - buf = malloc(raw_rw->len, M_NAND, M_WAITOK); + raw_size = cg->pgs_per_blk * (cg->page_size + cg->oob_size); + + /* Check if len is not bigger than chip size*/ + if (raw_rw->len > raw_size) + return (EFBIG); + + /* + * Do not ask for too much memory, in case of large transfers + * read/write in 16-pages chunks + */ + bufsize = 16 * (cg->page_size + cg->oob_size); + if (raw_rw->len < bufsize) + bufsize = raw_rw->len; + + buf = malloc(bufsize, M_NAND, M_WAITOK); + len = raw_rw->len; + off = 0; } switch(cmd) { case NAND_IO_ERASE: @@ -335,19 +355,35 @@ break; case NAND_IO_RAW_PROG: - ret = copyin(raw_rw->data, buf, raw_rw->len); - if (ret) - break; - ret = nand_prog_pages_raw(chip, raw_rw->off, buf, - raw_rw->len); + while (len > 0) { + if (len < bufsize) + bufsize = len; + ret = copyin(raw_rw->data + off, buf, bufsize); + if (ret) + break; + ret = nand_prog_pages_raw(chip, raw_rw->off+off, buf, + bufsize); + if (ret) + break; + len -= bufsize; + off += bufsize; + } break; case NAND_IO_RAW_READ: - ret = nand_read_pages_raw(chip, raw_rw->off, buf, - raw_rw->len); - if (ret) - break; - ret = copyout(buf, raw_rw->data, raw_rw->len); + while (len > 0) { + if (len < bufsize) + bufsize = len; + + ret = nand_read_pages_raw(chip, raw_rw->off + off, buf, + bufsize); + if (ret == 0) + ret = copyout(buf, raw_rw->data + off, bufsize); + if (ret) + break; + len -= bufsize; + off += bufsize; + } break; case NAND_IO_PAGE_STAT: Index: sys/dev/nand/nand_geom.c =================================================================== --- sys/dev/nand/nand_geom.c (wersja 258161) +++ sys/dev/nand/nand_geom.c (kopia robocza) @@ -193,20 +193,41 @@ struct thread *td) { struct nand_chip *chip; + struct chip_geom *cg; struct nand_oob_rw *oob_rw = NULL; struct nand_raw_rw *raw_rw = NULL; device_t nandbus; + size_t bufsize, len, raw_size; + off_t off; uint8_t *buf = NULL; int ret = 0; uint8_t status; chip = (struct nand_chip *)ndisk->d_drv1; + cg = &chip->chip_geom; nandbus = device_get_parent(chip->dev); if ((cmd == NAND_IO_RAW_READ) || (cmd == NAND_IO_RAW_PROG)) { raw_rw = (struct nand_raw_rw *)data; - buf = malloc(raw_rw->len, M_NAND, M_WAITOK); + raw_size = cg->pgs_per_blk * (cg->page_size + cg->oob_size); + + /* Check if len is not bigger than chip size*/ + if (raw_rw->len > raw_size) + return (EFBIG); + + /* + * Do not ask for too much memory, in case of large transfers + * read/write in 16-pages chunks + */ + bufsize = 16 * (cg->page_size + cg->oob_size); + if (raw_rw->len < bufsize) + bufsize = raw_rw->len; + + buf = malloc(bufsize, M_NAND, M_WAITOK); + len = raw_rw->len; + off = 0; } + switch (cmd) { case NAND_IO_ERASE: ret = nand_erase_blocks(chip, ((off_t *)data)[0], @@ -234,15 +255,36 @@ break; case NAND_IO_RAW_PROG: - copyin(raw_rw->data, buf, raw_rw->len); - ret = nand_prog_pages_raw(chip, raw_rw->off, buf, - raw_rw->len); + while (len > 0) { + if (len < bufsize) + bufsize = len; + + ret = copyin(raw_rw->data + off, buf, bufsize); + if (ret) + break; + ret = nand_prog_pages_raw(chip, raw_rw->off+off, buf, + bufsize); + if (ret) + break; + len -= bufsize; + off += bufsize; + } break; case NAND_IO_RAW_READ: - ret = nand_read_pages_raw(chip, raw_rw->off, buf, - raw_rw->len); - copyout(buf, raw_rw->data, raw_rw->len); + while (len > 0) { + if (len < bufsize) + bufsize = len; + + ret = nand_read_pages_raw(chip, raw_rw->off + off, buf, + bufsize); + if (ret == 0) + ret = copyout(buf, raw_rw->data + off, bufsize); + if (ret) + break; + len -= bufsize; + off += bufsize; + } break; case NAND_IO_GET_CHIP_PARAM: --=-Q0PV2kEuZ1OV08CGBS/Z--