From owner-freebsd-arch@FreeBSD.ORG Wed Jun 6 16:46:58 2007 Return-Path: X-Original-To: arch@freebsd.org Delivered-To: freebsd-arch@FreeBSD.ORG Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 7BC8F16A46C for ; Wed, 6 Jun 2007 16:46:58 +0000 (UTC) (envelope-from howard0su@gmail.com) Received: from py-out-1112.google.com (py-out-1112.google.com [64.233.166.176]) by mx1.freebsd.org (Postfix) with ESMTP id 1A05613C4B0 for ; Wed, 6 Jun 2007 16:46:57 +0000 (UTC) (envelope-from howard0su@gmail.com) Received: by py-out-1112.google.com with SMTP id a29so371614pyi for ; Wed, 06 Jun 2007 09:46:57 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:cc:mime-version:content-type:content-transfer-encoding:content-disposition; b=oF0Pnot81oUmHqHJ9ovZDX5PG7IqiO12Nm+bAwC96ngtq/cYEAjgccXZxwS7DGGutEnBzVIk1DoPs3f6dhaesk+k3HRET844oaZz9OfL/9H4K1RMSNcqbckZLPEk+dpwPDaCHVw1nyrDtS22g5ptUwhXM1Wox0MrnGWPS00ZbXU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:mime-version:content-type:content-transfer-encoding:content-disposition; b=haY3vRO7OYE2CHrVnuxFkF3FszEWi5AWrDboPTbYYXcQimthZToBqOyDu0Lb2OPee1anPi5r3wGbEJ6N9lSYygfcRwKDY12o3YYoDzwShEdx2MdudBjRBNhIJl9Qb1TFnCuhFGzQ/I4xwmplIypYqdqwezNuqRiW8KMA7cxoK7E= Received: by 10.35.71.1 with SMTP id y1mr1210488pyk.1181146690980; Wed, 06 Jun 2007 09:18:10 -0700 (PDT) Received: by 10.35.79.18 with HTTP; Wed, 6 Jun 2007 09:18:10 -0700 (PDT) Message-ID: Date: Thu, 7 Jun 2007 00:18:10 +0800 From: "Howard Su" To: arch@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Cc: alc@freebsd.org Subject: help on lock around vm_page X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Jun 2007 16:46:58 -0000 I want some helps from VM guru. I try to fix a panic in tmpfs. In order to push tmpfs into -Current, I really want some help to solve this. 1. we allocate an object from vm_pager_alloc(OBJT_SWAP, ...) when create a file. 2. the panic is during handling write op: a) find the first page we want to write b) call vm_page_grab to get the page from object. c) call use sf_buf_alloc to map it into kernel_map d) use uiomove to move the data e) mark page as dirty f) loop to a until all pages are handled. there is a race condition. while doing b-c & e, we hold the OBJ_LOCK/page_queue_lock. when doing d, we have to drop the locks to call uiomove. When calling uio move, the page may moved to cache queue since in that time it is not dirty. There is a solution that we allocate a page buffer. Before a), we uiomove it to the buffer and replace uiomove with a bcopy in d). Then, we can hold lock in b - e. I feel this will cause performance problem. For the detailed code, please check: http://perforce.freebsd.org/fileViewer.cgi?FSPC=//depot/user/howardsu/truss/sys/fs/tmpfs/tmpfs%5fvnops.c&REV=30 function: tmpfs_uio_xfer() Any idea to close this race condition? PS: If you can review my code about usage of vm, it will be appreciated. -- -Howard